On Tue, Oct 30, 2018 at 02:24:46PM -0600, Todd C. Miller wrote:
> I really dislike the side-effect in filteruser(), see below.
> Otherwise looks good.
New diff free of side-effects in filteruser(), rest unchanged.
> > +static int
> > +filteruser(char buf[])
> > +{
> > + char *bufp = buf;
> > + uid_t *uidp;
> > +
> > + if (bufp[0] == '-') {
> > + bufp++[0] = ' ';
>
> Why is this needed, can't you just do "bufp++"?
Done.
The caller rundisplay() now checks for leading dash (again) and just
prints `tempbuf' or `tempbuf + 1' accordingly as done before without
replacing the character.
OK?
Index: top.c
===================================================================
RCS file: /cvs/src/usr.bin/top/top.c,v
retrieving revision 1.94
diff -u -p -r1.94 top.c
--- top.c 5 Oct 2018 18:56:57 -0000 1.94
+++ top.c 31 Oct 2018 22:21:38 -0000
@@ -83,7 +83,7 @@ int no_command = Yes;
int old_system = No;
int old_threads = No;
int show_args = No;
-pid_t hlpid = -1;
+pid_t hlpid = (pid_t)-1;
int combine_cpus = 0;
#if Default_TOPN == Infinity
@@ -131,6 +131,46 @@ usage(void)
__progname);
}
+static int
+filteruser(char buf[])
+{
+ char *bufp = buf;
+ uid_t *uidp;
+
+ if (bufp[0] == '-') {
+ bufp++;
+ uidp = &ps.huid;
+ ps.uid = (pid_t)-1;
+ } else {
+ uidp = &ps.uid;
+ ps.huid = (pid_t)-1;
+ }
+
+ return uid_from_user(bufp, uidp);
+}
+
+static int
+filterpid(char buf[], int hl)
+{
+ const char *errstr;
+ int pid;
+
+ pid = strtonum(buf, 0, INT_MAX, &errstr);
+ if (errstr != NULL || !find_pid(pid))
+ return -1;
+
+ if (hl == Yes)
+ hlpid = (pid_t)pid;
+ else {
+ if (ps.system == No)
+ old_system = No;
+ ps.pid = (pid_t)pid;
+ ps.system = Yes;
+ }
+
+ return 0;
+}
+
static void
parseargs(int ac, char **av)
{
@@ -150,32 +190,16 @@ parseargs(int ac, char **av)
break;
case 'U': /* display only username's processes */
- if (optarg[0] == '-') {
- if (uid_from_user(optarg+1, &ps.huid) == -1)
- new_message(MT_delayed,
- "%s: unknown user", optarg);
- else
- ps.uid = (uid_t)-1;
- } else if (uid_from_user(optarg, &ps.uid) == -1)
+ if (filteruser(optarg) == -1)
new_message(MT_delayed, "%s: unknown user",
optarg);
- else
- ps.huid = (uid_t)-1;
break;
- case 'p': { /* display only process id */
- const char *errstr;
-
- i = strtonum(optarg, 0, INT_MAX, &errstr);
- if (errstr != NULL || !find_pid(i))
+ case 'p': /* display only process id */
+ if (filterpid(optarg, No) == -1)
new_message(MT_delayed, "%s: unknown pid",
optarg);
- else {
- ps.pid = (pid_t)i;
- ps.system = Yes;
- }
break;
- }
case 'S': /* show system processes */
ps.system = !ps.system;
@@ -802,20 +826,12 @@ rundisplay(void)
tempbuf[1] == '\0') {
ps.uid = (uid_t)-1;
ps.huid = (uid_t)-1;
- } else if (tempbuf[0] == '-') {
- if (uid_from_user(tempbuf+1, &ps.huid)
== -1) {
- new_message(MT_standout,
- " %s: unknown user",
tempbuf+1);
- no_command = Yes;
- } else {
- ps.uid = (uid_t)-1;
- }
- } else if (uid_from_user(tempbuf, &ps.uid) ==
-1) {
- new_message(MT_standout,
- " %s: unknown user",
tempbuf);
- no_command = Yes;
- } else {
- ps.huid = (uid_t)-1;
+ } else if (filteruser(tempbuf) == -1) {
+ new_message(MT_standout,
+ " %s: unknown user",
+ tempbuf[0] == '-' ? tempbuf + 1 :
+ tempbuf);
+ no_command = Yes;
}
putr();
} else
@@ -854,23 +870,10 @@ rundisplay(void)
tempbuf[1] == '\0') {
ps.pid = (pid_t)-1;
ps.system = old_system;
- } else {
- unsigned long long num;
- const char *errstr;
-
- num = strtonum(tempbuf, 0, INT_MAX,
- &errstr);
- if (errstr != NULL || !find_pid(num)) {
- new_message(MT_standout,
- " %s: unknown pid",
- tempbuf);
- no_command = Yes;
- } else {
- if (ps.system == No)
- old_system = No;
- ps.pid = (pid_t)num;
- ps.system = Yes;
- }
+ } else if (filterpid(tempbuf, 0) == -1) {
+ new_message(MT_standout,
+ " %s: unknown pid", tempbuf);
+ no_command = Yes;
}
putr();
} else
@@ -897,10 +900,8 @@ rundisplay(void)
if (tempbuf[0] == '+' &&
tempbuf[1] == '\0')
ps.command = NULL;
- else
- if ((ps.command = strdup(tempbuf)) ==
- NULL)
- err(1, NULL);
+ else if ((ps.command = strdup(tempbuf)) == NULL)
+ err(1, NULL);
putr();
} else
clear_message();
@@ -911,20 +912,11 @@ rundisplay(void)
if (readline(tempbuf, sizeof(tempbuf)) > 0) {
if (tempbuf[0] == '+' &&
tempbuf[1] == '\0') {
- hlpid = -1;
- } else {
- unsigned long long num;
- const char *errstr;
-
- num = strtonum(tempbuf, 0, INT_MAX,
- &errstr);
- if (errstr != NULL || !find_pid(num)) {
- new_message(MT_standout,
- " %s: unknown pid",
- tempbuf);
- no_command = Yes;
- } else
- hlpid = (pid_t)num;
+ hlpid = (pid_t)-1;
+ } else if (filterpid(tempbuf, Yes) == -1) {
+ new_message(MT_standout,
+ " %s: unknown pid", tempbuf);
+ no_command = Yes;
}
putr();
} else
@@ -937,7 +929,7 @@ rundisplay(void)
ps.pid = (pid_t)-1; /* pid */
ps.system = old_system;
ps.command = NULL; /* grep */
- hlpid = -1;
+ hlpid = (pid_t)-1;
break;
case CMD_cpus:
combine_cpus = !combine_cpus;
===================================================================
Stats: --- 70 lines 1756 chars
Stats: +++ 62 lines 1279 chars
Stats: -8 lines
Stats: -477 chars