Hi,

 The attached patch adds 'not' functionality to the interactive u command
in top so one can select all processes not owned by a user. This happens
when the username is prefixed with a minus. Example display for -root:

CPU:  0.0% user,  0.0% nice,  0.1% system,  0.0% interrupt, 99.9% idle
Mem: 16M Active, 108M Inact, 150M Wired, 3760K Cache, 112M Buf, 1210M Free
Swap: 288M Total, 288M Free

  PID USERNAME  THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  794 smmsp       1  20    0 12812K  4284K pause   1   0:00  0.00% sendmail
  566 _dhcp       1  39    0 10136K  1848K select  0   0:00  0.00% dhclient


Thanks, Nikos

Index: contrib/top/machine.h
===================================================================
--- contrib/top/machine.h       (revision 243514)
+++ contrib/top/machine.h       (working copy)
@@ -65,6 +65,7 @@
     int system;                /* show system processes */
     int thread;                /* show threads */
     int uid;           /* only this uid (unless uid == -1) */
+    int buid;          /* all but this uid (unless buid == -1) */
     int wcpu;          /* show weighted cpu */
     int jail;          /* show jail ID */
     int kidle;         /* show per-CPU idle threads */
Index: contrib/top/top.X
===================================================================
--- contrib/top/top.X   (revision 243514)
+++ contrib/top/top.X   (working copy)
@@ -286,8 +286,10 @@
 .TP
 .B u
 Display only processes owned by a specific username (prompt for username).
-If the username specified is simply \*(lq+\*(rq, then processes belonging
-to all users will be displayed.
+If the username specified is simply \*(lq+\*(rq or \*(lq-\*(rq, then processes
+belonging to all users will be displayed.
+If the username is prefixed by a \*(lq-\*(rq, then only processes not owned
+by the username will be displayed.
 .TP
 .B o
 Change the order in which the display is sorted.  This command is not
Index: contrib/top/top.c
===================================================================
--- contrib/top/top.c   (revision 243514)
+++ contrib/top/top.c   (working copy)
@@ -259,6 +259,7 @@
     ps.self    = -1;
     ps.system  = No;
     ps.uid     = -1;
+    ps.buid    = -1;
     ps.thread  = No;
     ps.wcpu    = 1;
     ps.jail    = No;
@@ -997,20 +998,32 @@
                                    "Username to show: ");
                                if (readline(tempbuf2, sizeof(tempbuf2), No) > 
0)
                                {
-                                   if (tempbuf2[0] == '+' &&
+                                   if ((tempbuf2[0] == '+' || tempbuf2[0] == 
'-') &&
                                        tempbuf2[1] == '\0')
                                    {
                                        ps.uid = -1;
+                                       ps.buid = -1;
                                    }
+                                   else if (tempbuf2[0] == '-')
+                                   {
+                                       if ((i = userid(tempbuf2 + 1)) == -1)
+                                       {
+                                           new_message(MT_standout,
+                                               " %s: unknown user", tempbuf2 + 
1);
+                                           no_command = Yes;
+                                       } else {
+                                           ps.uid = -1;
+                                           ps.buid = i;
+                                       }
+                                   }
                                    else if ((i = userid(tempbuf2)) == -1)
                                    {
                                        new_message(MT_standout,
                                            " %s: unknown user", tempbuf2);
                                        no_command = Yes;
-                                   }
-                                   else
-                                   {
+                                   } else {
                                        ps.uid = i;
+                                       ps.buid = -1;
                                    }
                                    putchar('\r');
                                }
Index: usr.bin/top/machine.c
===================================================================
--- usr.bin/top/machine.c       (revision 243514)
+++ usr.bin/top/machine.c       (working copy)
@@ -671,6 +671,7 @@
        int show_self;
        int show_system;
        int show_uid;
+       int show_buid;
        int show_command;
        int show_kidle;
 
@@ -713,6 +714,7 @@
        show_self = sel->self == -1;
        show_system = sel->system;
        show_uid = sel->uid != -1;
+       show_buid = sel->buid != -1;
        show_command = sel->command != NULL;
        show_kidle = sel->kidle;
 
@@ -768,6 +770,10 @@
                        /* skip proc. that don't belong to the selected UID */
                        continue;
 
+               if (show_buid && pp->ki_ruid == (uid_t)sel->buid)
+                       /* skip proc. that belong to the selected UID */
+                       continue;
+
                *prefp++ = pp;
                active_procs++;
        }
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to