|
@@ -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;
|
|
|
}
|