[BusyBox] Call for review for a last minute patch

Erik Andersen andersen at lineo.com
Fri Jan 26 23:31:26 UTC 2001


I've been meaning to do this patch for a _long_ time, so I just sat down and
did it.  Since everything else seems to be working and ready to go, I wanted to
get some extra eyeballs to look over this patch and check that it works as
expected.  When enabled it increases binary size by just 1.4k.  When disabled
it has virtually no effect on binary size (except that then, busybox uses the
system NSS libraries for accessing password and group information).

Please check this out.  Assuming all looks ok I will apply it and release 0.49.
Thanks for your patience,

 -Erik

--
Erik B. Andersen   email:  andersen at lineo.com
--This message was written using 73% post-consumer electrons--
-------------- next part --------------
diff -urN busybox/Makefile busybox-0.49pre/Makefile
--- busybox/Makefile	Wed Jan 24 16:53:43 2001
+++ busybox-0.49pre/Makefile	Fri Jan 26 13:50:07 2001
@@ -42,6 +42,17 @@
 # Do not enable this for production builds...
 DODEBUG = false
 
+# Setting this to `true' will cause busybox to directly use the system's
+# password and group functions.  Assuming you use GNU libc, when this is
+# `true', you will need to install the /etc/nsswitch.conf configuration file
+# and the required libnss_* libraries. This generally makes your embedded
+# system quite a bit larger... If you leave this off, busybox will directly
+# use the /etc/password, /etc/group files (and your system will be smaller, and
+# I will get fewer emails asking about how glibc NSS works).  Enabling this adds
+# just 1.5k to the binary size (which is a _lot_ less then glibc NSS costs),
+# Most people will want to leave this set to false.
+USE_SYSTEM_PWD_GRP = false
+
 # This enables compiling with dmalloc ( http://dmalloc.com/ )
 # which is an excellent public domain mem leak and malloc problem
 # detector.  To enable dmalloc, before running busybox you will
@@ -158,10 +169,20 @@
     CFLAGS += -DINIT_SCRIPT='"$(BB_INIT_SCRIPT)"'
 endif
 
+ifneq ($(USE_SYSTEM_PWD_GRP),true)
+    PWD_LIB   = pwd_grp/libpwd.a
+    LIBRARIES += $(PWD_LIB)
+else
+    CFLAGS    += -DUSE_SYSTEM_PWD_GRP
+endif
+
+
 # Put user-supplied flags at the end, where they
 # have a chance of winning.
 CFLAGS += $(CFLAGS_EXTRA)
 
+.EXPORT_ALL_VARIABLES:
+
 all: busybox busybox.links doc
 
 doc: olddoc
@@ -220,15 +241,20 @@
 
 
 
-busybox: $(OBJECTS) 
+busybox: $(PWD_LIB) $(OBJECTS) 
 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBRARIES)
 	$(STRIP)
 
+$(PWD_LIB):
+	$(MAKE) -eC pwd_grp
+
 busybox.links: Config.h applets.h
 	- $(BB_SRC_DIR)/busybox.mkll $(CONFIG_H) $(BB_SRC_DIR)/applets.h >$@
 
 nfsmount.o cmdedit.o: %.o: %.h
 $(OBJECTS): %.o: %.c Config.h busybox.h applets.h Makefile
+	$(CC) $(CFLAGS) -c $*.c -o $*.o
+	$(STRIPTOOL) -x -R .note -R .comment $*.o
 
 utility.o: loop.h
 
@@ -240,6 +266,7 @@
 
 clean:
 	- cd tests && $(MAKE) clean
+	- cd pwd_grp && $(MAKE) clean
 	- rm -f docs/BusyBox.txt docs/BusyBox.1 docs/BusyBox.html \
 	    docs/busybox.net/BusyBox.html
 	- rm -f docs/busybox.txt docs/busybox.dvi docs/busybox.ps \
diff -urN busybox/busybox.h busybox-0.49pre/busybox.h
--- busybox/busybox.h	Thu Jan 25 16:49:08 2001
+++ busybox-0.49pre/busybox.h	Fri Jan 26 15:31:55 2001
@@ -39,6 +39,8 @@
 /* for the _syscall() macros */
 #include <sys/syscall.h>
 #include <linux/unistd.h>
+#include "pwd_grp/pwd.h"
+#include "pwd_grp/grp.h"
 
 #ifdef DMALLOC
 #include "dmalloc.h"
diff -urN busybox/chmod_chown_chgrp.c busybox-0.49pre/chmod_chown_chgrp.c
--- busybox/chmod_chown_chgrp.c	Thu Dec  7 12:56:48 2000
+++ busybox-0.49pre/chmod_chown_chgrp.c	Fri Jan 26 15:51:03 2001
@@ -29,8 +29,6 @@
 #include "messages.c"
 
 #include <stdio.h>
