diff options
Diffstat (limited to 'libc/pwd_grp/__getgrent.c')
-rw-r--r-- | libc/pwd_grp/__getgrent.c | 226 |
1 files changed, 123 insertions, 103 deletions
diff --git a/libc/pwd_grp/__getgrent.c b/libc/pwd_grp/__getgrent.c index 0827df131..e89f914ad 100644 --- a/libc/pwd_grp/__getgrent.c +++ b/libc/pwd_grp/__getgrent.c @@ -18,11 +18,22 @@ * */ +#include <features.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include "config.h" +#ifdef __UCLIBC_HAS_THREADS__ +#include <pthread.h> +static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; +# define LOCK pthread_mutex_lock(&mylock) +# define UNLOCK pthread_mutex_unlock(&mylock); +#else +# define LOCK +# define UNLOCK +#endif + /* * This is the core group-file read function. It behaves exactly like * getgrent() except that it is passed a file descriptor. getgrent() @@ -31,130 +42,139 @@ struct group *__getgrent(int grp_fd) { #ifdef GR_SCALE_DYNAMIC - static char *line_buff = NULL; - static char **members = NULL; - short line_index; - short buff_size; + static char *line_buff = NULL; + static char **members = NULL; + short line_index; + short buff_size; #else - static char line_buff[GR_MAX_LINE_LEN]; - static char *members[GR_MAX_MEMBERS]; + static char line_buff[GR_MAX_LINE_LEN]; + static char *members[GR_MAX_MEMBERS]; #endif - static struct group group; - register char *ptr; - char *field_begin; - short member_num; - char *endptr; - int line_len; + static struct group group; + register char *ptr; + char *field_begin; + short member_num; + char *endptr; + int line_len; - /* We use the restart label to handle malformatted lines */ - restart: + LOCK; + + /* We use the restart label to handle malformatted lines */ +restart: #ifdef GR_SCALE_DYNAMIC - line_index = 0; - buff_size = 256; + line_index = 0; + buff_size = 256; #endif #ifdef GR_SCALE_DYNAMIC - line_buff = realloc(line_buff, buff_size); - while (1) { - if ((line_len = read(grp_fd, line_buff + line_index, - buff_size - line_index)) <= 0) - return NULL; - field_begin = strchr(line_buff, '\n'); - if (field_begin != NULL) { - lseek(grp_fd, - (long) (1 + field_begin - - (line_len + line_index + line_buff)), SEEK_CUR); - *field_begin = '\0'; - if (*line_buff == '#' || *line_buff == ' ' - || *line_buff == '\n' || *line_buff == '\t') - goto restart; - break; - } else { /* Allocate some more space */ - - line_index = buff_size; - buff_size += 256; - line_buff = realloc(line_buff, buff_size); - } + line_buff = realloc(line_buff, buff_size); + while (1) { + if ((line_len = read(grp_fd, line_buff + line_index, + buff_size - line_index)) <= 0) { + UNLOCK; + return NULL; } -#else - /* Read the line into the static buffer */ - if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0) - return NULL; field_begin = strchr(line_buff, '\n'); - if (field_begin != NULL) - lseek(grp_fd, (long) (1 + field_begin - (line_buff + line_len)), - SEEK_CUR); - else { /* The line is too long - skip it :-\ */ - - do { - if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0) - return NULL; - } while (!(field_begin = strchr(line_buff, '\n'))); - lseek(grp_fd, (long) ((field_begin - line_buff) - line_len + 1), - SEEK_CUR); + if (field_begin != NULL) { + lseek(grp_fd, + (long) (1 + field_begin - + (line_len + line_index + line_buff)), SEEK_CUR); + *field_begin = '\0'; + if (*line_buff == '#' || *line_buff == ' ' + || *line_buff == '\n' || *line_buff == '\t') goto restart; + break; + } else { /* Allocate some more space */ + + line_index = buff_size; + buff_size += 256; + line_buff = realloc(line_buff, buff_size); } - if (*line_buff == '#' || *line_buff == ' ' || *line_buff == '\n' || - *line_buff == '\t') - goto restart; - *field_begin = '\0'; + } +#else + /* Read the line into the static buffer */ + if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0) { + UNLOCK; + return NULL; + } + field_begin = strchr(line_buff, '\n'); + if (field_begin != NULL) + lseek(grp_fd, (long) (1 + field_begin - (line_buff + line_len)), + SEEK_CUR); + else { /* The line is too long - skip it :-\ */ + + do { + if ((line_len = read(grp_fd, line_buff, GR_MAX_LINE_LEN)) <= 0) { + UNLOCK; + return NULL; + } + } while (!(field_begin = strchr(line_buff, '\n'))); + lseek(grp_fd, (long) ((field_begin - line_buff) - line_len + 1), + SEEK_CUR); + goto restart; + } + if (*line_buff == '#' || *line_buff == ' ' || *line_buff == '\n' || + *line_buff == '\t') + goto restart; + *field_begin = '\0'; #endif /* GR_SCALE_DYNAMIC */ - /* Now parse the line */ - group.gr_name = line_buff; - ptr = strchr(line_buff, ':'); - if (ptr == NULL) - goto restart; - *ptr++ = '\0'; + /* Now parse the line */ + group.gr_name = line_buff; + ptr = strchr(line_buff, ':'); + if (ptr == NULL) + goto restart; + *ptr++ = '\0'; - group.gr_passwd = ptr; - ptr = strchr(ptr, ':'); - if (ptr == NULL) - goto restart; - *ptr++ = '\0'; + group.gr_passwd = ptr; + ptr = strchr(ptr, ':'); + if (ptr == NULL) + goto restart; + *ptr++ = '\0'; - field_begin = ptr; - ptr = strchr(ptr, ':'); - if (ptr == NULL) - goto restart; - *ptr++ = '\0'; + field_begin = ptr; + ptr = strchr(ptr, ':'); + if (ptr == NULL) + goto restart; + *ptr++ = '\0'; - group.gr_gid = (gid_t) strtoul(field_begin, &endptr, 10); - if (*endptr != '\0') - goto restart; + group.gr_gid = (gid_t) strtoul(field_begin, &endptr, 10); + if (*endptr != '\0') + goto restart; - member_num = 0; - field_begin = ptr; + member_num = 0; + field_begin = ptr; #ifdef GR_SCALE_DYNAMIC - if (members != NULL) - free(members); - members = (char **) malloc((member_num + 1) * sizeof(char *)); - for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) { - if ((ptr = strchr(field_begin, ',')) != NULL) - *ptr++ = '\0'; - members[member_num++] = field_begin; - members = (char **) realloc(members, - (member_num + 1) * sizeof(char *)); - } - members[member_num] = NULL; + if (members != NULL) + free(members); + members = (char **) malloc((member_num + 1) * sizeof(char *)); + for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) { + if ((ptr = strchr(field_begin, ',')) != NULL) + *ptr++ = '\0'; + members[member_num++] = field_begin; + members = (char **) realloc(members, + (member_num + 1) * sizeof(char *)); + } + members[member_num] = NULL; #else - while ((ptr = strchr(ptr, ',')) != NULL) { - *ptr = '\0'; - ptr++; - members[member_num] = field_begin; - field_begin = ptr; - member_num++; - } - if (*field_begin == '\0') - members[member_num] = NULL; - else { - members[member_num] = field_begin; - members[member_num + 1] = NULL; - } + while ((ptr = strchr(ptr, ',')) != NULL) { + *ptr = '\0'; + ptr++; + members[member_num] = field_begin; + field_begin = ptr; + member_num++; + } + if (*field_begin == '\0') + members[member_num] = NULL; + else { + members[member_num] = field_begin; + members[member_num + 1] = NULL; + } #endif - group.gr_mem = members; - return &group; + group.gr_mem = members; + UNLOCK; + return &group; } |