On Sun, Aug 09, 2020 at 09:02:14PM +0200, Klemens Nanni wrote:
> Sometimes I want to see processes outside the default routing table with
> `-T -0', sometimes those in in a specific one with `-T 3' (for testing).
> 
> Since others have poked around with routing tables and/or domains as of
> late, perhaps this deemed useful enough?
> 
> Semantically, filtering is identical to that of users: pick or hide one;
> this makes the code pretty much copy/paste within top(1), manual wording
> and command line flag is taken from pgrep(1).
> 
> pgrep is currently the only way to identify processes by routing table.
> After netstat(1)'s relatively recent addition of `-R', filtering in top
> makes for a quite handy set of tooling around rtable(4).
> 
> Feedback? OK?
Anyone?

One thing is that routing tables are now the only values you can filter
for which are never visible in top - I thought about adding another
RTABLE column, replacing one as `H' does with USERNAME -> TID or so,
but did not deem it necessary/worthwile in the end.

What do you think?

Same diff below.


Index: display.c
===================================================================
RCS file: /cvs/src/usr.bin/top/display.c,v
retrieving revision 1.63
diff -u -p -r1.63 display.c
--- display.c   26 Jul 2020 21:59:16 -0000      1.63
+++ display.c   9 Aug 2020 17:55:56 -0000
@@ -824,6 +824,8 @@ show_help(void)
            "r count pid  - renice process `pid' to nice value `count'\n"
            "S            - toggle the display of system processes\n"
            "s time       - change delay between displays to `time' seconds\n"
+           "T [-]rtable  - show processes associated with routing table 
`rtable'\n"
+           "               (T+ shows all, T -rtable hides rtable)\n"
            "u [-]user    - show processes for `user' (u+ shows all, u -user 
hides user)\n"
            "\n");
 