-#include <grp.h>
-#include <pwd.h>
 
 
 static long uid = -1;
diff -urN busybox/cmdedit.c busybox-0.49pre/cmdedit.c
--- busybox/cmdedit.c	Fri Jan 26 13:42:23 2001
+++ busybox-0.49pre/cmdedit.c	Fri Jan 26 16:12:06 2001
@@ -54,10 +54,6 @@
 #include <sys/stat.h>
 #endif
 
-#ifdef BB_FEATURE_USERNAME_COMPLETION
-#include <pwd.h>
-#endif
-
 static const int MAX_HISTORY = 15;		/* Maximum length of the linked list for the command line history */
 
 enum {
diff -urN busybox/id.c busybox-0.49pre/id.c
--- busybox/id.c	Wed Jan 24 22:12:02 2001
+++ busybox-0.49pre/id.c	Fri Jan 26 15:51:42 2001
@@ -23,8 +23,6 @@
 #include "busybox.h"
 #include <stdio.h>
 #include <unistd.h>
-#include <pwd.h>
-#include <grp.h>
 #include <getopt.h>
 #include <sys/types.h>
 
diff -urN busybox/pwd_grp/.indent.pro busybox-0.49pre/pwd_grp/.indent.pro
--- busybox/pwd_grp/.indent.pro	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/.indent.pro	Fri Jan 26 15:59:53 2001
@@ -0,0 +1,33 @@
+--blank-lines-after-declarations
+--blank-lines-after-procedures
+--break-before-boolean-operator
+--no-blank-lines-after-commas
+--braces-on-if-line
+--braces-on-struct-decl-line
+--comment-indentation25
+--declaration-comment-column25
+--no-comment-delimiters-on-blank-lines
+--cuddle-else
+--continuation-indentation4
+--case-indentation0
+--else-endif-column33
+--space-after-cast
+--line-comments-indentation0
+--declaration-indentation1
+--dont-format-first-column-comments
+--dont-format-comments
+--honour-newlines
+--indent-level4
+/* changed from 0 to 4 */
+--parameter-indentation4
+--line-length78 /* changed from 75 */
+--continue-at-parentheses
+--no-space-after-function-call-names
+--dont-break-procedure-type
+--dont-star-comments
+--leave-optional-blank-lines
+--dont-space-special-semicolon
+--tab-size4
+/* additions by Mark */
+--case-brace-indentation0
+--leave-preprocessor-space
diff -urN busybox/pwd_grp/Makefile busybox-0.49pre/pwd_grp/Makefile
--- busybox/pwd_grp/Makefile	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/Makefile	Fri Jan 26 16:05:20 2001
@@ -0,0 +1,49 @@
+# Makefile for uClibc pwd_grp
+#
+# Copyright (C) 2000 by Lineo, inc.
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Library General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Library General Public License
+# along with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Derived in part from the Linux-8086 C library, the GNU C Library, and several
+# other sundry sources.  Files within this library are copyright by their
+# respective copyright holders.
+
+
+LIBPWD=libpwd.a
+
+CSRC=__getpwent.c pwent.c getpwnam.c getpwuid.c putpwent.c getpw.c \
+	fgetpwent.c __getgrent.c grent.c getgrnam.c getgrgid.c fgetgrent.c \
+	initgroups.c setgroups.c
+COBJS=$(patsubst %.c,%.o, $(CSRC))
+OBJS=$(COBJS)
+
+all: $(OBJS) $(LIBPWD)
+
+$(LIBPWD): ar-target
+
+ar-target: $(OBJS)
+	$(AR) $(ARFLAGS) $(LIBPWD) $(OBJS)
+
+$(COBJS):
+	$(CC) $(CFLAGS) $< -c $*.c -o $*.o
+	$(STRIPTOOL) -x -R .note -R .comment $*.o
+
+$(OBJ): Makefile
+
+__getgrent.c: config.h
+initgroups.c: config.h
+
+clean:
+	rm -f *.[oa] *~ core
diff -urN busybox/pwd_grp/__getgrent.c busybox-0.49pre/pwd_grp/__getgrent.c
--- busybox/pwd_grp/__getgrent.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/__getgrent.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,172 @@
+/*
+ * __getgrent.c - This file is part of the libc-8086/grp package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include "grp.h"
+#include "config.h"
+
+/*
+ * This is the core group-file read function.  It behaves exactly like
+ * getgrent() except that it is passed a file descriptor.  getgrent()
+ * is just a wrapper for this function.
+ */
+struct group *__getgrent(int grp_fd)
+{
+#ifndef GR_SCALE_DYNAMIC
+	static char line_buff[GR_MAX_LINE_LEN];
+	static char *members[GR_MAX_MEMBERS];
+#else
+	static char *line_buff = NULL;
+	static char **members = NULL;
+	short line_index;
+	short buff_size;
+#endif
+	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:
+#ifdef GR_SCALE_DYNAMIC
+	line_index = 0;
+	buff_size = 256;
+#endif
+
+#ifndef GR_SCALE_DYNAMIC
+	/* 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);
+		goto restart;
+	}
+	if (*line_buff == '#' || *line_buff == ' ' || *line_buff == '\n' ||
+		*line_buff == '\t')
+		goto restart;
+	*field_begin = '\0';
+
+#else							/* !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);
+		}
+	}
+#endif							/* GR_SCALE_DYNAMIC */
+
+	/* 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';
+
+	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;
+
+	member_num = 0;
+	field_begin = ptr;
+
+#ifndef GR_SCALE_DYNAMIC
+	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;
+	}
+#else							/* !GR_SCALE_DYNAMIC */
+	if (members != NULL)
+		free(members);
+	members = (char **) malloc(1 * sizeof(char *));
+
+	while ((ptr = strchr(ptr, ',')) != NULL) {
+		*ptr = '\0';
+		ptr++;
+		members[member_num] = field_begin;
+		field_begin = ptr;
+		member_num++;
+		members =
+			(char **) realloc((void *) members,
+
+							  (member_num + 1) * sizeof(char *));
+	}
+	if (*field_begin == '\0')
+		members[member_num] = NULL;
+	else {
+		members[member_num] = field_begin;
+		members[member_num + 1] = NULL;
+	}
+#endif							/* GR_SCALE_DYNAMIC */
+
+	group.gr_mem = members;
+	return &group;
+}
diff -urN busybox/pwd_grp/__getpwent.c busybox-0.49pre/pwd_grp/__getpwent.c
--- busybox/pwd_grp/__getpwent.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/__getpwent.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,113 @@
+/*
+ * __getpwent.c - This file is part of the libc-8086/pwd package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include "pwd.h"
+
+#define PWD_BUFFER_SIZE 256
+
+/* This isn't as flash as my previous version -- it doesn't dynamically
+  scale down the gecos on too-long lines, but it also makes fewer syscalls,
+  so it's probably nicer.  Write me if you want the old version.  Maybe I
+  should include it as a build-time option... ?
+  -Nat <ndf at linux.mit.edu> */
+
+struct passwd *__getpwent(int pwd_fd)
+{
+	static char line_buff[PWD_BUFFER_SIZE];
+	static struct passwd passwd;
+	char *field_begin;
+	char *endptr;
+	char *gid_ptr=NULL;
+	char *uid_ptr=NULL;
+	int line_len;
+	int i;
+
+	/* We use the restart label to handle malformatted lines */
+  restart:
+	/* Read the passwd line into the static buffer using a minimal of
+	   syscalls. */
+	if ((line_len = read(pwd_fd, line_buff, PWD_BUFFER_SIZE)) <= 0)
+		return NULL;
+	field_begin = strchr(line_buff, '\n');
+	if (field_begin != NULL)
+		lseek(pwd_fd, (long) (1 + field_begin - (line_buff + line_len)),
+			  SEEK_CUR);
+	else {						/* The line is too long - skip it. :-\ */
+
+		do {
+			if ((line_len = read(pwd_fd, line_buff, PWD_BUFFER_SIZE)) <= 0)
+				return NULL;
+		} while (!(field_begin = strchr(line_buff, '\n')));
+		lseek(pwd_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';
+
+	/* We've read the line; now parse it. */
+	field_begin = line_buff;
+	for (i = 0; i < 7; i++) {
+		switch (i) {
+		case 0:
+			passwd.pw_name = field_begin;
+			break;
+		case 1:
+			passwd.pw_passwd = field_begin;
+			break;
+		case 2:
+			uid_ptr = field_begin;
+			break;
+		case 3:
+			gid_ptr = field_begin;
+			break;
+		case 4:
+			passwd.pw_gecos = field_begin;
+			break;
+		case 5:
+			passwd.pw_dir = field_begin;
+			break;
+		case 6:
+			passwd.pw_shell = field_begin;
+			break;
+		}
+		if (i < 6) {
+			field_begin = strchr(field_begin, ':');
+			if (field_begin == NULL)
+				goto restart;
+			*field_begin++ = '\0';
+		}
+	}
+	passwd.pw_gid = (gid_t) strtoul(gid_ptr, &endptr, 10);
+	if (*endptr != '\0')
+		goto restart;
+
+	passwd.pw_uid = (uid_t) strtoul(uid_ptr, &endptr, 10);
+	if (*endptr != '\0')
+		goto restart;
+
+	return &passwd;
+}
diff -urN busybox/pwd_grp/config.h busybox-0.49pre/pwd_grp/config.h
--- busybox/pwd_grp/config.h	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/config.h	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,65 @@
+/*
+ * config.h - This file is part of the libc-8086/grp package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+
+#ifndef _CONFIG_GRP_H
+#define _CONFIG_GRP_H
+
+/*
+ * Define GR_SCALE_DYNAMIC if you want grp to dynamically scale its read buffer
+ * so that lines of any length can be used.  On very very small systems,
+ * you may want to leave this undefined becasue it will make the grp functions
+ * somewhat larger (because of the inclusion of malloc and the code necessary).
+ * On larger systems, you will want to define this, because grp will _not_
+ * deal with long lines gracefully (they will be skipped).
+ */
+#undef GR_SCALE_DYNAMIC
+
+#ifndef GR_SCALE_DYNAMIC
+/*
+ * If scaling is not dynamic, the buffers will be statically allocated, and
+ * maximums must be chosen.  GR_MAX_LINE_LEN is the maximum number of
+ * characters per line in the group file.  GR_MAX_MEMBERS is the maximum
+ * number of members of any given group.
+ */
+#define GR_MAX_LINE_LEN 128
+/* GR_MAX_MEMBERS = (GR_MAX_LINE_LEN-(24+3+6))/9 */
+#define GR_MAX_MEMBERS 11
+
+#endif /* !GR_SCALE_DYNAMIC */
+
+
+/*
+ * Define GR_DYNAMIC_GROUP_LIST to make initgroups() dynamically allocate
+ * space for it's GID array before calling setgroups().  This is probably
+ * unnecessary scalage, so it's undefined by default.
+ */
+#undef GR_DYNAMIC_GROUP_LIST
+
+#ifndef GR_DYNAMIC_GROUP_LIST
+/*
+ * GR_MAX_GROUPS is the size of the static array initgroups() uses for
+ * its static GID array if GR_DYNAMIC_GROUP_LIST isn't defined.
+ */
+#define GR_MAX_GROUPS 64
+
+#endif /* !GR_DYNAMIC_GROUP_LIST */
+
+#endif /* !_CONFIG_GRP_H */
diff -urN busybox/pwd_grp/fgetgrent.c busybox-0.49pre/pwd_grp/fgetgrent.c
--- busybox/pwd_grp/fgetgrent.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/fgetgrent.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,33 @@
+/*
+ * fgetgrent.c - This file is part of the libc-8086/grp package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include "grp.h"
+
+struct group *fgetgrent(FILE * file)
+{
+	if (file == NULL) {
+		errno = EINTR;
+		return NULL;
+	}
+
+	return __getgrent(fileno(file));
+}
diff -urN busybox/pwd_grp/fgetpwent.c busybox-0.49pre/pwd_grp/fgetpwent.c
--- busybox/pwd_grp/fgetpwent.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/fgetpwent.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,33 @@
+/*
+ * fgetpwent.c - This file is part of the libc-8086/pwd package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include "pwd.h"
+
+struct passwd *fgetpwent(FILE * file)
+{
+	if (file == NULL) {
+		errno = EINTR;
+		return NULL;
+	}
+
+	return __getpwent(fileno(file));
+}
diff -urN busybox/pwd_grp/getgrgid.c busybox-0.49pre/pwd_grp/getgrgid.c
--- busybox/pwd_grp/getgrgid.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/getgrgid.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,42 @@
+/*
+ * getgrgid.c - This file is part of the libc-8086/grp package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "grp.h"
+
+struct group *getgrgid(const gid_t gid)
+{
+	struct group *group;
+	int grp_fd;
+
+	if ((grp_fd = open("/etc/group", O_RDONLY)) < 0)
+		return NULL;
+
+	while ((group = __getgrent(grp_fd)) != NULL)
+		if (group->gr_gid == gid) {
+			close(grp_fd);
+			return group;
+		}
+
+	close(grp_fd);
+	return NULL;
+}
diff -urN busybox/pwd_grp/getgrnam.c busybox-0.49pre/pwd_grp/getgrnam.c
--- busybox/pwd_grp/getgrnam.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/getgrnam.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,48 @@
+/*
+ * getgrnam.c - This file is part of the libc-8086/grp package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "grp.h"
+
+struct group *getgrnam(const char *name)
+{
+	int grp_fd;
+	struct group *group;
+
+	if (name == NULL) {
+		errno = EINVAL;
+		return NULL;
+	}
+
+	if ((grp_fd = open("/etc/group", O_RDONLY)) < 0)
+		return NULL;
+
+	while ((group = __getgrent(grp_fd)) != NULL)
+		if (!strcmp(group->gr_name, name)) {
+			close(grp_fd);
+			return group;
+		}
+
+	close(grp_fd);
+	return NULL;
+}
diff -urN busybox/pwd_grp/getpw.c busybox-0.49pre/pwd_grp/getpw.c
--- busybox/pwd_grp/getpw.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/getpw.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,45 @@
+/*
+ * getpw.c - This file is part of the libc-8086/pwd package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <sys/types.h>
+#include <errno.h>
+#include <stdio.h>
+#include "pwd.h"
+
+int getpw(uid_t uid, char *buf)
+{
+	struct passwd *passwd;
+
+	if (buf == NULL) {
+		errno = EINVAL;
+		return -1;
+	}
+	if ((passwd = getpwuid(uid)) == NULL)
+		return -1;
+
+	if (sprintf (buf, "%s:%s:%u:%u:%s:%s:%s", passwd->pw_name, passwd->pw_passwd,
+		 passwd->pw_gid, passwd->pw_uid, passwd->pw_gecos, passwd->pw_dir,
+		 passwd->pw_shell) < 0) {
+		errno = ENOBUFS;
+		return -1;
+	}
+
+	return 0;
+}
diff -urN busybox/pwd_grp/getpwnam.c busybox-0.49pre/pwd_grp/getpwnam.c
--- busybox/pwd_grp/getpwnam.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/getpwnam.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,49 @@
+/*
+ * getpwnam.c - This file is part of the libc-8086/pwd package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "pwd.h"
+
+
+struct passwd *getpwnam(const char *name)
+{
+	int passwd_fd;
+	struct passwd *passwd;
+
+	if (name == NULL) {
+		errno = EINVAL;
+		return NULL;
+	}
+
+	if ((passwd_fd = open("/etc/passwd", O_RDONLY)) < 0)
+		return NULL;
+
+	while ((passwd = __getpwent(passwd_fd)) != NULL)
+		if (!strcmp(passwd->pw_name, name)) {
+			close(passwd_fd);
+			return passwd;
+		}
+
+	close(passwd_fd);
+	return NULL;
+}
diff -urN busybox/pwd_grp/getpwuid.c busybox-0.49pre/pwd_grp/getpwuid.c
--- busybox/pwd_grp/getpwuid.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/getpwuid.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,42 @@
+/*
+ * getpwuid.c - This file is part of the libc-8086/pwd package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "pwd.h"
+
+struct passwd *getpwuid(uid_t uid)
+{
+	int passwd_fd;
+	struct passwd *passwd;
+
+	if ((passwd_fd = open("/etc/passwd", O_RDONLY)) < 0)
+		return NULL;
+
+	while ((passwd = __getpwent(passwd_fd)) != NULL)
+		if (passwd->pw_uid == uid) {
+			close(passwd_fd);
+			return passwd;
+		}
+
+	close(passwd_fd);
+	return NULL;
+}
diff -urN busybox/pwd_grp/grent.c busybox-0.49pre/pwd_grp/grent.c
--- busybox/pwd_grp/grent.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/grent.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,52 @@
+/*
+ * grent.c - This file is part of the libc-8086/grp package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * setgrent(), endgrent(), and getgrent() are mutually-dependent functions,
+ * so they are all included in the same object file, and thus all linked
+ * in together.
+ */
+
+#include <unistd.h>
+#include <fcntl.h>
+#include "grp.h"
+
+static int grp_fd = -1;
+
+void setgrent(void)
+{
+	if (grp_fd != -1)
+		close(grp_fd);
+	grp_fd = open("/etc/group", O_RDONLY);
+}
+
+void endgrent(void)
+{
+	if (grp_fd != -1)
+		close(grp_fd);
+	grp_fd = -1;
+}
+
+struct group *getgrent(void)
+{
+	if (grp_fd == -1)
+		return NULL;
+	return __getgrent(grp_fd);
+}
diff -urN busybox/pwd_grp/grp.h busybox-0.49pre/pwd_grp/grp.h
--- busybox/pwd_grp/grp.h	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/grp.h	Fri Jan 26 16:06:11 2001
@@ -0,0 +1,37 @@
+#ifndef	__BB_GRP_H
+#define	__BB_GRP_H
+
+#if defined USE_SYSTEM_PWD_GRP
+#include <grp.h>
+#else
+
+#include <sys/types.h>
+#include <features.h>
+#include <stdio.h>
+
+/* The group structure */
+struct group
+{
+  char *gr_name;		/* Group name.	*/
+  char *gr_passwd;		/* Password.	*/
+  gid_t gr_gid;			/* Group ID.	*/
+  char **gr_mem;		/* Member list.	*/
+};
+
+extern void setgrent __P ((void));
+extern void endgrent __P ((void));
+extern struct group * getgrent __P ((void));
+
+extern struct group * getgrgid __P ((__const gid_t gid));
+extern struct group * getgrnam __P ((__const char * name));
+
+extern struct group * fgetgrent __P ((FILE * file));
+
+extern int setgroups __P ((size_t n, __const gid_t * groups));
+extern int initgroups __P ((__const char * user, gid_t gid));
+
+extern struct group * __getgrent __P ((int grp_fd));
+
+#endif /* USE_SYSTEM_PWD_GRP */
+#endif /* __BB_GRP_H */
+
diff -urN busybox/pwd_grp/initgroups.c busybox-0.49pre/pwd_grp/initgroups.c
--- busybox/pwd_grp/initgroups.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/initgroups.c	Fri Jan 26 16:09:20 2001
@@ -0,0 +1,74 @@
+/*
+ * initgroups.c - This file is part of the libc-8086/grp package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include "grp.h"
+#include "config.h"
+
+int initgroups(__const char *user, gid_t gid)
+{
+	register struct group *group;
+
+#ifndef GR_DYNAMIC_GROUP_LIST
+	gid_t group_list[GR_MAX_GROUPS];
+#else
+	gid_t *group_list = NULL;
+#endif
+	register char **tmp_mem;
+	int num_groups;
+	int grp_fd;
+
+
+	if ((grp_fd = open("/etc/group", O_RDONLY)) < 0)
+		return -1;
+
+	num_groups = 0;
+#ifdef GR_DYNAMIC_GROUP_LIST
+	group_list = (gid_t *) realloc(group_list, 1);
+#endif
+	group_list[num_groups] = gid;
+#ifndef GR_DYNAMIC_GROUP_LIST
+	while (num_groups < GR_MAX_GROUPS &&
+		   (group = __getgrent(grp_fd)) != NULL)
+#else
+	while ((group = __getgrent(grp_fd)) != NULL)
+#endif
+	{
+		if (group->gr_gid != gid);
+		{
+			tmp_mem = group->gr_mem;
+			while (*tmp_mem != NULL) {
+				if (!strcmp(*tmp_mem, user)) {
+					num_groups++;
+#ifdef GR_DYNAMIC_GROUP_LIST
+					group_list = (gid_t *) realloc(group_list, num_groups *
+						sizeof(gid_t *));
+#endif
+					group_list[num_groups] = group->gr_gid;
+				}
+				tmp_mem++;
+			}
+		}
+	}
+	close(grp_fd);
+	return setgroups(num_groups, group_list);
+}
diff -urN busybox/pwd_grp/putpwent.c busybox-0.49pre/pwd_grp/putpwent.c
--- busybox/pwd_grp/putpwent.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/putpwent.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,37 @@
+/*
+ * putpwent.c - This file is part of the libc-8086/pwd package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include "pwd.h"
+
+int putpwent(const struct passwd *passwd, FILE * f)
+{
+	if (passwd == NULL || f == NULL) {
+		errno = EINVAL;
+		return -1;
+	}
+	if (fprintf (f, "%s:%s:%u:%u:%s:%s:%s\n", passwd->pw_name, passwd->pw_passwd,
+		 passwd->pw_gid, passwd->pw_uid, passwd->pw_gecos, passwd->pw_dir,
+		 passwd->pw_shell) < 0)
+		return -1;
+
+	return 0;
+}
diff -urN busybox/pwd_grp/pwd.h busybox-0.49pre/pwd_grp/pwd.h
--- busybox/pwd_grp/pwd.h	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/pwd.h	Fri Jan 26 16:06:02 2001
@@ -0,0 +1,40 @@
+#ifndef	__BB_PWD_H
+#define	__BB_PWD_H
+
+#if defined USE_SYSTEM_PWD_GRP
+#include <pwd.h>
+#else
+
+#include <sys/types.h>
+#include <features.h>
+#include <stdio.h>
+
+/* The passwd structure.  */
+struct passwd
+{
+  char *pw_name;		/* Username.  */
+  char *pw_passwd;		/* Password.  */
+  uid_t pw_uid;			/* User ID.  */
+  gid_t pw_gid;			/* Group ID.  */
+  char *pw_gecos;		/* Real name.  */
+  char *pw_dir;			/* Home directory.  */
+  char *pw_shell;		/* Shell program.  */
+};
+
+extern void setpwent __P ((void));
+extern void endpwent __P ((void));
+extern struct passwd * getpwent __P ((void));
+
+extern int putpwent __P ((__const struct passwd * __p, FILE * __f));
+extern int getpw __P ((uid_t uid, char *buf));
+
+extern struct passwd * fgetpwent __P ((FILE * file));
+
+extern struct passwd * getpwuid __P ((__const uid_t));
+extern struct passwd * getpwnam __P ((__const char *));
+
+extern struct passwd * __getpwent __P ((__const int passwd_fd));
+
+#endif /* USE_SYSTEM_PWD_GRP */
+#endif /* __BB_PWD_H  */
+
diff -urN busybox/pwd_grp/pwent.c busybox-0.49pre/pwd_grp/pwent.c
--- busybox/pwd_grp/pwent.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/pwent.c	Fri Jan 26 16:05:15 2001
@@ -0,0 +1,56 @@
+/*
+ * pwent.c - This file is part of the libc-8086/pwd package for ELKS,
+ * Copyright (C) 1995, 1996 Nat Friedman <ndf at linux.mit.edu>.
+ * 
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "pwd.h"
+#include <fcntl.h>
+
+/*
+ * setpwent(), endpwent(), and getpwent() are included in the same object
+ * file, since one cannot be used without the other two, so it makes sense to
+ * link them all in together.
+ */
+
+/* file descriptor for the password file currently open */
+static int pw_fd = -1;
+
+void setpwent(void)
+{
+	if (pw_fd != -1)
+		close(pw_fd);
+
+	pw_fd = open("/etc/passwd", O_RDONLY);
+}
+
+void endpwent(void)
+{
+	if (pw_fd != -1)
+		close(pw_fd);
+	pw_fd = -1;
+}
+
+struct passwd *getpwent(void)
+{
+	if (pw_fd != -1)
+		return (__getpwent(pw_fd));
+	return NULL;
+}
diff -urN busybox/pwd_grp/setgroups.c busybox-0.49pre/pwd_grp/setgroups.c
--- busybox/pwd_grp/setgroups.c	Wed Dec 31 17:00:00 1969
+++ busybox-0.49pre/pwd_grp/setgroups.c	Fri Jan 26 16:09:08 2001
@@ -0,0 +1,34 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Taken from the set of syscalls for uClibc
+ *
+ * Copyright (C) 2000 by Lineo, inc.  Written by Erik Andersen
+ * <andersen at lineo.com>, <andersee at debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <features.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <asm/unistd.h>
+#include "grp.h"
+
+//#define __NR_setgroups        81
+_syscall2(int,setgroups, size_t, size, const gid_t *, list);
+
diff -urN busybox/utility.c busybox-0.49pre/utility.c
--- busybox/utility.c	Wed Jan 24 17:53:46 2001
+++ busybox-0.49pre/utility.c	Fri Jan 26 15:54:45 2001
@@ -856,117 +856,72 @@
 #if defined BB_CHMOD_CHOWN_CHGRP || defined BB_PS || defined BB_LS \
  || defined BB_TAR || defined BB_ID || defined BB_LOGGER \
  || defined BB_LOGNAME || defined BB_WHOAMI || defined BB_SH
-
-/* This parses entries in /etc/passwd and /etc/group.  This is desirable
- * for BusyBox, since we want to avoid using the glibc NSS stuff, which
- * increases target size and is often not needed or wanted for embedded
- * systems.
- *
- * /etc/passwd entries look like this: 
- *		root:x:0:0:root:/root:/bin/bash
- * and /etc/group entries look like this: 
- *		root:x:0:
- *
- * This uses buf as storage to hold things.
- * 
- */
-unsigned long my_getid(const char *filename, char *name, long id, long *gid)
-{
-	FILE *file;
-	char *rname, *start, *end, buf[128];
-	long rid;
-	long rgid = 0;
-
-	file = fopen(filename, "r");
-	if (file == NULL) {
-		/* Do not complain.  It is ok for /etc/passwd and
-		 * friends to be missing... */
-		return (-1);
-	}
-
-	while (fgets(buf, 128, file) != NULL) {
-		if (buf[0] == '#')
-			continue;
-
-		/* username/group name */
-		start = buf;
-		end = strchr(start, ':');
-		if (end == NULL)
-			continue;
-		*end = '\0';
-		rname = start;
-
-		/* password */
-		start = end + 1;
-		end = strchr(start, ':');
-		if (end == NULL)
-			continue;
-
-		/* uid in passwd, gid in group */
-		start = end + 1;
-		rid = (unsigned long) strtol(start, &end, 10);
-		if (end == start)
-			continue;
-
-		/* gid in passwd */
-		start = end + 1;
-		rgid = (unsigned long) strtol(start, &end, 10);
-		
-		if (name) {
-			if (0 == strcmp(rname, name)) {
-			    if (gid) *gid = rgid;
-				fclose(file);
-				return (rid);
-			}
-		}
-		if (id != -1 && id == rid) {
-			strncpy(name, rname, 8);
-			name[8]='\0';
-			if (gid) *gid = rgid;
-			fclose(file);
-			return (TRUE);
-		}
-	}
-	fclose(file);
-	return (-1);
-}
-
 /* returns a uid given a username */
 long my_getpwnam(char *name)
 {
-	return my_getid("/etc/passwd", name, -1, NULL);
+	struct passwd *myuser;
+
+	myuser  = getpwnam(name);
+	if (myuser==NULL)
+		error_msg_and_die( "unknown username: %s\n", name);
+
+	return myuser->pw_uid;
 }
 
 /* returns a gid given a group name */
 long my_getgrnam(char *name)
 {
-	return my_getid("/etc/group", name, -1, NULL);
+	struct group *mygroup;
+
+	mygroup  = getgrnam(name);
+	if (mygroup==NULL)
+		error_msg_and_die( "unknown group: %s\n", name);
+
+	return (mygroup->gr_gid);
 }
 
 /* gets a username given a uid */
 void my_getpwuid(char *name, long uid)
 {
-	name[0] = '\0';
-	my_getid("/etc/passwd", name, uid, NULL);
+	struct passwd *myuser;
+
+	myuser  = getpwuid(uid);
+	if (myuser==NULL)
+		error_msg_and_die( "unknown uid %ld\n", (long)uid);
+
+	strcpy(name, myuser->pw_name);
 }
 
 /* gets a groupname given a gid */
 void my_getgrgid(char *group, long gid)
 {
-	group[0] = '\0';
-	my_getid("/etc/group", group, gid, NULL);
+	struct group *mygroup;
+
+	mygroup  = getgrgid(gid);
+	if (mygroup==NULL)
+		error_msg_and_die( "unknown gid %ld\n", (long)gid);
+
+	strcpy(group, mygroup->gr_name);
 }
 
 #if defined BB_ID
 /* gets a gid given a user name */
 long my_getpwnamegid(char *name)
 {
-	long gid;
-	my_getid("/etc/passwd", name, -1, &gid);
-	return gid;
-}
-#endif
+	struct group *mygroup;
+	struct passwd *myuser;
+
+	myuser=getpwnam(name);
+	if (myuser==NULL)
+		error_msg_and_die( "unknown user name: %s\n", name);
 
+	mygroup  = getgrgid(myuser->pw_gid);
+	if (mygroup==NULL)
+		error_msg_and_die( "unknown gid %ld\n", (long)myuser->pw_gid);
+
+	return mygroup->gr_gid;
+}
+#endif /* BB_ID */
 #endif
  /* BB_CHMOD_CHOWN_CHGRP || BB_PS || BB_LS || BB_TAR \
  || BB_ID || BB_LOGGER || BB_LOGNAME || BB_WHOAMI */
diff -urN busybox/uudecode.c busybox-0.49pre/uudecode.c
--- busybox/uudecode.c	Sun Dec 17 20:57:16 2000
+++ busybox-0.49pre/uudecode.c	Fri Jan 26 15:51:49 2001
@@ -27,7 +27,6 @@
 #include <stdio.h>
 #include <errno.h>
 #include <getopt.h>
-#include <pwd.h>
 
 /*struct passwd *getpwnam();*/
 
diff -urN busybox/uuencode.c busybox-0.49pre/uuencode.c
--- busybox/uuencode.c	Sun Dec 17 20:57:16 2000
+++ busybox-0.49pre/uuencode.c	Fri Jan 26 15:51:55 2001
@@ -27,7 +27,6 @@
 #include <stdio.h>
 #include <errno.h>
 #include <getopt.h>
-#include <pwd.h>
 
 #define	RW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
 
diff -urN busybox/whoami.c busybox-0.49pre/whoami.c
--- busybox/whoami.c	Tue Dec 12 18:52:39 2000
+++ busybox-0.49pre/whoami.c	Fri Jan 26 15:51:59 2001
@@ -22,7 +22,6 @@
 
 #include "busybox.h"
 #include <stdio.h>
-#include <pwd.h>
 
 extern int whoami_main(int argc, char **argv)
 {


More information about the busybox mailing list