sbrk returns -1, not 0, on failure; from lepreau@utah-cs
[unix-history] / usr / src / bin / ps / ps.c
index b2dc728..f5721ee 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)ps.c        4.21 (Berkeley) %G%";
+static char *sccsid = "@(#)ps.c        4.26 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -11,7 +11,7 @@ static        char *sccsid = "@(#)ps.c        4.21 (Berkeley) %G%";
 #include <pwd.h>
 #include <sys/param.h>
 #include <sys/tty.h>
 #include <pwd.h>
 #include <sys/param.h>
 #include <sys/tty.h>
-#include <dir.h>
+#include <sys/dir.h>
 #include <sys/user.h>
 #include <sys/proc.h>
 #include <machine/pte.h>
 #include <sys/user.h>
 #include <sys/proc.h>
 #include <machine/pte.h>
@@ -42,6 +42,10 @@ struct nlist nl[] = {
 #define        X_NPROC         8
        { "_ntext" },
 #define        X_NTEXT         9
 #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   *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();
 long   lseek();
 double pcpu(), pmem();
 int    pscomp();
@@ -112,6 +117,7 @@ double      ccpu;
 int    ecmx;
 struct pte *Usrptma, *usrpt;
 int    nproc, ntext;
 int    ecmx;
 struct pte *Usrptma, *usrpt;
 int    nproc, ntext;
+int    dmmin, dmmax;
 
 struct ttys {
        char    name[MAXNAMLEN+1];
 
 struct ttys {
        char    name[MAXNAMLEN+1];
@@ -132,7 +138,7 @@ int pcbpf;
 int    argaddr;
 extern char _sobuf[];
 
 int    argaddr;
 extern char _sobuf[];
 
-#define        pgtok(a)        ((a)*CLBYTES/1024)
+#define        pgtok(a)        ((a)/(1024/NBPG))
 
 main(argc, argv)
        char **argv;
 
 main(argc, argv)
        char **argv;
@@ -178,6 +184,11 @@ main(argc, argv)
                case 't':
                        if (*ap)
                                tptr = ap;
                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 == '?')
                        aflg++;
                        gflg++;
                        if (tptr && *tptr == '?')
@@ -391,6 +402,8 @@ getkvars(argc, argv)
                        exit(1);
                }
        }
                        exit(1);
                }
        }
+       dmmin = getw(nl[X_DMMIN].n_value);
+       dmmax = getw(nl[X_DMMAX].n_value);
 }
 
 printhdr()
 }
 
 printhdr()
@@ -993,7 +1006,7 @@ vstodb(vsbase, vssize, dmp, dbp, rev)
        struct dmap *dmp;
        register struct dblock *dbp;
 {
        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);
        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;
                panic("vstodb");
        while (vsbase >= blk) {
                vsbase -= blk;
-               if (blk < DMMAX)
+               if (blk < dmmax)
                        blk *= 2;
                ip++;
        }
                        blk *= 2;
                ip++;
        }
@@ -1055,39 +1068,81 @@ vsize(sp)
        return (vp->v_swrss + (ap->a_xccount ? 0 : vp->v_txtswrss));
 }
 
        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)
 {
 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;
 }
 
 char   *freebase;
@@ -1105,7 +1160,7 @@ alloc(size)
 #endif
        if (size > nleft) {
                freebase = (char *)sbrk((int)(i = size > 2048 ? size : 2048));
 #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);
                }
                        fprintf(stderr, "ps: ran out of memory\n");
                        exit(1);
                }