[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