[BusyBox] my_getpw(u/g)id.....and call for helping to test new id

Felipe Kellermann stdfk at terra.com.br
Sun Aug 29 21:29:24 UTC 2004


On Sun, 29 Aug 2004 10:13pm  -0000, Tito wrote:

> > #include <sys/types.h>
> > #define SIZE_UID_TO_STRING 24 /* We do _know_ this size! */
> 
> So if I understand it right the buffer must be at least 24  to hold 
> the maximum for uid_t or gid_t?

Yes.  The stringized value.
The value won't be greater than, say, ``18446744073709551616'' (+ 1).


> char *my_getpwuid(long uid,  int flag_exit_on_error)
> > {
> >         struct passwd *myuser;
> 	   char uid_string[24];
> 

This automatic uid_string should be in the calling function, and only if 
it is _really_ needed (otherwise we can just pass an invalid reference).


>                          sprintf(uid_string, "%ld", (long)uid);
> 			return uid_string;				

This reference will get lost in the frame.


> 		 } else {
> 			  bb_error_msg_and_die("unknown user ID %ld", (long) uid);
> 		}

Not needed.  In very few cases we will have do `die' here.  Take a look at 
my second jumbo patch in the `id';  `my_getpwnam' already does this check.


> Looks good, but the main difference with the design of other libbb functions
> is that they do a bb_error_msg_and_die on error,

I'm attaching my `jumbo patch2'.  All the busybox code is converted to my 
last e-mail's function.  I intentionally didn't use `-b' or `-w' flags to 
diff :-) There is also a saving of codesize and no limit at all to values 
of username or groupname.  No memory leaks.  Sorry again for sending such 
a big diff.

