Reduce four almost identical uid_from_user(3) calls into one by handling
negation once in a way show/hide agnostic way.

I want to add support for UIDs besides usernames, so this diff is a
preliminary cleanup to allow for this feature addition to happen in the
newly introduced function.

The internal pointer `bufp' to the argument `buf' is neccessary since
the second caller `rundisplay()' passes `char tempbuf[TEMPBUFSIZE]' to
it.

Clearing the optionally prefixed dash is not relevant. It merely ensures
that error messages still look the same, otherwise `top -U -foo' would
print " -foo: unknown user".

Feedback? 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       27 Oct 2018 15:48:07 -0000
@@ -131,6 +131,27 @@ usage(void)
            __progname);
 }
 
+static int
+filteruser(char buf[])
+{
+       char *bufp = buf;
+       uid_t *uidp;
+
+       if (strcmp(bufp, "+") == 0) {
+               ps.uid = (uid_t)-1;
+               ps.huid = (uid_t)-1;
+               return 0;
+       }
+
+       if (bufp[0] == '-') {
+               bufp++[0] = ' ';
+               uidp = &ps.huid;
+       } else
+               uidp = &ps.uid;
+
+       return uid_from_user(bufp, uidp);
+}
+
 static void
 parseargs(int ac, char **av)
 {
@@ -150,17 +171,9 @@ 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 */
@@ -798,24 +811,10 @@ rundisplay(void)
                        new_message(MT_standout,
                            "Username to show: ");
                        if (readline(tempbuf, sizeof(tempbuf)) > 0) {
-                               if ((tempbuf[0] == '+' || tempbuf[0] == '-') &&
-                                   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;
+                               if (filteruser(tempbuf) == -1) {
+                                       new_message(MT_standout,
+                                           "%s: unknown user", tempbuf);
+                                       no_command = Yes;
                                }
                                putr();
                        } else

Reply via email to