Index: machine.c
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.107
diff -u -p -r1.107 machine.c
--- machine.c   6 Jul 2020 16:27:59 -0000       1.107
+++ machine.c   9 Aug 2020 18:06:36 -0000
@@ -414,7 +414,7 @@ get_process_info(struct system_info *si,
     int (*compare) (const void *, const void *))
 {
        int show_idle, show_system, show_threads, show_uid, show_pid, show_cmd;
-       int hide_uid;
+       int show_rtable, hide_rtable, hide_uid;
        int total_procs, active_procs;
        struct kinfo_proc **prefp, *pp;
        int what = KERN_PROC_ALL;
@@ -446,6 +446,8 @@ get_process_info(struct system_info *si,
        show_uid = sel->uid != (uid_t)-1;
        hide_uid = sel->huid != (uid_t)-1;
        show_pid = sel->pid != (pid_t)-1;
+       show_rtable = sel->rtableid != -1;
+       hide_rtable = sel->hrtableid != -1;
        show_cmd = sel->command != NULL;
 
        /* count up process states and get pointers to interesting procs */
@@ -474,6 +476,8 @@ get_process_info(struct system_info *si,
                            (!hide_uid || pp->p_ruid != sel->huid) &&
                            (!show_uid || pp->p_ruid == sel->uid) &&
                            (!show_pid || pp->p_pid == sel->pid) &&
+                           (!hide_rtable || pp->p_rtableid != sel->hrtableid) 
&&
+                           (!show_rtable || pp->p_rtableid == sel->rtableid) &&
                            (!show_cmd || cmd_matches(pp, sel->command))) {
                                *prefp++ = pp;
                                active_procs++;
Index: machine.h
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.h,v
retrieving revision 1.29
diff -u -p -r1.29 machine.h
--- machine.h   25 Jun 2020 20:38:41 -0000      1.29
+++ machine.h   9 Aug 2020 17:50:14 -0000
@@ -77,6 +77,8 @@ struct process_select {
        uid_t           uid;    /* only this uid (unless uid == -1) */
        uid_t           huid;   /* hide this uid (unless huid == -1) */
        pid_t           pid;    /* only this pid (unless pid == -1) */
+       int             rtableid;       /* only this rtable (unless rtableid == 
-1) */
+       int             hrtableid;      /* hide this rtable (unless hrtableid 
== -1) */
        char           *command;/* only this command (unless == NULL) */
 };
 
Index: top.1
===================================================================
RCS file: /cvs/src/usr.bin/top/top.1,v
retrieving revision 1.75
diff -u -p -r1.75 top.1
--- top.1       26 Jul 2020 21:59:16 -0000      1.75
+++ top.1       9 Aug 2020 18:16:12 -0000
@@ -38,6 +38,7 @@
 .Op Fl o Oo - Oc Ns Ar field
 .Op Fl p Ar pid
 .Op Fl s Ar time
+.Op Fl T Oo - Oc Ns Ar rtable
 .Op Fl U Oo - Oc Ns Ar user
 .Op Ar number
 .Ek
@@ -179,6 +180,14 @@ Set the delay between screen updates to
 seconds.
 The value may be fractional, to permit delays of less than 1 second.
 The default delay between updates is 5 seconds.
+.It Fl T Oo - Oc Ns Ar rtable
+Display only processes associated with the specified routing table
+.Ar rtable .
+.Sq T+
+shows processes associated with all routing tables.
+The
+.Sq -
+prefix hides proccesses associated with a single routing table.
 .It Fl U Oo - Oc Ns Ar user
 Show only those processes owned by username or UID
 .Ar user .
@@ -371,6 +380,14 @@ Toggle the display of system processes.
 Set the delay between screen updates to
 .Ar time
 seconds.
+.It T Oo - Oc Ns Ar rtable
+Display only processes associated with the specified routing table
+.Ar rtable .
+.Sq T+
+shows processes associated with all routing tables.
+The
+.Sq -
+prefix hides proccesses associated with a single routing table.
 .It u Oo - Oc Ns Ar user
 Show only those processes owned by username or UID
 .Ar user .
Index: top.c
===================================================================
RCS file: /cvs/src/usr.bin/top/top.c,v
retrieving revision 1.104
diff -u -p -r1.104 top.c
--- top.c       26 Jul 2020 21:59:16 -0000      1.104
+++ top.c       9 Aug 2020 18:06:43 -0000
@@ -29,6 +29,7 @@
  */
 
 #include <sys/types.h>
+#include <sys/socket.h>
 #include <curses.h>
 #include <err.h>
 #include <errno.h>
@@ -132,6 +133,7 @@ struct statics  statics;
 #define CMD_pagedown   26
 #define CMD_pageup     27
 #define CMD_grep2      28
+#define CMD_rtable     29
 
 static void
 usage(void)
@@ -140,7 +142,7 @@ usage(void)
 
        fprintf(stderr,
            "usage: %s [-1bCHIinqSu] [-d count] [-g string] [-o [-]field] "
-           "[-p pid] [-s time]\n\t[-U [-]user] [number]\n",
+           "[-p pid] [-s time]\n\t[-T [-]rtable] [-U [-]user] [number]\n",
            __progname);
 }
 
@@ -207,13 +209,39 @@ filterpid(char buf[], int hl)
        return 0;
 }
 
+static int
+filterrtable(char buf[])
+{
+       const char *errstr;
+       char *bufp = buf;
+       uint32_t *rtableidp;
+       uint32_t rtableid;
+
+       if (bufp[0] == '-') {
+               bufp++;
+               rtableidp = &ps.hrtableid;
+               ps.rtableid = -1;
+       } else {
+               rtableidp = &ps.rtableid;
+               ps.hrtableid = -1;
+       }
+
+       rtableid = strtonum(bufp, 0, RT_TABLEID_MAX, &errstr);
+       if (errstr == NULL) {
+               *rtableidp = rtableid;
+               return 0;
+       }
+
+       return -1;
+}
+
 static void
 parseargs(int ac, char **av)
 {
        char *endp;
        int i;
 
-       while ((i = getopt(ac, av, "1SHICbinqus:d:p:U:o:g:")) != -1) {
+       while ((i = getopt(ac, av, "1SHICbinqus:d:p:U:o:g:T:")) != -1) {
                switch (i) {
                case '1':
                        combine_cpus = 1;
@@ -305,6 +333,12 @@ parseargs(int ac, char **av)
                                err(1, NULL);
                        break;
 
+               case 'T':
+                       if (filterrtable(optarg) == -1)
+                               new_message(MT_delayed,
+                                   "%s: invalid routing table", optarg);
+                       break;
+
                default:
                        usage();
                        exit(1);
@@ -357,6 +391,8 @@ main(int argc, char *argv[])
        ps.uid = (uid_t)-1;
        ps.huid = (uid_t)-1;
        ps.pid = (pid_t)-1;
+       ps.rtableid = -1;
+       ps.hrtableid = -1;
        ps.command = NULL;
 
        /* get preset options from the environment */
@@ -632,7 +668,7 @@ rundisplay(void)
        char ch, *iptr;
        int change, i;
        struct pollfd pfd[1];
-       static char command_chars[] = "\f qh?en#sdkriIuSopCHg+P109)(/";
+       static char command_chars[] = "\f qh?en#sdkriIuSopCHg+P109)(/T";
 
        /*
         * assume valid command unless told
@@ -973,6 +1009,8 @@ rundisplay(void)
                        ps.uid = (uid_t)-1;     /* uid */
                        ps.huid = (uid_t)-1;
                        ps.pid = (pid_t)-1;     /* pid */
+                       ps.rtableid = -1;       /* rtableid */
+                       ps.hrtableid = -1;
                        ps.system = old_system;
                        ps.command = NULL;      /* grep */
                        hlpid = (pid_t)-1;
@@ -996,6 +1034,24 @@ rundisplay(void)
                        skip -= max_topn / 2;
                        if (skip < 0)
                                skip = 0;
+                       break;
+               case CMD_rtable:
+                       new_message(MT_standout,
+                           "Routing table: ");
+                       if (readline(tempbuf, sizeof(tempbuf)) > 0) {
+                               if (tempbuf[0] == '+' && tempbuf[1] == '\0') {
+                                       ps.rtableid = -1;
+                                       ps.hrtableid = -1;
+                               } else if (filterrtable(tempbuf) == -1) {
+                                       new_message(MT_standout,
+                                           " %s: invalid routing table",
+                                           tempbuf[0] == '-' ? tempbuf + 1 :
+                                           tempbuf);
+                                       no_command = true;
+                               }
+                               putr();
+                       } else
+                               clear_message();
                        break;
                default:
                        new_message(MT_standout, " BAD CASE IN SWITCH!");

Reply via email to