-- 
Felipe Kellermann
-------------- next part --------------
? fk-jumbopatch1-busybox.patch
? fk-jumbopatch2-busybox.patch
? coreutils/cscope.out
? libbb/stBo9bWZ
Index: archival/tar.c
===================================================================
RCS file: /var/cvs/busybox/archival/tar.c,v
retrieving revision 1.195
diff -u -3 -p -u -r1.195 tar.c
--- archival/tar.c	26 Aug 2004 22:18:56 -0000	1.195
+++ archival/tar.c	29 Aug 2004 20:35:58 -0000
@@ -220,6 +220,7 @@ static inline int writeTarHeader(struct 
 	struct TarHeader header;
 	const unsigned char *cp = (const unsigned char *) &header;
 	ssize_t size = sizeof(struct TarHeader);
+	char *p;
 
 	memset(&header, 0, size);
 
@@ -234,10 +235,13 @@ static inline int writeTarHeader(struct 
 			TAR_MAGIC_LEN + TAR_VERSION_LEN);
 
 	/* Enter the user and group names (default to root if it fails) */
-	if (my_getpwuid(header.uname, statbuf->st_uid, sizeof(header.uname)) == NULL)
-		strcpy(header.uname, "root");
-	if (my_getgrgid(header.gname, statbuf->st_gid, sizeof(header.gname)) == NULL)
-		strcpy(header.gname, "root");
+	if ((p = my_getpwuid(statbuf->st_uid, header.uname)) == NULL)
+		p = "root";
+	safe_strncpy(header.uname, p, sizeof(header.uname));
+
+	if ((p = my_getgrgid(statbuf->st_gid, header.gname)) == NULL)
+		p = "root";
+	safe_strncpy(header.gname, p, sizeof(header.gname));
 
 	if (tbInfo->hlInfo) {
 		/* This is a hard link */
Index: coreutils/id.c
===================================================================
RCS file: /var/cvs/busybox/coreutils/id.c,v
retrieving revision 1.25
diff -u -3 -p -u -r1.25 id.c
--- coreutils/id.c	26 Aug 2004 22:18:57 -0000	1.25
+++ coreutils/id.c	29 Aug 2004 20:35:59 -0000
@@ -40,16 +40,16 @@
 
 extern int id_main(int argc, char **argv)
 {
-	char user[32], group[32];
+	char *user = NULL;
+	char *group = NULL;
 	long pwnam, grnam;
-	int uid, gid;
+	long uid, gid;
 	int flags;
 #ifdef CONFIG_SELINUX
 	int is_flask_enabled_flag = is_flask_enabled();
 #endif
 
 	flags = bb_getopt_ulflags(argc, argv, "ugrn");
-
 	if (((flags & (JUST_USER | JUST_GROUP)) == (JUST_USER | JUST_GROUP))
 		|| (argc > optind + 1)
 	) {
@@ -64,15 +64,14 @@ extern int id_main(int argc, char **argv
 			uid = geteuid();
 			gid = getegid();
 		}
-		my_getpwuid(user, uid, sizeof(user));
+		user = my_getpwuid(uid, NULL);
 	} else {
-		safe_strncpy(user, argv[optind], sizeof(user));
-	    gid = my_getpwnamegid(user);
+		user = argv[optind];
+		gid = my_getpwnamegid(user);
 	}
-	my_getgrgid(group, gid, sizeof(group));
-
-	pwnam=my_getpwnam(user);
-	grnam=my_getgrnam(group);
+	group = my_getgrgid(gid, NULL);
+	pwnam = my_getpwnam(user);
+	grnam = my_getgrnam(group);
 
 	if (flags & (JUST_GROUP | JUST_USER)) {
 		char *s = group;
@@ -88,22 +87,20 @@ extern int id_main(int argc, char **argv
 	} else {
 #ifdef CONFIG_SELINUX
 		printf("uid=%ld(%s) gid=%ld(%s)", pwnam, user, grnam, group);
-		if(is_flask_enabled_flag)
-		{
+		if (is_flask_enabled_flag) {
 			security_id_t mysid = getsecsid();
 			char context[80];
 			int len = sizeof(context);
 			context[0] = '\0';
-			if(security_sid_to_context(mysid, context, &len))
+			if (security_sid_to_context(mysid, context, &len))
 				strcpy(context, "unknown");
 			printf(" context=%s\n", context);
 		}
 		else
-			printf("\n");
+			puts("");
 #else
 		printf("uid=%ld(%s) gid=%ld(%s)\n", pwnam, user, grnam, group);
 #endif
-
 	}
 
 	bb_fflush_stdout_and_exit(0);
Index: coreutils/ls.c
===================================================================
RCS file: /var/cvs/busybox/coreutils/ls.c,v
retrieving revision 1.111
diff -u -3 -p -u -r1.111 ls.c
--- coreutils/ls.c	26 Aug 2004 22:18:57 -0000	1.111
+++ coreutils/ls.c	29 Aug 2004 20:36:04 -0000
@@ -637,7 +637,8 @@ static int list_single(struct dnode *dn)
 	int i, column = 0;
 
 #ifdef CONFIG_FEATURE_LS_USERNAME
-	char scratch[16];
+	char *scratch;
+	char user[BUFSIZE_IDTOSTR];
 #endif
 #ifdef CONFIG_FEATURE_LS_TIMESTAMPS
 	char *filetime;
@@ -683,9 +684,11 @@ static int list_single(struct dnode *dn)
 			break;
 		case LIST_ID_NAME:
 #ifdef CONFIG_FEATURE_LS_USERNAME
-			my_getpwuid(scratch, dn->dstat.st_uid, sizeof(scratch));
+			if ((scratch = my_getpwuid(dn->dstat.st_uid, user)) == NULL)
+				scratch = user;
 			printf("%-8.8s ", scratch);
-			my_getgrgid(scratch, dn->dstat.st_gid, sizeof(scratch));
+			if ((scratch = my_getgrgid(dn->dstat.st_gid, user)) == NULL)
+				scratch = user;
 			printf("%-8.8s", scratch);
 			column += 17;
 			break;
Index: coreutils/whoami.c
===================================================================
RCS file: /var/cvs/busybox/coreutils/whoami.c,v
retrieving revision 1.23
diff -u -3 -p -u -r1.23 whoami.c
--- coreutils/whoami.c	26 Aug 2004 22:36:02 -0000	1.23
+++ coreutils/whoami.c	29 Aug 2004 20:36:15 -0000
@@ -31,16 +31,17 @@
 
 extern int whoami_main(int argc, char **argv)
 {
-	struct passwd *p;
 	uid_t uid;
+	char *user;
 	
 	if (argc > 1)
 		bb_show_usage();
 
 	uid = geteuid();
-	if((p = getpwuid(uid))!=NULL) {
-		puts(p->pw_name);
-		bb_fflush_stdout_and_exit(EXIT_SUCCESS);
+	if ((user = my_getpwuid(uid, NULL)) == NULL) {
+		bb_error_msg_and_die("cannot find username for UID %u", (unsigned)uid);
 	}
-	bb_error_msg_and_die("cannot find username for UID %u", (unsigned) uid);
+
+	puts(user);
+	bb_fflush_stdout_and_exit(EXIT_SUCCESS);
 }
Index: include/libbb.h
===================================================================
RCS file: /var/cvs/busybox/include/libbb.h,v
retrieving revision 1.134
diff -u -3 -p -u -r1.134 libbb.h
--- include/libbb.h	26 Aug 2004 22:18:58 -0000	1.134
+++ include/libbb.h	29 Aug 2004 20:36:17 -0000
@@ -79,6 +79,7 @@
 
 #define BUF_SIZE        8192
 #define EXPAND_ALLOC    1024
+#define BUFSIZE_IDTOSTR 24
 
 /* Macros for min/max.  */
 #ifndef MIN
@@ -230,8 +231,8 @@ extern unsigned long bb_xparse_number(co
  * increases target size and is often not needed embedded systems.  */
 extern long my_getpwnam(const char *name);
 extern long my_getgrnam(const char *name);
-extern char * my_getpwuid(char *name, long uid, int bufsize);
-extern char * my_getgrgid(char *group, long gid, int bufsize);
+extern char *my_getpwuid(long uid, char *buf);
+extern char *my_getgrgid(long gid, char *buf);
 extern long my_getpwnamegid(const char *name);
 extern char *bb_askpass(int timeout, const char * prompt);
 
@@ -441,7 +442,7 @@ extern unsigned char bb_xread_char(int f
 
 typedef struct {
 	int pid;
-	char user[9];
+	char *user;
 	char state[4];
 	unsigned long rss;
 	int ppid;
@@ -456,10 +457,11 @@ typedef struct {
 	char short_cmd[16];
 } procps_status_t;
 
-extern procps_status_t * procps_scan(int save_user_arg0
+extern procps_status_t * procps_scan(int save_user_arg0,
 #ifdef CONFIG_SELINUX
-	, int use_selinux, security_id_t *sid
+	, int use_selinux, security_id_t *sid,
 #endif
+	procps_status_t *curstatus
 );
 extern unsigned short compare_string_array(const char *string_array[], const char *key);
 
Index: libbb/find_pid_by_name.c
===================================================================
RCS file: /var/cvs/busybox/libbb/find_pid_by_name.c,v
retrieving revision 1.14
diff -u -3 -p -u -r1.14 find_pid_by_name.c
--- libbb/find_pid_by_name.c	15 Mar 2004 08:28:42 -0000	1.14
+++ libbb/find_pid_by_name.c	29 Aug 2004 20:36:34 -0000
@@ -38,25 +38,25 @@
  *
  *  Returns a list of all matching PIDs
  */
-extern long* find_pid_by_name( const char* pidName)
+extern long *find_pid_by_name(const char* pidName)
 {
-	long* pidList;
-	int i=0;
-	procps_status_t * p;
+	long *pidList;
+	int i = 0;
+	procps_status_t p;
 
 	pidList = xmalloc(sizeof(long));
 #ifdef CONFIG_SELINUX
-	while ((p = procps_scan(0, 0, NULL)) != 0) {
+	while ((procps_scan(0, 0, NULL, &p)) != 0) {
 #else
-	while ((p = procps_scan(0)) != 0) {
+	while ((procps_scan(0, &p)) != 0) {
 #endif
-		if (strncmp(p->short_cmd, pidName, COMM_LEN-1) == 0) {
-			pidList=xrealloc( pidList, sizeof(long) * (i+2));
-			pidList[i++]=p->pid;
+		if (strncmp(p.short_cmd, pidName, COMM_LEN - 1) == 0) {
+			pidList=xrealloc(pidList, sizeof(long) * (i+2));
+			pidList[i++] = p.pid;
 		}
 	}
 
-	pidList[i] = i==0 ? -1 : 0;
+	pidList[i] = i == 0 ? -1 : 0;
 	return pidList;
 }
 
Index: libbb/my_getgrgid.c
===================================================================
RCS file: /var/cvs/busybox/libbb/my_getgrgid.c,v
retrieving revision 1.8
diff -u -3 -p -u -r1.8 my_getgrgid.c
--- libbb/my_getgrgid.c	26 Aug 2004 22:18:58 -0000	1.8
+++ libbb/my_getgrgid.c	29 Aug 2004 20:36:34 -0000
@@ -27,17 +27,20 @@
 
 
 /* gets a groupname given a gid */
-char * my_getgrgid(char *group, long gid, int bufsize)
+char *my_getgrgid(long gid, char *buf)
 {
 	struct group *mygroup;
+	char *ret = NULL;
 
-	mygroup  = getgrgid(gid);
-	if (mygroup==NULL) {
-		snprintf(group, bufsize, "%ld", gid);
-		return NULL;
+	mygroup = getgrgid(gid);
+	if (mygroup == NULL) {
+		if (buf != NULL)
+			(void)sprintf(buf, "%ld", (long)gid);
 	} else {
-		return safe_strncpy(group, mygroup->gr_name, bufsize);
+		ret = mygroup->gr_name;
 	}
+
+	return ret;
 }
 
 
Index: libbb/my_getgrnam.c
===================================================================
RCS file: /var/cvs/busybox/libbb/my_getgrnam.c,v
retrieving revision 1.7
diff -u -3 -p -u -r1.7 my_getgrnam.c
--- libbb/my_getgrnam.c	15 Mar 2004 08:28:43 -0000	1.7
+++ libbb/my_getgrnam.c	29 Aug 2004 20:36:34 -0000
@@ -31,11 +31,11 @@ long my_getgrnam(const char *name)
 {
 	struct group *mygroup;
 
-	mygroup  = getgrnam(name);
-	if (mygroup==NULL)
+	mygroup = getgrnam(name);
+	if (mygroup == NULL)
 		bb_error_msg_and_die("unknown group name: %s", name);
 
-	return (mygroup->gr_gid);
+	return mygroup->gr_gid;
 }
 
 
Index: libbb/my_getpwnam.c
===================================================================
RCS file: /var/cvs/busybox/libbb/my_getpwnam.c,v
retrieving revision 1.7
diff -u -3 -p -u -r1.7 my_getpwnam.c
--- libbb/my_getpwnam.c	15 Mar 2004 08:28:43 -0000	1.7
+++ libbb/my_getpwnam.c	29 Aug 2004 20:36:34 -0000
@@ -31,8 +31,8 @@ long my_getpwnam(const char *name)
 {
 	struct passwd *myuser;
 
-	myuser  = getpwnam(name);
-	if (myuser==NULL)
+	myuser = getpwnam(name);
+	if (myuser == NULL)
 		bb_error_msg_and_die("unknown user name: %s", name);
 
 	return myuser->pw_uid;
Index: libbb/my_getpwuid.c
===================================================================
RCS file: /var/cvs/busybox/libbb/my_getpwuid.c,v
retrieving revision 1.8
diff -u -3 -p -u -r1.8 my_getpwuid.c
--- libbb/my_getpwuid.c	26 Aug 2004 22:18:58 -0000	1.8
+++ libbb/my_getpwuid.c	29 Aug 2004 20:36:34 -0000
@@ -28,19 +28,23 @@
 
 
 /* gets a username given a uid */
-char * my_getpwuid(char *name, long uid, int bufsize)
+char *my_getpwuid(long uid, char *buf)
 {
 	struct passwd *myuser;
+	char *ret = NULL;
 
-	myuser  = getpwuid(uid);
-	if (myuser==NULL) {
-		snprintf(name, bufsize, "%ld", (long)uid);
-		return NULL;
+	myuser = getpwuid(uid);
+	if (myuser == NULL) {
+		if (buf != NULL)
+			(void)sprintf(buf, "%ld", (long)uid);
 	} else {
-		return safe_strncpy(name, myuser->pw_name, bufsize);
+		ret = myuser->pw_name;
 	}
+
+	return ret;
 }
 
+
 /* END CODE */
 /*
 Local Variables:
Index: libbb/procps.c
===================================================================
RCS file: /var/cvs/busybox/libbb/procps.c,v
retrieving revision 1.14
diff -u -3 -p -u -r1.14 procps.c
--- libbb/procps.c	26 Aug 2004 22:18:58 -0000	1.14
+++ libbb/procps.c	29 Aug 2004 20:36:34 -0000
@@ -16,21 +16,20 @@
 
 #include "libbb.h"
 
-extern procps_status_t * procps_scan(int save_user_arg0
+extern procps_status_t * procps_scan(int save_user_arg0,
 #ifdef CONFIG_SELINUX
-	, int use_selinux , security_id_t *sid
+	int use_selinux, security_id_t *sid,
 #endif
-	)
+	procps_status_t *curstatus)
 {
 	static DIR *dir;
 	struct dirent *entry;
-	static procps_status_t ret_status;
 	char *name;
 	int n;
 	char status[32];
 	char buf[1024];
+	char user[BUFSIZE_IDTOSTR];
 	FILE *fp;
-	procps_status_t curstatus;
 	int pid;
 	long tasknice;
 	struct stat sb;
@@ -50,14 +49,17 @@ extern procps_status_t * procps_scan(int
 		if (!(*name >= '0' && *name <= '9'))
 			continue;
 
-		memset(&curstatus, 0, sizeof(procps_status_t));
 		pid = atoi(name);
-		curstatus.pid = pid;
+		bzero(curstatus, sizeof(procps_status_t));
+		curstatus->pid = pid;
 
 		sprintf(status, "/proc/%d", pid);
 		if(stat(status, &sb))
 			continue;
-		my_getpwuid(curstatus.user, sb.st_uid, sizeof(curstatus.user));
+
+		if ((name = my_getpwuid(sb.st_uid, user)) == NULL)
+			name = user;
+		curstatus->user = bb_xstrdup(name);
 
 		sprintf(status, "/proc/%d/stat", pid);
 		if((fp = fopen(status, "r")) == NULL)
@@ -78,7 +80,7 @@ extern procps_status_t * procps_scan(int
 		if(name == 0 || name[1] != ' ')
 			continue;
 		*name = 0;
-		sscanf(buf, "%*s (%15c", curstatus.short_cmd);
+		sscanf(buf, "%*s (%15c", curstatus->short_cmd);
 		n = sscanf(name+2,
 		"%c %d "
 		"%*s %*s %*s %*s "     /* pgrp, session, tty, tpgid */
@@ -93,12 +95,12 @@ extern procps_status_t * procps_scan(int
 		"%*s %*s %*s "         /* timeout, it_real_value, start_time */
 		"%*s "                 /* vsize */
 		"%ld",
-		curstatus.state, &curstatus.ppid,
+		curstatus->state, &curstatus->ppid,
 #ifdef FEATURE_CPU_USAGE_PERCENTAGE
-		&curstatus.utime, &curstatus.stime,
+		&curstatus->utime, &curstatus->stime,
 #endif
 		&tasknice,
-		&curstatus.rss);
+		&curstatus->rss);
 #ifdef FEATURE_CPU_USAGE_PERCENTAGE
 		if(n != 6)
 #else
@@ -106,21 +108,21 @@ extern procps_status_t * procps_scan(int
 #endif
 			continue;
 
-		if (curstatus.rss == 0 && curstatus.state[0] != 'Z')
-			curstatus.state[1] = 'W';
+		if (curstatus->rss == 0 && curstatus->state[0] != 'Z')
+			curstatus->state[1] = 'W';
 		else
-			curstatus.state[1] = ' ';
+			curstatus->state[1] = ' ';
 		if (tasknice < 0)
-			curstatus.state[2] = '<';
+			curstatus->state[2] = '<';
 		else if (tasknice > 0)
-			curstatus.state[2] = 'N';
+			curstatus->state[2] = 'N';
 		else
-			curstatus.state[2] = ' ';
+			curstatus->state[2] = ' ';
 
 #ifdef PAGE_SHIFT
-		curstatus.rss <<= (PAGE_SHIFT - 10);     /* 2**10 = 1kb */
+		curstatus->rss <<= (PAGE_SHIFT - 10);     /* 2**10 = 1kb */
 #else
-		curstatus.rss *= (getpagesize() >> 10);     /* 2**10 = 1kb */
+		curstatus->rss *= (getpagesize() >> 10);     /* 2**10 = 1kb */
 #endif
 
 		if(save_user_arg0) {
@@ -139,12 +141,12 @@ extern procps_status_t * procps_scan(int
 				}
 				*name = 0;
 				if(buf[0])
-					curstatus.cmd = strdup(buf);
+					curstatus->cmd = strdup(buf);
 				/* if NULL it work true also */
 			}
 			fclose(fp);
 		}
-		return memcpy(&ret_status, &curstatus, sizeof(procps_status_t));
+		return 1;
 	}
 }
 
Index: loginutils/passwd.c
===================================================================
RCS file: /var/cvs/busybox/loginutils/passwd.c,v
retrieving revision 1.7
diff -u -3 -p -u -r1.7 passwd.c
--- loginutils/passwd.c	1 May 2004 01:27:30 -0000	1.7
+++ loginutils/passwd.c	29 Aug 2004 20:36:37 -0000
@@ -144,11 +144,11 @@ extern int passwd_main(int argc, char **
 	int lflg = 0;				/* -l - lock account */
 	int uflg = 0;				/* -u - unlock account */
 	int dflg = 0;				/* -d - delete password */
-	const struct passwd *pw;
-	unsigned short ruid;
+	long ruid;
 
 #ifdef CONFIG_FEATURE_SHADOWPASSWDS
 	const struct spwd *sp;
+	const struct passwd *pw;
 #endif							/* CONFIG_FEATURE_SHADOWPASSWDS */
 	amroot = (getuid() == 0);
 	openlog("passwd", LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH);
@@ -170,30 +170,28 @@ extern int passwd_main(int argc, char **
 			bb_show_usage();
 		}
 	}
-	ruid = getuid();
-	pw = (struct passwd *) getpwuid(ruid);
-	if (!pw) {
-               bb_error_msg_and_die("Cannot determine your user name.");
-	}
-	myname = (char *) bb_xstrdup(pw->pw_name);
+
 	if (optind < argc) {
 		name = argv[optind];
 	} else {
+		ruid = getuid();
+		if ((myname = my_getpwuid(ruid, NULL)) == NULL)
+			bb_error_msg_and_die("Cannot determine your user name.");
 		name = myname;
 	}
+
 	if ((lflg || uflg || dflg) && (optind >= argc || !amroot)) {
 		bb_show_usage();
 	}
-	pw = getpwnam(name);
-	if (!pw) {
-		bb_error_msg_and_die("Unknown user %s\n", name);
-	}
-	if (!amroot && pw->pw_uid != getuid()) {
+
+	ruid = my_getpwnam(name);
+	if (!amroot && ruid != getuid()) {
 		syslog(LOG_WARNING, "can't change pwd for `%s'", name);
 		bb_error_msg_and_die("Permission denied.\n");
 	}
 #ifdef CONFIG_FEATURE_SHADOWPASSWDS
 	sp = getspnam(name);
+	pw = getpwuid(ruid);
 	if (!sp) {
 		sp = (struct spwd *) pwd_to_spwd(pw);
 	}
Index: loginutils/vlock.c
===================================================================
RCS file: /var/cvs/busybox/loginutils/vlock.c,v
retrieving revision 1.4
diff -u -3 -p -u -r1.4 vlock.c
--- loginutils/vlock.c	1 May 2004 01:27:30 -0000	1.4
+++ loginutils/vlock.c	29 Aug 2004 20:36:39 -0000
@@ -54,14 +54,14 @@ static struct spwd *spw;
 struct spwd *getspuid(uid_t uid)
 {
 	struct spwd *sp;
-	struct passwd *mypw;
+	char *name;
 
-	if ((mypw = getpwuid(getuid())) == NULL) {
-		return (NULL);
+	if ((name = my_getpwuid(getuid(), NULL)) == NULL) {
+		return NULL;
 	}
 	setspent();
 	while ((sp = getspent()) != NULL) {
-		if (strcmp(mypw->pw_name, sp->sp_namp) == 0)
+		if (strcmp(name, sp->sp_namp) == 0)
 			break;
 	}
 	endspent();
Index: procps/ps.c
===================================================================
RCS file: /var/cvs/busybox/procps/ps.c,v
retrieving revision 1.52
diff -u -3 -p -u -r1.52 ps.c
--- procps/ps.c	15 Mar 2004 08:29:03 -0000	1.52
+++ procps/ps.c	29 Aug 2004 20:36:40 -0000
@@ -42,7 +42,7 @@ static const int TERMINAL_WIDTH = 79;   
 
 extern int ps_main(int argc, char **argv)
 {
-	procps_status_t * p;
+	procps_status_t p;
 	int i, len;
 	int terminal_width = TERMINAL_WIDTH;
 
@@ -64,11 +64,11 @@ extern int ps_main(int argc, char **argv
 #endif
 	printf("  PID  Uid     VmSize Stat Command\n");
 #ifdef CONFIG_SELINUX
-	while ((p = procps_scan(1, use_selinux, &sid)) != 0) {
+	while ((procps_scan(1, use_selinux, &sid, &p)) != 0) {
 #else
-	while ((p = procps_scan(1)) != 0) {
+	while ((procps_scan(1, &p)) != 0) {
 #endif
-		char *namecmd = p->cmd;
+		char *namecmd = p.cmd;
 
 #ifdef CONFIG_SELINUX
 		if(use_selinux)
@@ -78,14 +78,14 @@ extern int ps_main(int argc, char **argv
 			if(security_sid_to_context(sid, (security_context_t)&sbuf, &len))
 				strcpy(sbuf, "unknown");
 
-			len = printf("%5d %-32s %s ", p->pid, sbuf, p->state);
+			len = printf("%5d %-32s %s ", p.pid, sbuf, p.state);
 		}
 		else
 #endif
-		if(p->rss == 0)
-			len = printf("%5d %-8s        %s ", p->pid, p->user, p->state);
+		if(p.rss == 0)
+			len = printf("%5d %-8s        %s ", p.pid, p.user, p.state);
 		else
-			len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state);
+			len = printf("%5d %-8s %6ld %s ", p.pid, p.user, p.rss, p.state);
 		i = terminal_width-len;
 
 		if(namecmd != 0 && namecmd[0] != 0) {
@@ -95,14 +95,15 @@ extern int ps_main(int argc, char **argv
 				namecmd[i] = 0;
 			printf("%s\n", namecmd);
 		} else {
-			namecmd = p->short_cmd;
+			namecmd = p.short_cmd;
 			if(i < 2)
 				i = 2;
 			if(strlen(namecmd) > (i-2))
 				namecmd[i-2] = 0;
 			printf("[%s]\n", namecmd);
 		}
-		free(p->cmd);
+		free(p.user);
+		free(p.cmd);
 	}
 	return EXIT_SUCCESS;
 }
Index: procps/top.c
===================================================================
RCS file: /var/cvs/busybox/procps/top.c,v
retrieving revision 1.12
diff -u -3 -p -u -r1.12 top.c
--- procps/top.c	14 Apr 2004 17:51:28 -0000	1.12
+++ procps/top.c	29 Aug 2004 20:36:42 -0000
@@ -53,24 +53,14 @@ static procps_status_t *top;   /* Hehe *
 static int ntop;
 
 
-static int pid_sort (procps_status_t *P, procps_status_t *Q)
+static int pid_sort(procps_status_t *P, procps_status_t *Q)
 {
-    int p = P->pid;
-    int q = Q->pid;
-
-    if( p < q ) return -1;
-    if( p > q ) return  1;
-    return 0;
+    return (P->pid - Q->pid);
 }
 
-static int mem_sort (procps_status_t *P, procps_status_t *Q)
+static int mem_sort(procps_status_t *P, procps_status_t *Q)
 {
-    long p = P->rss;
-    long q = Q->rss;
-
-    if( p > q ) return -1;
-    if( p < q ) return  1;
-    return 0;
+    return (P->rss - Q->rss);
 }
 
 #ifdef FEATURE_CPU_USAGE_PERCENTAGE
@@ -80,12 +70,7 @@ static cmp_t sort_function[sort_depth];
 
 static int pcpu_sort (procps_status_t *P, procps_status_t *Q)
 {
-    int p = P->pcpu;
-    int q = Q->pcpu;
-
-    if( p > q ) return -1;
-    if( p < q ) return  1;
-    return 0;
+    return (P->pcpu - Q->pcpu);
 }
 
 static int time_sort (procps_status_t *P, procps_status_t *Q)
@@ -461,6 +446,7 @@ static void sig_catcher (int sig)
 int top_main(int argc, char **argv)
 {
 	int opt, interval, lines, col;
+	procps_status_t p;
 #if defined CONFIG_FEATURE_USE_TERMIOS
 	struct termios new_settings;
 	struct timeval tv;
@@ -528,23 +514,22 @@ int top_main(int argc, char **argv)
 #else
 	sort_function = mem_sort;
 #endif
+	/* read process IDs & status for all the processes */
 	while (1) {
-		/* read process IDs & status for all the processes */
-		procps_status_t * p;
-
 #ifdef CONFIG_SELINUX
-		while ((p = procps_scan(0, 0, NULL) ) != 0) {
+		while ((procps_scan(0, 0, NULL, &p)) != 0) {
 #else
-		while ((p = procps_scan(0)) != 0) {
+		while ((procps_scan(0, &p)) != 0) {
 #endif
 			int n = ntop;
 
-			top = xrealloc(top, (++ntop)*sizeof(procps_status_t));
-			memcpy(top + n, p, sizeof(procps_status_t));
+			top = xrealloc(top, (++ntop) * sizeof(procps_status_t));
+			memcpy(top + n, &p, sizeof(procps_status_t));
 		}
+
 		if (ntop == 0) {
-		bb_perror_msg_and_die("scandir('/proc')");
-	}
+			bb_perror_msg_and_die("scandir('/proc')");
+		}
 #ifdef FEATURE_CPU_USAGE_PERCENTAGE
 		if(!Hertz) {
 			init_Hertz_value();
@@ -552,7 +537,7 @@ int top_main(int argc, char **argv)
 			sleep(1);
 			clearmems();
 			continue;
-	}
+		}
 		do_stats();
 #else
 		qsort(top, ntop, sizeof(procps_status_t), (void*)sort_function);
@@ -571,8 +556,9 @@ int top_main(int argc, char **argv)
 		select (1, &readfds, NULL, NULL, &tv);
 		if (FD_ISSET (0, &readfds)) {
 			if (read (0, &c, 1) <= 0) {   /* signal */
-		return EXIT_FAILURE;
-	}
+				return EXIT_FAILURE;
+			}
+
 			if(c == 'q' || c == initial_settings.c_cc[VINTR])
 				return EXIT_SUCCESS;
 			if(c == 'M') {
@@ -590,6 +576,7 @@ int top_main(int argc, char **argv)
 				sort_function[1] = mem_sort;
 				sort_function[2] = time_sort;
 			}
+
 			if(c == 'T') {
 				sort_function[0] = time_sort;
 				sort_function[1] = mem_sort;
Index: sysklogd/logger.c
===================================================================
RCS file: /var/cvs/busybox/sysklogd/logger.c,v
retrieving revision 1.40
diff -u -3 -p -u -r1.40 logger.c
--- sysklogd/logger.c	26 Aug 2004 22:18:59 -0000	1.40
+++ sysklogd/logger.c	29 Aug 2004 20:36:42 -0000
@@ -105,10 +105,12 @@ extern int logger_main(int argc, char **
 	int pri = LOG_USER | LOG_NOTICE;
 	int option = 0;
 	int c, i, opt;
-	char buf[1024], name[128];
+	char user[BUFSIZE_IDTOSTR];
+	char buf[1024], *name;
 
 	/* Fill out the name string early (may be overwritten later) */
-	my_getpwuid(name, geteuid(), sizeof(name));
+	if ((name = my_getpwuid(geteuid(), user)) == NULL)
+		name = user;
 
 	/* Parse any options */
 	while ((opt = getopt(argc, argv, "p:st:")) > 0) {


More information about the busybox mailing list