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

Reply via email to