summaryrefslogtreecommitdiff
path: root/libc/pwd_grp/__getgrent.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/pwd_grp/__getgrent.c')
-rw-r--r--libc/pwd_grp/__getgrent.c226
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;
}