]> granicus.if.org Git - procps-ng/commitdiff
for Jim
authoralbert <>
Sat, 7 Dec 2002 22:36:21 +0000 (22:36 +0000)
committeralbert <>
Sat, 7 Dec 2002 22:36:21 +0000 (22:36 +0000)
top.1
top.c
top.h

diff --git a/top.1 b/top.1
index fb110397fcd8894cce06baafbe6a303527f5cbe5..bb5fc3661f2d943bdb06e786850e0f86bf795bbc 100644 (file)
--- a/top.1
+++ b/top.1
@@ -254,7 +254,7 @@ Starts \*(Me with the last remembered 'i' state reversed.
 When this toggle is \*F, tasks that are idled or zombied will not be displayed.
 
 .TP 5
-\-\fBn\fR :\fB Number of iterations\fR limit as:\ \ \fB -n number\fR
+\-\fBn\fR :\fB Number of iterations\fR limit as:\fB\ \ -n number\fR
 Specifies the maximum number of iterations, or frames, \*(Me should
 produce before ending.
 
@@ -303,7 +303,7 @@ For additional information on sort provisions \*(Xt 3c. TASK Area Commands.
 
 .TP 3
 a:\fB PID\fR \*(EM Process Id\fR
-The task's unique process ID, which periodically wraps at 32767,
+The task's unique process ID, which periodically wraps,
 though never restarting at zero.
 
 .TP 3
@@ -311,22 +311,20 @@ b:\fB PPID\fR \*(EM Parent Process Pid\fR
 The process ID of a task's parent.
 
 .TP 3
-c:\fB PGID\fR \*(EM Process Group Id\fR
-The grouping of tasks which becomes part of job control.
-It is used for distribution of signals and to arbitrate terminal I/O requests.
-There is one process group per pipeline.
+c:\fB RUSER\fR \*(EM Real User Name\fR
+The real user name of the task's owner.
 
 .TP 3
 d:\fB UID\fR \*(EM User Id\fR
-The user ID of the task's owner.
+The effective user ID of the task's owner.
 
 .TP 3
-e:\fB USER\fR \*(EM User Name
-The user name of the task's owner.
+e:\fB USER\fR \*(EM User Name\fR
+The effective user name of the task's owner.
 
 .TP 3
-f:\fB GROUP\fR \*(EM Group Name
-The group name of the task's owner.
+f:\fB GROUP\fR \*(EM Group Name\fR
+The effective group name of the task's owner.
 
 .TP 3
 g:\fB TTY\fR \*(EM Controlling Tty
@@ -1179,8 +1177,8 @@ This entirely new and enhanced replacement was written by:
 ..
 
 With invaluable help from:
-   Craig Small, <csmall@small.dropbear.id.au>
    Albert D\. Cahalan, <albert@users.sf.net>
+   Craig Small, <csmall@small.dropbear.id.au>
 
 .ig
 .rj 2
diff --git a/top.c b/top.c
index bd6e9a3ff8a29db1bdde70cfd5e111d68d031bb7..b70f57beac06bd0fdf09c14220673197268c3ba7 100644 (file)
--- a/top.c
+++ b/top.c
@@ -98,8 +98,7 @@ static int Screen_cols, Screen_rows, Max_lines;
 static int Msg_row;
 
         /* Global/Non-windows mode stuff that is NOT persistent */
-static int Crufty_rcf = 0,      // if we read an old config, write one too
-           No_ksyms = -1,       // set to '0' if ksym avail, '1' otherwise
+static int No_ksyms = -1,       // set to '0' if ksym avail, '1' otherwise
            PSDBopen = 0,        // set to '1' if psdb opened (now postponed)
            Batch = 0,           // batch mode, collect no input, dumb output
            Loops = -1,          // number of iterations, -1 loops forever
@@ -144,18 +143,18 @@ static WIN_t Winstk [GROUPSMAX],
            and/or that would be too cumbersome managed as parms,
            and/or that are simply more efficiently handled as globals
            (first 2 persist beyond a single frame, changed infrequently) */
-static int       Frams_libflags;  // current PROC_FIILxxx flags (0 = need new)
-//atic int       Frams_maxcmdln;  // the largest from the 4 windows
-static unsigned  Frame_maxtask;   // last known number of active tasks
-                                  // ie. current 'size' of proc table
-static unsigned  Frame_running,   // state categories for this frame
+static int       Frames_libflags;       // PROC_FILLxxx flags (0 = need new)
+//atic int       Frames_maxcmdln;       // the largest from the 4 windows
+static unsigned  Frame_maxtask;         // last known number of active tasks
+                                        // ie. current 'size' of proc table
+static unsigned  Frame_running,         // state categories for this frame
                  Frame_sleepin,
                  Frame_stopped,
                  Frame_zombied;
-static float     Frame_tscale;    // so we can '*' vs. '/' WHEN 'pcpu'
-static int       Frame_srtflg,    // the subject window's sort direction
-                 Frame_ctimes,    // the subject window's ctimes flag
-                 Frame_cmdlin;    // the subject window's cmdlin flag
+static float     Frame_tscale;          // so we can '*' vs. '/' WHEN 'pcpu'
+static int       Frame_srtflg,          // the subject window's sort direction
+                 Frame_ctimes,          // the subject window's ctimes flag
+                 Frame_cmdlin;          // the subject window's cmdlin flag
         /* ////////////////////////////////////////////////////////////// */
 
 \f
@@ -947,7 +946,7 @@ static void prochlp (proc_t *this)
    // this task wins it's displayable screen row lottery... */
    this->pcpu = tics;
    strim(1, this->cmd);
-// if (Frams_maxcmdln) { }
+// if (Frames_maxcmdln) { }
    // shout this to the world with the final call (or us the next time in)
    Frame_maxtask++;
 }
@@ -1163,7 +1162,6 @@ static const FLD_t *ft_idx_to_ptr (const int i) {
    if (i >= MAXTBL(Fieldstab)) return NULL;
    return Fieldstab + i;
 }
-#endif
 
 
         // convert, or -1 for failure
@@ -1174,6 +1172,7 @@ static int ft_ptr_to_idx (const FLD_t *p) {
    if (i >= MAXTBL(Fieldstab)) return -1;
    return i;
 }
+#endif
 
 
 #if 0
@@ -1200,7 +1199,9 @@ static void rc_bugless (const RCF_t *const rc) {
          * For each of the 4 windows:
          *   line a: contains winname, fieldscur
          *   line b: contains winflags, sortindx, maxtasks
-         *   line c: contains summclr, msgsclr, headclr, taskclr */
+         *   line c: contains summclr, msgsclr, headclr, taskclr
+         *   line d: if present, would crash procps-3.1.1
+         */
 static int rc_read_new (const char *const buf, RCF_t *rc) {
    int i;
    int cnt;
@@ -1237,12 +1238,19 @@ static int rc_read_new (const char *const buf, RCF_t *rc) {
       if (cnt != 4) return -(11+100*i);
       cp = strchr(cp, '\n');
       if (!cp++) return -(12+100*i);
+      while (*cp == '\t') {  // skip unknown per-window settings
+        cp = strchr(cp, '\n');
+        if (!cp++) return -(13+100*i);
+      }
    }
    return 13;
 }
 
 
+
 static int rc_read_old (const char *const buf, RCF_t *rc) {
+   const char std[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzJj......";
+   const char old[] = "AaBb..CcDd..GgHhIiYyEeWw..FfMmOoTtKkLlPpJjSsVvXxUuZz[{QqNnRr";
    unsigned u;
    const char *cp;
    unsigned c_show = 0;
@@ -1254,6 +1262,7 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
    cp = buf+2;  // skip the "\n\n" we stuck at the beginning
    u = 0;
    for (;;) {
+      const char *tmp;
       if (u+1 >= sizeof rc->win[0].fieldscur) return -1;
       int c = *cp++;
       if (c == '\0') return -2;
@@ -1262,15 +1271,9 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
       if (~c & 0x20) c_show |= 1 << (c & 0x1f); // 0x20 means lowercase means hidden
       if (scoreboard[c|0xe0u]) badchar++;       // duplicates not allowed
       scoreboard[c|0xe0u]++;
-      if (c == '|') continue;   // Rik's top ships with a garbage character
-      if (c == '[') c = 'Y';    // Rik's top ships with 3x of "#C"
-      if (c == '{') c = 'y';    // another one... and '}' to please Jim's editor
-      if (c == 'N') c = 'n';    // usage differs, so turn this off
-      if (c == 'Q') c = 'q';    // usage differs, so turn this off
-      if (c == 'R') c = 'r';    // usage differs, so turn this off
-      c = ft_cvt_char(FT_OLD_fmt, FT_NEW_fmt, c);
-      if (!c) return -4;        // error value
-      if (c == '.') return -5;  // error value
+      tmp = strchr(old,c);
+      if (tmp) c = *((tmp-old)+std);
+      else     c = '.';
       if (scoreboard[c&0x1fu]) badchar++;       // duplicates not allowed
       scoreboard[c&0x1fu]++;
       rc->win[0].fieldscur[u++] = c;
@@ -1278,8 +1281,8 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
    rc->win[0].fieldscur[u++] = '\0';
    if (u < 21) return -6;  // catch junk, not good files (had 23 chars in one)
    if (u > 33) return -7;  // catch junk, not good files (had 29 chars in one)
-// fprintf(stderr,"badchar: %d\n",badchar); sleep(2);
-   if (badchar > 3) return -8;          // too much junk
+// fprintf(stderr, "badchar: %d\n", badchar); sleep(2);
+   if (badchar > 8) return -8;          // too much junk
    if (!c_show) return -9;              // nothing was shown
 
    // rest of file is optional, but better look right if it exists
@@ -1296,9 +1299,9 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
          case ' ':
          case '.':
          case '0' ... '9':
-            return -15;                     // not supposed to have digits here
+            return -15;                 // not supposed to have digits here
 
-//       case 's':                          // mostly for global rcfile
+//       case 's':                      // mostly for global rcfile
 //          rc->mode_secure = 1;
 //          break;
          case 'S':
@@ -1310,7 +1313,7 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
          case 'i':
             rc->win[0].winflags &= ~Show_IDLEPS;
             break;
-         case 'H':                          // 'H' = show threads (yea, sure)
+         case 'H':                      // 'H' = show threads (yea, sure)
             //rc->win[0].winflags |= ;
             break;
          case 'm':
@@ -1334,9 +1337,9 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
             c = 0; // for scoreboard
             rc->win[0].sortindx = P_CPU;
             break;
-         case 'A':
+         case 'A':                      // supposed to be start_time
             c = 0; // for scoreboard
-            rc->win[0].sortindx = P_PID;    // was by start_time (non-display)
+            rc->win[0].sortindx = P_PID;
             break;
          case 'T':
             c = 0; // for scoreboard
@@ -1351,7 +1354,7 @@ static int rc_read_old (const char *const buf, RCF_t *rc) {
             // just ignore it, except for the scoreboard of course
             break;
       }
-      if (scoreboard[c]) return -16;        // duplicates not allowed
+      if (scoreboard[c]) return -16;    // duplicates not allowed
       scoreboard[c] = 1;
    }
    return 17;
@@ -1393,7 +1396,7 @@ static void rc_write_new (FILE *fp) {
    }
 }
 
-
+#if 0
 static void rc_write_old (FILE *fp) {
    char buf[SMLBUFSIZ];
    char *cp = Curwin->rc.fieldscur;
@@ -1462,13 +1465,13 @@ static void rc_write_old (FILE *fp) {
    *cp++ = '\0';
    fprintf(fp, "%s\n\n\n", buf);            // important "\n\n" separator!
 }
-
+#endif
 
 static const char *rc_write_whatever (void) {
    FILE *fp = fopen(Rc_name, "w");
 
    if (!fp) return strerror(errno);
-   if (Crufty_rcf) rc_write_old(fp);
+//   if (Crufty_rcf) rc_write_old(fp);
    rc_write_new(fp);
    fclose(fp);
    return NULL;
@@ -1541,17 +1544,17 @@ static void confighlp (char *fields) {
             else break;
          }
       }
-      while (lower[c&0x1f] > 1) {       // got too many a..z
+      while (lower[c&0x1f] > 1) {               // got too many a..z
          lower[c&0x1f]--;
          cp = strchr(fields, c);
          memmove(cp, cp+1, strlen(cp));
       }
-      while (upper[c&0x1f] > 1) {       // got too many A..Z
+      while (upper[c&0x1f] > 1) {               // got too many A..Z
          upper[c&0x1f]--;
          cp = strchr(fields, toupper(c));
          memmove(cp, cp+1, strlen(cp));
       }
-      if (!upper[c&0x1f] && !lower[c&0x1f]) {  // both missing
+      if (!upper[c&0x1f] && !lower[c&0x1f]) {   // both missing
          lower[c&0x1f]++;
          memmove(fields+1, fields, strlen(fields)+1);
          fields[0] = c;
@@ -1612,9 +1615,12 @@ static void configs_read (void)
          fbuf[0] = '\n';
          fbuf[1] = '\n';
          fbuf[num+2] = '\0';
-         if (rc_read_old(fbuf, &rcf) > 0) Crufty_rcf = 1;
-         else rcf = def_rcf;                     // on failure, maybe mangled
-         rc_read_new(fbuf, &rcf);
+//fprintf(stderr,"rc_read_old returns %d\n",rc_read_old(fbuf, &rcf));
+//sleep(2);
+         if (rc_read_new(fbuf, &rcf) < 0) {
+            rcf = def_rcf;                       // on failure, maybe mangled
+            if (rc_read_old(fbuf, &rcf) < 0) rcf = def_rcf;
+         }
          delay = rcf.delay_time;
       }
       close(fd);
@@ -1719,6 +1725,12 @@ static void parse_args (char **args)
             case 'S':
                TOGw(Curwin, Show_CTIMES);
                break;
+//          case 'u':
+//             if (cp[1]) cp++;
+//             else if (*args) cp = *args++;
+//             else std_err("-u missing name");
+//             cp += snprintf(Curwin->colusrnam, USRNAMSIZ-1, "%s", cp);
+//             break;
             default :
                std_err(fmtmk("unknown argument '%c'\nusage:\t%s%s"
                   , *cp, Myname, usage));
@@ -1800,9 +1812,9 @@ static void display_fields (const char *fields, const char *xtra)
    for (i = 0; fields[i]; ++i) {
       const FLD_t *f = ft_get_ptr(FT_NEW_fmt, fields[i]);
       int b = isupper(fields[i]);
-      if (!f) continue;                // hey, should be std_err!
-         /* advance past any leading spaces */
-      for (p = f->head; ' ' == *p; ++p)
+
+      if (!f) continue;                 // hey, should be std_err!
+      for (p = f->head; ' ' == *p; ++p) // advance past any leading spaces
          ;
       PUTT("%s%s%c %c: %-10s = %s"
          , tg2((i / rmax) * cmax, (i % rmax) + yRSVD)
@@ -1935,8 +1947,8 @@ static void reframewins (void)
    const char *h;
    int i, needpsdb = 0;
 
-// Frams_libflags = 0;  // should be called only when it's zero
-// Frams_maxcmdln = 0;  // becomes largest from up to 4 windows, if visible
+// Frames_libflags = 0;  // should be called only when it's zero
+// Frames_maxcmdln = 0;  // to become largest from up to 4 windows, if visible
    w = Curwin;
    do {
       if (!Rc.mode_altscr || CHKw(w, VISIBLE_tsk)) {
@@ -1976,12 +1988,12 @@ static void reframewins (void)
             if (P_CMD == w->procflags[i]) {
                s = scat(s, fmtmk(Fieldstab[P_CMD].fmts, w->maxcmdln, w->maxcmdln, h));
                if (CHKw(w, Show_CMDLIN)) {
-                  Frams_libflags |= L_CMDLINE;
-//                if (w->maxcmdln > Frams_maxcmdln) Frams_maxcmdln = w->maxcmdln;
+                  Frames_libflags |= L_CMDLINE;
+//                if (w->maxcmdln > Frames_maxcmdln) Frames_maxcmdln = w->maxcmdln;
                }
             } else
                s = scat(s, h);
-            Frams_libflags |= Fieldstab[w->procflags[i]].lflg;
+            Frames_libflags |= Fieldstab[w->procflags[i]].lflg;
          }
       }
       if (Rc.mode_altscr) w = w->next;
@@ -1997,11 +2009,11 @@ static void reframewins (void)
             PSDBopen = 1;
       }
    }
-   if (Frams_libflags & L_EITHER) {
-      Frams_libflags &= ~L_EITHER;
-      if (!(Frams_libflags & L_stat)) Frams_libflags |= L_status;
+   if (Frames_libflags & L_EITHER) {
+      Frames_libflags &= ~L_EITHER;
+      if (!(Frames_libflags & L_stat)) Frames_libflags |= L_status;
    }
-   if (!Frams_libflags) Frams_libflags = L_DEFAULT;
+   if (!Frames_libflags) Frames_libflags = L_DEFAULT;
 }
 
 
@@ -2214,7 +2226,7 @@ static void wins_resize (int dont_care_sig)
    Pseudo_scrn = alloc_r(Pseudo_scrn, Pseudo_size);
 
    // force rebuild of column headers AND libproc/readproc requirements
-   Frams_libflags = 0;
+   Frames_libflags = 0;
 }
 
 
@@ -2598,7 +2610,7 @@ static void do_key (unsigned c)
       ( At this point we have a human being involved and so have all the time )
       ( in the world.  We can afford a few extra cpu cycles every now & then! )
     */
-   Frams_libflags = 0;
+   Frames_libflags = 0;
 }
 
 
@@ -2668,7 +2680,7 @@ static proc_t **summary_show (void)
       sleep(1);
    } else
       putp(Batch ? "\n\n" : Cap_home);
-   p_table = procs_refresh(p_table, Frams_libflags);
+   p_table = procs_refresh(p_table, Frames_libflags);
 
    /*
     ** Display Uptime and Loadavg */
@@ -2936,10 +2948,8 @@ static void window_show (proc_t **ppt, WIN_t *q, int *lscr)
 
    while ( -1 != ppt[i]->pid && *lscr < Max_lines
    &&  (!q->winlines || (lwin <= q->winlines)) ) {
-      if ((CHKw(q, Show_IDLEPS)
-      || ('S' != ppt[i]->state && 'Z' != ppt[i]->state))
-      && ((!q->colusrnam[0])
-      || (!strcmp(q->colusrnam, ppt[i]->euser)) ) ) {
+      if ((CHKw(q, Show_IDLEPS) || ('S' != ppt[i]->state && 'Z' != ppt[i]->state))
+      && ((!q->colusrnam[0]) || (!strcmp(q->colusrnam, ppt[i]->euser)))) {
          /*
           ** Display a process Row */
          task_show(q, ppt[i]);
@@ -3020,7 +3030,7 @@ static void frame_make (void)
 
    /* note: except for PROC_PID, all libproc flags are managed by
             reframewins(), who also builds each window's column headers */
-   if (!Frams_libflags) {
+   if (!Frames_libflags) {
       reframewins();
       memset(Pseudo_scrn, '\0', Pseudo_size);
    }
@@ -3051,8 +3061,9 @@ static void frame_make (void)
    /* clear to end-of-screen (critical if last window is 'idleps off'),
       then put the cursor in-its-place, and rid us of any prior frame's msg
       (main loop must iterate such that we're always called before sleep) */
-   PUTT("%s%s%s"
-      , (scrlins < Max_lines) ? Cap_clr_eos : ""
+   PUTT("%s%s%s%s"
+      , scrlins < Max_lines ? "\n" : ""
+      , scrlins < Max_lines ? Cap_clr_eos : ""
       , tg2(0, Msg_row)
       , Cap_clr_eol);
    fflush(stdout);
diff --git a/top.h b/top.h
index ca23ba4be87c2f2e5423d4a585cb483843b3cf27..49a514a6268d69221677cc2e8569c50087d4e808 100644 (file)
--- a/top.h
+++ b/top.h
@@ -324,7 +324,7 @@ typedef struct WIN_t {
 
         /* The default fields displayed and their order,
            if nothing is specified by the loser, oops user */
-#define DEF_FIELDS  "AEHIOQTWKNMXbcdfgjplrsuvyz"
+#define DEF_FIELDS  "AEHIOQTWKNMbcdfgjplrsuvyzX"
         /* Pre-configured field groupss */
 #define JOB_FIELDS  "ABXcefgjlrstuvyzMKNHIWOPQD"
 #define MEM_FIELDS  "ANOPQRSTUVXbcdefgjlmyzWHIK"