X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/066ec2ef5983a5dd42087e277fd73b5362006fc3..772ff1b2ba6649bfccac879c79fc6772f5c0a00f:/usr/src/bin/ps/ps.c diff --git a/usr/src/bin/ps/ps.c b/usr/src/bin/ps/ps.c index b2dc728598..f5721eedd6 100644 --- a/usr/src/bin/ps/ps.c +++ b/usr/src/bin/ps/ps.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)ps.c 4.21 (Berkeley) %G%"; +static char *sccsid = "@(#)ps.c 4.26 (Berkeley) %G%"; #endif /* @@ -11,7 +11,7 @@ static char *sccsid = "@(#)ps.c 4.21 (Berkeley) %G%"; #include #include #include -#include +#include #include #include #include @@ -42,6 +42,10 @@ struct nlist nl[] = { #define X_NPROC 8 { "_ntext" }, #define X_NTEXT 9 + { "_dmmin" }, +#define X_DMMIN 10 + { "_dmmax" }, +#define X_DMMAX 11 { "" }, }; @@ -103,6 +107,7 @@ int aflg, cflg, eflg, gflg, kflg, lflg, sflg, char *tptr; char *gettty(), *getcmd(), *getname(), *savestr(), *alloc(), *state(); char *rindex(), *calloc(), *sbrk(), *strcpy(), *strcat(), *strncat(); +char *index(), *ttyname(), mytty[16]; long lseek(); double pcpu(), pmem(); int pscomp(); @@ -112,6 +117,7 @@ double ccpu; int ecmx; struct pte *Usrptma, *usrpt; int nproc, ntext; +int dmmin, dmmax; struct ttys { char name[MAXNAMLEN+1]; @@ -132,7 +138,7 @@ int pcbpf; int argaddr; extern char _sobuf[]; -#define pgtok(a) ((a)*CLBYTES/1024) +#define pgtok(a) ((a)/(1024/NBPG)) main(argc, argv) char **argv; @@ -178,6 +184,11 @@ main(argc, argv) case 't': if (*ap) tptr = ap; + else if ((tptr = ttyname(2)) != 0) { + strcpy(mytty, tptr); + if ((tptr = index(mytty,'y')) != 0) + tptr++; + } aflg++; gflg++; if (tptr && *tptr == '?') @@ -391,6 +402,8 @@ getkvars(argc, argv) exit(1); } } + dmmin = getw(nl[X_DMMIN].n_value); + dmmax = getw(nl[X_DMMAX].n_value); } printhdr() @@ -993,7 +1006,7 @@ vstodb(vsbase, vssize, dmp, dbp, rev) struct dmap *dmp; register struct dblock *dbp; { - register int blk = DMMIN; + register int blk = dmmin; register swblk_t *ip = dmp->dm_map; vsbase = ctod(vsbase); @@ -1002,7 +1015,7 @@ vstodb(vsbase, vssize, dmp, dbp, rev) panic("vstodb"); while (vsbase >= blk) { vsbase -= blk; - if (blk < DMMAX) + if (blk < dmmax) blk *= 2; ip++; } @@ -1055,39 +1068,81 @@ vsize(sp) return (vp->v_swrss + (ap->a_xccount ? 0 : vp->v_txtswrss)); } -#define NMAX 8 -#define NUID 2048 +#define NMAX 8 /* sizeof loginname (should be sizeof (utmp.ut_name)) */ +#define NUID 2048 /* must not be a multiple of 5 */ -char names[NUID][NMAX+1]; +struct nametable { + char nt_name[NMAX+1]; + int nt_uid; +} nametable[NUID]; + +struct nametable * +findslot(uid) +unsigned short uid; +{ + register struct nametable *n, *start; + + /* + * find the uid or an empty slot. + * return NULL if neither found. + */ + + n = start = nametable + (uid % (NUID - 20)); + while (n->nt_name[0] && n->nt_uid != uid) { + if ((n += 5) >= &nametable[NUID]) + n -= NUID; + if (n == start) + return((struct nametable *)NULL); + } + return(n); +} -/* - * Stolen from ls... - */ char * getname(uid) { - register struct passwd *pw; - static init; - struct passwd *getpwent(); - - if (uid >= 0 && uid < NUID && names[uid][0]) - return (&names[uid][0]); - if (init == 2) - return (0); - if (init == 0) - setpwent(), init = 1; - while (pw = getpwent()) { - if (pw->pw_uid >= NUID) - continue; - if (names[pw->pw_uid][0]) - continue; - (void) strncpy(names[pw->pw_uid], pw->pw_name, NMAX); - if (pw->pw_uid == uid) - return (&names[uid][0]); + register struct passwd *pw; + static init = 0; + struct passwd *getpwent(); + register struct nametable *n; + + /* + * find uid in hashed table; add it if not found. + * return pointer to name. + */ + + if ((n = findslot(uid)) == NULL) + return((char *)NULL); + + if (n->nt_name[0]) /* occupied? */ + return(n->nt_name); + + switch (init) { + case 0: + setpwent(); + init = 1; + /* intentional fall-thru */ + case 1: + while (pw = getpwent()) { + if (pw->pw_uid < 0) + continue; + if ((n = findslot(pw->pw_uid)) == NULL) { + endpwent(); + init = 2; + return((char *)NULL); + } + if (n->nt_name[0]) + continue; /* duplicate, not uid */ + strncpy(n->nt_name, pw->pw_name, NMAX); + n->nt_uid = pw->pw_uid; + if (pw->pw_uid == uid) + return (n->nt_name); + } + endpwent(); + init = 2; + /* intentional fall-thru */ + case 2: + return ((char *)NULL); } - init = 2; - endpwent(); - return (0); } char *freebase; @@ -1105,7 +1160,7 @@ alloc(size) #endif if (size > nleft) { freebase = (char *)sbrk((int)(i = size > 2048 ? size : 2048)); - if (freebase == 0) { + if (freebase == (char *)-1) { fprintf(stderr, "ps: ran out of memory\n"); exit(1); }