Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!watmath!clyde!rutgers!ames!oliveb!sun!gorodish!guy From: guy@gorodish.UUCP Newsgroups: comp.bugs.4bsd Subject: Re: Some miscellanous "ps" fixes and improvements Message-ID: <12375@sun.uucp> Date: Thu, 29-Jan-87 19:20:26 EST Article-I.D.: sun.12375 Posted: Thu Jan 29 19:20:26 1987 Date-Received: Sat, 31-Jan-87 04:35:51 EST References: <12181@sun.uucp> Sender: news@sun.uucp Lines: 527 Summary: Oops! One change got dropped.... > 5) It might be useful to print the time a process started in at > least one of the formats; again, this suggestion and the code > implementing this (printing the start date/time in the "u" format) > came from Rick Adams. Except that *his* code actually *set* "ap->a_start". Here's a corrected version of the "diff"s. *** /arch/4.3/usr/src/bin/ps.c Thu May 8 12:49:00 1986 --- ps.c Thu Jan 29 16:19:24 1987 *************** *** 91,96 **** --- 91,98 ---- #define X_CMAP 27 "_buffers", #define X_BUFFERS 28 + "_boottime", + #define X_BOOTTIME 29 "" }; *************** *** 117,122 **** --- 119,125 ---- dev_t a_ttyd; time_t a_cpu; size_t a_maxrss; + struct timeval a_start; }; char *lhdr; *************** *** 143,148 **** --- 146,153 ---- struct proc proc[NPROC]; /* a few, for less syscalls */ struct proc *mproc; struct text *text; + struct timeval boottime; + time_t now; union { struct user user; *************** *** 157,163 **** #endif int chkpid = -1; ! int aflg, cflg, eflg, gflg, kflg, lflg, nflg, sflg, uflg, vflg, xflg, Uflg; int nchans; /* total # of wait channels */ char *tptr; --- 162,168 ---- #endif int chkpid = -1; ! int aflg, cflg, eflg, gflg, kflg, lflg, nflg, rflg, sflg, uflg, vflg, xflg, Uflg; int nchans; /* total # of wait channels */ char *tptr; *************** *** 224,229 **** --- 229,249 ---- "calimit", NULL }; + /* + * names listed here get mapped -- this is because only a guru will + * necessarily know that something waiting on "selwait" is waiting + * for a select to finish + */ + struct wchan_map { + char *map_from; + char *map_to; + } wchan_map_list[] = { + { "proc", "child" }, + { "u", "pause" }, + { "selwait", "select" }, + { "mbutl", "socket" }, + { NULL, NULL }, + }; int npr; *************** *** 289,294 **** --- 309,317 ---- case 'n': nflg++; break; + case 'r': + rflg++; + break; case 's': sflg++; break; *************** *** 338,347 **** --- 361,373 ---- openfiles(argc, argv); getkvars(argc, argv); uid = getuid(); + (void) time(&now); printhdr(); procp = getw(nl[X_PROC].n_value); nproc = getw(nl[X_NPROC].n_value); savcom = (struct savcom *)calloc((unsigned) nproc, sizeof (*savcom)); + klseek(kmem, (long)nl[X_BOOTTIME].n_value, 0); + read(kmem, &boottime, sizeof (boottime)); for (i=0; ip_stat == SSTOP)) continue; } + if (rflg && !(mproc->p_stat == SRUN + || mproc->p_pri < PZERO)) + continue; save(); } } *************** *** 413,419 **** klseek(kmem, (long)loc, 0); if (read(kmem, (char *)&word, sizeof (word)) != sizeof (word)) ! printf("error reading kmem at %x\n", loc); return (word); } --- 442,448 ---- klseek(kmem, (long)loc, 0); if (read(kmem, (char *)&word, sizeof (word)) != sizeof (word)) ! printf("error reading %s at %x\n", kmemf, loc); return (word); } *************** *** 444,449 **** --- 473,479 ---- setgid(getgid()); setuid(getuid()); if ((fp = fopen(psdb, "w")) == NULL) { + fprintf(stderr, "ps: "); perror(psdb); exit(1); } else *************** *** 482,487 **** --- 512,518 ---- if ((fp = fopen(psdb, "r")) == NULL) { if (errno == ENOENT) return (0); + fprintf(stderr, "ps: "); perror(psdb); exit(1); } *************** *** 539,544 **** --- 570,576 ---- kmemf = argc > 2 ? argv[2] : "/vmcore"; kmem = open(kmemf, 0); if (kmem < 0) { + fprintf(stderr, "ps: "); perror(kmemf); exit(1); } *************** *** 549,554 **** --- 581,587 ---- memf = "/dev/mem"; mem = open(memf, 0); if (mem < 0) { + fprintf(stderr, "ps: "); perror(memf); exit(1); } *************** *** 557,562 **** --- 590,596 ---- swapf = argc>3 ? argv[3]: "/dev/drum"; swap = open(swapf, 0); if (swap < 0) { + fprintf(stderr, "ps: "); perror(swapf); exit(1); } *************** *** 588,594 **** } if (nl[0].n_type == 0) { ! fprintf(stderr, "%s: No namelist\n", nlistf); exit(1); } if (kflg) { --- 622,628 ---- } if (nl[0].n_type == 0) { ! fprintf(stderr, "ps: %s: No namelist\n", nlistf); exit(1); } if (kflg) { *************** *** 599,605 **** Sysmap = (struct pte *) calloc((unsigned) Syssize, sizeof (struct pte)); if (Sysmap == NULL) { ! fprintf(stderr, "Out of space for Sysmap\n"); exit(1); } addr = (long) nl[X_SYSMAP].n_value; --- 633,639 ---- Sysmap = (struct pte *) calloc((unsigned) Syssize, sizeof (struct pte)); if (Sysmap == NULL) { ! fprintf(stderr, "ps: Out of space for Sysmap\n"); exit(1); } addr = (long) nl[X_SYSMAP].n_value; *************** *** 636,642 **** text = (struct text *) calloc((unsigned) ntext, sizeof (struct text)); if (text == 0) { ! fprintf(stderr, "no room for text table\n"); exit(1); } atext = (struct text *)getw(nl[X_TEXT].n_value); --- 670,676 ---- text = (struct text *) calloc((unsigned) ntext, sizeof (struct text)); if (text == 0) { ! fprintf(stderr, "ps: no room for text table\n"); exit(1); } atext = (struct text *)getw(nl[X_TEXT].n_value); *************** *** 743,754 **** struct lttys *lt; if (chdir("/dev") < 0) { ! perror("/dev"); exit(1); } dialbase = -1; if ((df = opendir(".")) == NULL) { ! fprintf(stderr, "Can't open . in /dev\n"); exit(1); } while ((dbuf = readdir(df)) != NULL) --- 777,789 ---- struct lttys *lt; if (chdir("/dev") < 0) { ! perror("ps: /dev"); exit(1); } dialbase = -1; if ((df = opendir(".")) == NULL) { ! fprintf(stderr, "ps: "); ! perror("Can't open . in /dev"); exit(1); } while ((dbuf = readdir(df)) != NULL) *************** *** 907,914 **** struct stat stb; int x; ! if (u.u_ttyp == 0) return("?"); x = u.u_ttyd & 017; for (dp = &allttys[cand[x]]; dp != &allttys[-1]; dp = &allttys[dp->cand]) { --- 942,951 ---- struct stat stb; int x; ! if (u.u_ttyp == 0) { ! u.u_ttyd = -1; return("?"); + } x = u.u_ttyd & 017; for (dp = &allttys[cand[x]]; dp != &allttys[-1]; dp = &allttys[dp->cand]) { *************** *** 950,964 **** register struct text *xp; char *ttyp, *cmdp; ! if (mproc->p_stat != SZOMB && getu() == 0) ! return; ! ttyp = gettty(); if (xflg == 0 && ttyp[0] == '?' || tptr && strncmp(tptr, ttyp, 2)) return; sp = &savcom[npr]; cmdp = getcmd(); - if (cmdp == 0) - return; sp->ap = ap = (struct asav *)calloc(1, sizeof (struct asav)); sp->ap->a_cmdp = cmdp; #define e(a,b) ap->a = mproc->b --- 987,1002 ---- register struct text *xp; char *ttyp, *cmdp; ! if (mproc->p_stat != SZOMB) { ! if (getu() == 0) ! return; ! ttyp = gettty(); ! } else ! ttyp = "?"; /* zombies are not attached to terminals */ if (xflg == 0 && ttyp[0] == '?' || tptr && strncmp(tptr, ttyp, 2)) return; sp = &savcom[npr]; cmdp = getcmd(); sp->ap = ap = (struct asav *)calloc(1, sizeof (struct asav)); sp->ap->a_cmdp = cmdp; #define e(a,b) ap->a = mproc->b *************** *** 982,987 **** --- 1020,1026 ---- ap->a_txtrss = xp->x_rssize; ap->a_xccount = xp->x_ccount; } + ap->a_start = u.u_start; } #undef e ap->a_maxrss = mproc->p_maxrss; *************** *** 1070,1076 **** return (0); (void) lseek(swap, (long)dtob(mproc->p_swaddr), 0); if (read(swap, (char *)&user.user, size) != size) { ! fprintf(stderr, "ps: cant read u for pid %d from %s\n", mproc->p_pid, swapf); return (0); } --- 1109,1115 ---- return (0); (void) lseek(swap, (long)dtob(mproc->p_swaddr), 0); if (read(swap, (char *)&user.user, size) != size) { ! fprintf(stderr, "ps: can't read u for pid %d from %s\n", mproc->p_pid, swapf); return (0); } *************** *** 1081,1087 **** pteaddr = &Usrptmap[btokmx(mproc->p_p0br) + mproc->p_szpt - 1]; klseek(kmem, (long)pteaddr, 0); if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) { ! printf("ps: cant read indir pte to get u for pid %d from %s\n", mproc->p_pid, kmemf); return (0); } --- 1120,1126 ---- pteaddr = &Usrptmap[btokmx(mproc->p_p0br) + mproc->p_szpt - 1]; klseek(kmem, (long)pteaddr, 0); if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) { ! printf("ps: can't read indir pte to get u for pid %d from %s\n", mproc->p_pid, kmemf); return (0); } *************** *** 1089,1095 **** (long)ctob(apte.pg_pfnum+1) - (UPAGES+CLSIZE) * sizeof (struct pte), 0); if (read(mem, (char *)arguutl, sizeof(arguutl)) != sizeof(arguutl)) { ! printf("ps: cant read page table for u of pid %d from %s\n", mproc->p_pid, memf); return (0); } --- 1128,1134 ---- (long)ctob(apte.pg_pfnum+1) - (UPAGES+CLSIZE) * sizeof (struct pte), 0); if (read(mem, (char *)arguutl, sizeof(arguutl)) != sizeof(arguutl)) { ! printf("ps: can't read page table for u of pid %d from %s\n", mproc->p_pid, memf); return (0); } *************** *** 1103,1109 **** i = ncl * CLSIZE; lseek(mem, (long)ctob(arguutl[CLSIZE+i].pg_pfnum), 0); if (read(mem, user.upages[i], CLSIZE*NBPG) != CLSIZE*NBPG) { ! printf("ps: cant read page %d of u of pid %d from %s\n", arguutl[CLSIZE+i].pg_pfnum, mproc->p_pid, memf); return(0); } --- 1142,1148 ---- i = ncl * CLSIZE; lseek(mem, (long)ctob(arguutl[CLSIZE+i].pg_pfnum), 0); if (read(mem, user.upages[i], CLSIZE*NBPG) != CLSIZE*NBPG) { ! printf("ps: can't read page %d of u of pid %d from %s\n", arguutl[CLSIZE+i].pg_pfnum, mproc->p_pid, memf); return(0); } *************** *** 1233,1243 **** } char *uhdr = ! "%s PID %%CPU %%MEM SZ RSS TT STAT TIME"; upr(sp) struct savcom *sp; { register struct asav *ap = sp->ap; int vmsize, rmsize; vmsize = pgtok((ap->a_size + ap->a_tsiz)); --- 1272,1283 ---- } char *uhdr = ! "%s PID %%CPU %%MEM SZ RSS TT STAT START TIME"; upr(sp) struct savcom *sp; { register struct asav *ap = sp->ap; + char *cp; int vmsize, rmsize; vmsize = pgtok((ap->a_size + ap->a_tsiz)); *************** *** 1253,1258 **** --- 1293,1305 ---- putchar(' '); ptty(ap->a_tty); printf(" %4.4s", state(ap)); + if (ap->a_start.tv_sec == 0) + ap->a_start = boottime; + cp = ctime(&ap->a_start.tv_sec); + if ((now - ap->a_start.tv_sec) > 60*60*24) + printf("%.7s", cp+3); + else + printf("%.6s ", cp+10); ptime(ap); } *************** *** 1488,1504 **** newloc = loc & ~0xc0000000; p = btop(newloc); if ((loc & 0xc0000000) == 0) { ! fprintf(stderr, "Vtophys: translating non-kernel address\n"); return((off_t) -1); } if (p >= Syssize) { ! fprintf(stderr, "Vtophys: page out of bound (%d>=%d)\n", p, Syssize); return((off_t) -1); } if (Sysmap[p].pg_v == 0 && (Sysmap[p].pg_fod || Sysmap[p].pg_pfnum == 0)) { ! fprintf(stderr, "Vtophys: page not valid\n"); return((off_t) -1); } loc = (long) (ptob(Sysmap[p].pg_pfnum) + (loc & PGOFSET)); --- 1535,1551 ---- newloc = loc & ~0xc0000000; p = btop(newloc); if ((loc & 0xc0000000) == 0) { ! fprintf(stderr, "ps: Vtophys: translating non-kernel address\n"); return((off_t) -1); } if (p >= Syssize) { ! fprintf(stderr, "ps: Vtophys: page out of bound (%d>=%d)\n", p, Syssize); return((off_t) -1); } if (Sysmap[p].pg_v == 0 && (Sysmap[p].pg_fod || Sysmap[p].pg_pfnum == 0)) { ! fprintf(stderr, "ps: Vtophys: page not valid\n"); return((off_t) -1); } loc = (long) (ptob(Sysmap[p].pg_pfnum) + (loc & PGOFSET)); *************** *** 1540,1546 **** struct nlist *list; { register struct nlist *p, *q; - register char *s1, *s2; register n, m; int maxlen, nreq; FILE *f; --- 1587,1592 ---- *************** *** 1605,1612 **** if (!nflg) addchan(&nambuf[1], (caddr_t) q->n_value); for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) { - s1 = p->n_un.n_name; - s2 = nambuf; if (strcmp(p->n_un.n_name, nambuf) == 0) { p->n_value = q->n_value; p->n_type = q->n_type; --- 1651,1656 ---- *************** *** 1634,1639 **** --- 1678,1684 ---- static int left = 0; register struct wchan *wp; register char **p; + register struct wchan_map *mp; for (p = wchan_stop_list; *p; p++) { if (**p != *name) /* quick check first */ *************** *** 1640,1645 **** --- 1685,1696 ---- continue; if (strncmp(name, *p, WNAMESIZ) == 0) return; /* if found, don't add */ + } + for (mp = wchan_map_list; mp->map_from; mp++) { + if (*(mp->map_from) != *name) /* quick check first */ + continue; + if (strncmp(name, mp->map_from, WNAMESIZ) == 0) + name = mp->map_to; /* if found, remap */ } if (left == 0) { if (wchanhd) {