1: #
   2: 
   3: /*
   4:  *	ps - process status
   5:  *	examine and print certain things about processes
   6:  */
   7: 
   8: #include "/usr/sys/param.h"
   9: #include "/usr/sys/proc.h"
  10: #include "/usr/sys/tty.h"
  11: #include "/usr/sys/user.h"
  12: 
  13: struct {
  14:     char name[8];
  15:     int  type;
  16:     char  *value;
  17: } nl[3];
  18: 
  19: struct proc proc[NPROC];
  20: struct tty tty;
  21: struct user u;
  22: int lflg;
  23: int kflg;
  24: int xflg;
  25: int tflg;
  26: int aflg;
  27: int mem;
  28: int swap;
  29: 
  30: int stbuf[257];
  31: int ndev;
  32: char    devc[65];
  33: int devl[65];
  34: int devt[65];
  35: char    *coref;
  36: struct ibuf {
  37:     char    idevmin, idevmaj;
  38:     int inum;
  39:     int iflags;
  40:     char    inl;
  41:     char    iuid;
  42:     char    igid;
  43:     char    isize0;
  44:     int isize;
  45:     int iaddr[8];
  46:     char    *ictime[2];
  47:     char    *imtime[2];
  48:     int fill;
  49: };
  50: int obuf[259];
  51: 
  52: 
  53: main(argc, argv)
  54: char **argv;
  55: {
  56:     struct proc *p;
  57:     int n, b;
  58:     int i, c, mtty;
  59:     char *ap;
  60:     int uid, puid;
  61: 
  62:     obuf[0] = 1;
  63:     if (argc>1) {
  64:         ap = argv[1];
  65:         while (*ap) switch (*ap++) {
  66:         case 'a':
  67:             aflg++;
  68:             break;
  69: 
  70:         case 't':
  71:             tflg++;
  72:             break;
  73: 
  74:         case 'x':
  75:             xflg++;
  76:             break;
  77: 
  78:         case 'l':
  79:             lflg++;
  80:             break;
  81: 
  82:         case 'k':
  83:             kflg++;
  84:             break;
  85: 
  86:         }
  87:     }
  88: 
  89:     if(chdir("/dev") < 0) {
  90:         printf("cannot change to /dev\n");
  91:         done();
  92:     }
  93:     setup(&nl[0], "_proc");
  94:     setup(&nl[1], "_swapdev");
  95:     nlist(argc>2? argv[2]:"/unix", nl);
  96:     if (nl[0].type==0) {
  97:         printf("No namelist\n");
  98:         return;
  99:     }
 100:     coref = "/dev/mem";
 101:     if(kflg)
 102:         coref = "/usr/sys/core";
 103:     if ((mem = open(coref, 0)) < 0) {
 104:         printf("No mem\n");
 105:         done();
 106:     }
 107:     seek(mem, nl[1].value, 0);
 108:     read(mem, &nl[1].value, 2);
 109:     seek(mem, nl[0].value, 0);
 110:     read(mem, proc, sizeof proc);
 111:     getdev();
 112:     mtty = ttyn(0);
 113:     uid = getuid() & 0377;
 114:     if(lflg)
 115:     printf("TTY F S UID   PID PRI ADDR  SZ  WCHAN COMMAND\n"); else
 116:         printf("TTY  PID COMMAND\n");
 117:     for (i=0; i<NPROC; i++) {
 118:         if (proc[i].p_stat==0)
 119:             continue;
 120:         if (proc[i].p_ttyp==0) {
 121:             if (xflg==0)
 122:                 continue;
 123:             c = '?';
 124:         } else {
 125:             for(c=0; c<ndev; c++)
 126:             if(devt[c] == proc[i].p_ttyp) {
 127:                 c = devc[c];
 128:                 goto out;
 129:             }
 130:             seek(mem, proc[i].p_ttyp, 0);
 131:             read(mem, &tty, sizeof tty);
 132:             for(c=0; c<ndev; c++)
 133:             if(devl[c] == tty.t_dev) {
 134:                 devt[c] = proc[i].p_ttyp;
 135:                 c = devc[c];
 136:                 goto out;
 137:             }
 138:             c = '?';
 139:         out:;
 140:         }
 141:         puid = proc[i].p_uid & 0377;
 142:         if (uid != puid && aflg==0)
 143:             continue;
 144:         if (lflg || c!=mtty)
 145:             printf("%c:", c);
 146:         else
 147:             printf("  ");
 148:         if (lflg) {
 149:             printf("%3o %c%4d", proc[i].p_flag,
 150:                 "0SWRIZT"[proc[i].p_stat], puid);
 151:         }
 152:         printf("%6l", proc[i].p_pid);
 153:         if (lflg) {
 154:             printf("%4d%5o%4d", proc[i].p_pri, proc[i].p_addr,
 155:                 (proc[i].p_size+7)>>3);
 156:             if (proc[i].p_wchan)
 157:                 printf("%7o", proc[i].p_wchan); else
 158:                 printf("       ");
 159:         }
 160:         if (proc[i].p_stat==5)
 161:             printf(" <defunct>");
 162:         else
 163:             prcom(i);
 164:         printf("\n");
 165:     }
 166:     done();
 167: }
 168: 
 169: getdev()
 170: {
 171:     register struct { int dir_ino; char dir_n[14]; } *p;
 172:     register i, c;
 173:     int f;
 174:     char dbuf[512];
 175:     int sbuf[20];
 176: 
 177:     f = open("/dev");
 178:     if(f < 0) {
 179:         printf("cannot open /dev\n");
 180:         done();
 181:     }
 182:     swap = -1;
 183:     c = 0;
 184: 
 185: loop:
 186:     i = read(f, dbuf, 512);
 187:     if(i <= 0) {
 188:         close(f);
 189:         if(swap < 0) {
 190:             printf("no swap device\n");
 191:             done();
 192:         }
 193:         ndev = c;
 194:         return;
 195:     }
 196:     while(i < 512)
 197:         dbuf[i++] = 0;
 198:     for(p = dbuf; p < dbuf+512; p++) {
 199:         if(p->dir_ino == 0)
 200:             continue;
 201:         if(p->dir_n[0] == 't' &&
 202:            p->dir_n[1] == 't' &&
 203:            p->dir_n[2] == 'y' &&
 204:            p->dir_n[4] == 0 &&
 205:            p->dir_n[3] != 0) {
 206:             if(stat(p->dir_n, sbuf) < 0)
 207:                 continue;
 208:             devc[c] = p->dir_n[3];
 209:             devl[c] = sbuf->iaddr[0];
 210:             c++;
 211:             continue;
 212:         }
 213:         if(swap >= 0)
 214:             continue;
 215:         if(stat(p->dir_n, sbuf) < 0)
 216:             continue;
 217:         if((sbuf->iflags & 060000) != 060000)
 218:             continue;
 219:         if(sbuf->iaddr[0] == nl[1].value)
 220:             swap = open(p->dir_n, 0);
 221:     }
 222:     goto loop;
 223: }
 224: 
 225: setup(p, s)
 226: char *p, *s;
 227: {
 228:     while (*p++ = *s++);
 229: }
 230: 
 231: prcom(i)
 232: {
 233:     int baddr, laddr, mf;
 234:     register int *ip;
 235:     register char *cp, *cp1;
 236:     int c, nbad;
 237: 
 238:     baddr = 0;
 239:     laddr = 0;
 240:     if (proc[i].p_flag&SLOAD) {
 241:         laddr = proc[i].p_addr;
 242:         mf = mem;
 243:     } else {
 244:         baddr = proc[i].p_addr;
 245:         mf = swap;
 246:     }
 247:     laddr =+ proc[i].p_size - 8;
 248:     baddr =+ laddr>>3;
 249:     laddr = (laddr&07)<<6;
 250:     seek(mf, baddr, 3);
 251:     seek(mf, laddr, 1);
 252:     if (read(mf, stbuf, 512) != 512)
 253:         return(0);
 254:     for (ip = &stbuf[256]; ip > &stbuf[0];) {
 255:         if (*--ip == -1) {
 256:             cp = ip+1;
 257:             if (*cp==0)
 258:                 cp++;
 259:             nbad = 0;
 260:             for (cp1 = cp; cp1 < &stbuf[256]; cp1++) {
 261:                 c = *cp1;
 262:                 if (c==0)
 263:                     *cp1 = ' ';
 264:                 else if (c < ' ' || c > 0176) {
 265:                     if (++nbad >= 5) {
 266:                         *cp1++ = ' ';
 267:                         break;
 268:                     }
 269:                     *cp1 = '?';
 270:                 }
 271:             }
 272:             while (*--cp1==' ')
 273:                 *cp1 = 0;
 274:             printf(lflg?" %.16s":" %.64s", cp);
 275:             return(1);
 276:         }
 277:     }
 278:     return(0);
 279: }
 280: 
 281: done()
 282: {
 283: 
 284:     fflush(obuf);
 285:     exit();
 286: }
 287: 
 288: putchar(c)
 289: {
 290: 
 291:     putc(c, obuf);
 292: }

Defined functions

done defined in line 281; used 5 times
getdev defined in line 169; used 1 times
main defined in line 53; never used
prcom defined in line 231; used 1 times
setup defined in line 225; used 2 times

Defined variables

aflg defined in line 26; used 2 times
coref defined in line 35; used 3 times
devc defined in line 32; used 3 times
devl defined in line 33; used 2 times
devt defined in line 34; used 2 times
kflg defined in line 23; used 2 times
lflg defined in line 22; used 6 times
mem defined in line 27; used 8 times
ndev defined in line 31; used 3 times
obuf defined in line 50; used 3 times
proc defined in line 19; used 21 times
stbuf defined in line 30; used 4 times
swap defined in line 28; used 5 times
tflg defined in line 25; used 1 times
  • in line 71
tty defined in line 20; used 3 times
u defined in line 21; never used
xflg defined in line 24; used 2 times

Defined struct's

ibuf defined in line 36; never used
Last modified: 1975-05-14
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1136
Valid CSS Valid XHTML 1.0 Strict