On Tue, Aug 25, 2020 at 09:34:55AM +0200, Klemens Nanni wrote:
> On Mon, Aug 24, 2020 at 12:52:46AM +0200, Klemens Nanni wrote:
> > Add `t' to swap the WAIT column with RTABLE (and vice versa);  WAIT
> > is wide enough to fit RTABLE, somewhat adds additional value to STATE
> > and seems therefore most appropiate to hide in favour of RTABLE.
> > 
> > Internally, I renamed the existing CMD_rtable command to filter routing
> > tables into CMD_rtableid in order to use CMD_rtable for showing them as
> > that seems in line with how CMD_threads is named to show threads, etc.
> > 
> > format_header() semantics are slightly reworked/improved now that there
> > are two changing fields;  instead of conditionally changing, it now
> > always updates it accordingly - i think that makes it clearer overall.
> > 
> > format_next_process() now uses strlcpy() instead of snprintf() for plain
> > strings as I had to touch those lines anyway.
> > 
> > Filtering rtables with `T' does not toggle the column, just like
> > filtering users with `u' does not toggle between user and thread id.
> > 
> > Feedback? OK?
> New diff after feedback from jmc and a little cleanup I just committed
> to avoid churn here.

I like it!
ok remi@

> 
> Index: display.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/top/display.c,v
> retrieving revision 1.64
> diff -u -p -r1.64 display.c
> --- display.c 23 Aug 2020 21:11:55 -0000      1.64
> +++ display.c 25 Aug 2020 07:33:14 -0000
> @@ -826,6 +826,7 @@ show_help(void)
>           "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"
> +         "t            - toggle the display of routing tables\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.109
> diff -u -p -r1.109 machine.c
> --- machine.c 25 Aug 2020 07:27:34 -0000      1.109
> +++ machine.c 25 Aug 2020 07:33:14 -0000
> @@ -75,8 +75,9 @@ struct handle {
>  static char header[] =
>       "  PID X        PRI NICE  SIZE   RES STATE     WAIT      TIME    CPU 
> COMMAND";
>  
> -/* 0123456   -- field to fill in starts at header+6 */
> +/* offsets in the header line to start alternative columns */
>  #define UNAME_START 6
> +#define RTABLE_START 46
>  
>  #define Proc_format \
>       "%5d %-8.8s %3d %4d %5s %5s %-9s %-7.7s %6s %5.2f%% %s"
> @@ -226,16 +227,16 @@ machine_init(struct statics *statics)
>  }
>  
>  char *
> -format_header(char *second_field)
> +format_header(char *second_field, char *eighth_field)
>  {
> -     char *field_name, *thread_field = "     TID";
> -     char *ptr;
> -
> -     field_name = second_field ? second_field : thread_field;
> +     char *second_fieldp = second_field, *eighth_fieldp = eighth_field, *ptr;
>  
>       ptr = header + UNAME_START;
> -     while (*field_name != '\0')
> -             *ptr++ = *field_name++;
> +     while (*second_fieldp != '\0')
> +             *ptr++ = *second_fieldp++;
> +     ptr = header + RTABLE_START;
> +     while (*eighth_fieldp != '\0')
> +             *ptr++ = *eighth_fieldp++;
>       return (header);
>  }
>  
> @@ -544,13 +545,12 @@ skip_processes(struct handle *hndl, int 
>  
>  char *
>  format_next_process(struct handle *hndl, const char *(*get_userid)(uid_t, 
> int),
> -    pid_t *pid)
> +    int rtable, pid_t *pid)
>  {
> -     char *p_wait;
>       struct kinfo_proc *pp;
>       int cputime;
>       double pct;
> -     char second_buf[16];
> +     char second_buf[16], eighth_buf[8];
>  
>       /* find and remember the next proc structure */
>       pp = *(hndl->next_proc++);
> @@ -566,7 +566,11 @@ format_next_process(struct handle *hndl,
>               strlcpy(second_buf, (*get_userid)(pp->p_ruid, 0),
>                   sizeof(second_buf));
>  
> -     p_wait = pp->p_wmesg[0] ? pp->p_wmesg : "-";
> +     if (rtable)
> +             snprintf(eighth_buf, sizeof(eighth_buf), "%7d", pp->p_rtableid);
> +     else
> +             strlcpy(eighth_buf, pp->p_wmesg[0] ? pp->p_wmesg : "-",
> +                 sizeof(eighth_buf));
>  
>       /* format this entry */
>       snprintf(fmt, sizeof(fmt), Proc_format, pp->p_pid, second_buf,
> @@ -575,7 +579,7 @@ format_next_process(struct handle *hndl,
>           format_k(pagetok(pp->p_vm_rssize)),
>           (pp->p_stat == SSLEEP && pp->p_slptime > maxslp) ?
>           "idle" : state_abbr(pp),
> -         p_wait, format_time(cputime), 100.0 * pct,
> +         eighth_buf, format_time(cputime), 100.0 * pct,
>           printable(format_comm(pp)));
>  
>       *pid = pp->p_pid;
> Index: machine.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/top/machine.h,v
> retrieving revision 1.30
> diff -u -p -r1.30 machine.h
> --- machine.h 23 Aug 2020 21:11:55 -0000      1.30
> +++ machine.h 25 Aug 2020 07:33:14 -0000
> @@ -77,6 +77,7 @@ 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             rtable; /* show routing tables */
>       int             rtableid;       /* only this rtable (unless rtableid == 
> -1) */
>       int             hrtableid;      /* hide this rtable (unless hrtableid 
> == -1) */
>       char           *command;/* only this command (unless == NULL) */
> @@ -87,14 +88,14 @@ extern int      display_init(struct stat
>  
>  /* machine.c */
>  extern int      machine_init(struct statics *);
> -extern char    *format_header(char *);
> +extern char    *format_header(char *, char *);
>  extern void     get_system_info(struct system_info *);
>  extern struct handle
>  *get_process_info(struct system_info *, struct process_select *,
>                int (*) (const void *, const void *));
>  extern void     skip_processes(struct handle *, int);
>  extern char    *format_next_process(struct handle *,
> -              const char *(*)(uid_t, int), pid_t *);
> +              const char *(*)(uid_t, int), int, pid_t *);
>  extern uid_t    proc_owner(pid_t);
>  
>  extern struct kinfo_proc     *getprocs(int, int, int *);
> Index: top.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/top/top.1,v
> retrieving revision 1.76
> diff -u -p -r1.76 top.1
> --- top.1     23 Aug 2020 21:11:55 -0000      1.76
> +++ top.1     25 Aug 2020 07:33:16 -0000
> @@ -388,6 +388,8 @@ shows processes associated with all rout
>  The
>  .Sq -
>  prefix hides proccesses associated with a single routing table.
> +.It t
> +Toggle the display of routing tables.
>  .It u Oo - Oc Ns Ar user
>  Show only those processes owned by username or UID
>  .Ar user .
> @@ -463,6 +465,10 @@ number on which the process is bound.
>  .It WAIT
>  A description of the wait channel the process is sleeping on if it's
>  asleep.
> +.It RTABLE
> +The routing table, used instead of WAIT if
> +.Fl t
> +is specified.
>  .It TIME
>  The number of system and user CPU seconds that the process has used.
>  .It CPU
> Index: top.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/top/top.c,v
> retrieving revision 1.105
> diff -u -p -r1.105 top.c
> --- top.c     23 Aug 2020 21:11:55 -0000      1.105
> +++ top.c     25 Aug 2020 07:33:16 -0000
> @@ -133,7 +133,8 @@ struct statics  statics;
>  #define CMD_pagedown 26
>  #define CMD_pageup   27
>  #define CMD_grep2    28
> -#define CMD_rtable   29
> +#define CMD_rtableid 29
> +#define CMD_rtable   30
>  
>  static void
>  usage(void)
> @@ -141,7 +142,7 @@ usage(void)
>       extern char *__progname;
>  
>       fprintf(stderr,
> -         "usage: %s [-1bCHIinqSu] [-d count] [-g string] [-o [-]field] "
> +         "usage: %s [-1bCHIinqStu] [-d count] [-g string] [-o [-]field] "
>           "[-p pid] [-s time]\n\t[-T [-]rtable] [-U [-]user] [number]\n",
>           __progname);
>  }
> @@ -241,7 +242,7 @@ parseargs(int ac, char **av)
>       char *endp;
>       int i;
>  
> -     while ((i = getopt(ac, av, "1SHICbinqus:d:p:U:o:g:T:")) != -1) {
> +     while ((i = getopt(ac, av, "1SHICbinqus:d:p:U:o:g:T:t")) != -1) {
>               switch (i) {
>               case '1':
>                       combine_cpus = 1;
> @@ -339,6 +340,10 @@ parseargs(int ac, char **av)
>                                   "%s: invalid routing table", optarg);
>                       break;
>  
> +             case 't':
> +                     ps.rtable = true;
> +                     break;
> +
>               default:
>                       usage();
>                       exit(1);
> @@ -370,7 +375,9 @@ parseargs(int ac, char **av)
>  int
>  main(int argc, char *argv[])
>  {
> -     char *uname_field = "USERNAME", *header_text, *env_top;
> +     char *header_text, *env_top;
> +     char *uname_field = "USERNAME", *thread_field = "     TID";
> +     char *wait_field = "WAIT   ", *rtable_field = " RTABLE";
>       const char *(*get_userid)(uid_t, int) = user_from_uid;
>       char **preset_argv = NULL, **av = argv;
>       int preset_argc = 0, ac = argc, active_procs, i, ncpuonline_now;
> @@ -391,6 +398,7 @@ main(int argc, char *argv[])
>       ps.uid = (uid_t)-1;
>       ps.huid = (uid_t)-1;
>       ps.pid = (pid_t)-1;
> +     ps.rtable = false;
>       ps.rtableid = -1;
>       ps.hrtableid = -1;
>       ps.command = NULL;
> @@ -573,7 +581,9 @@ restart:
>               i_message();
>  
>               /* get the string to use for the process area header */
> -             header_text = format_header(ps.threads ? NULL : uname_field);
> +             header_text = format_header(
> +                 ps.threads ? thread_field : uname_field,
> +                 ps.rtable ? rtable_field : wait_field);
>  
>               /* update the header area */
>               i_header(header_text);
> @@ -613,7 +623,8 @@ restart:
>                               char * s;
>  
>                               s = format_next_process(processes,
> -                                 ps.threads ? NULL : get_userid, &pid);
> +                                 ps.threads ? NULL : get_userid, ps.rtable,
> +                                 &pid);
>                               i_process(i, s, pid == hlpid);
>                       }
>               }
> @@ -668,7 +679,7 @@ rundisplay(void)
>       char ch, *iptr;
>       int change, i;
>       struct pollfd pfd[1];
> -     static char command_chars[] = "\f qh?en#sdkriIuSopCHg+P109)(/T";
> +     static char command_chars[] = "\f qh?en#sdkriIuSopCHg+P109)(/Tt";
>  
>       /*
>        * assume valid command unless told
> @@ -1035,7 +1046,7 @@ rundisplay(void)
>                       if (skip < 0)
>                               skip = 0;
>                       break;
> -             case CMD_rtable:
> +             case CMD_rtableid:
>                       new_message(MT_standout,
>                           "Routing table: ");
>                       if (readline(tempbuf, sizeof(tempbuf)) > 0) {
> @@ -1052,6 +1063,12 @@ rundisplay(void)
>                               putr();
>                       } else
>                               clear_message();
> +                     break;
> +             case CMD_rtable:
> +                     ps.rtable = !ps.rtable;
> +                     new_message(MT_standout | MT_delayed,
> +                         " %sisplaying routing tables.",
> +                         ps.rtable ? "D" : "Not d");
>                       break;
>               default:
>                       new_message(MT_standout, " BAD CASE IN SWITCH!");
> 

Reply via email to