|
|
1.1 ! root 1: #include <sys/param.h> ! 2: #include <sys/proc.h> ! 3: #include <sys/sched.h> ! 4: #include <sys/dir.h> ! 5: #include <sys/seg.h> ! 6: #include <sys/stat.h> ! 7: #include <sys/uproc.h> ! 8: #include <sys/signal.h> ! 9: #include <stdio.h> ! 10: #include <ctype.h> ! 11: #include <a.out.h> ! 12: #include <pwd.h> ! 13: ! 14: /* ! 15: * This is a kludge for the i8086 only and will be ! 16: * made to disappear when the segmentation (jproto) ! 17: * is thrown away. ! 18: */ ! 19: #undef SISTACK ! 20: #define SISTACK SIPDATA ! 21: ! 22: /* ! 23: * Maximum sizes. ! 24: */ ! 25: #define ARGSIZE 512 ! 26: ! 27: /* ! 28: * For easy referencing. ! 29: */ ! 30: #define NUM_SYMS 5 /* Number of symbols to look up. */ ! 31: #define aprocq nl[0].n_value ! 32: #define autimer nl[1].n_value ! 33: #define astimer nl[2].n_value ! 34: #define aend nl[4].n_value ! 35: ! 36: /* ! 37: * Variables. ! 38: */ ! 39: int aflag; /* All processes */ ! 40: int dflag; /* Driver flag */ ! 41: int dbflag; /* Debug flag */ ! 42: int fflag; /* Print out all fields */ ! 43: int gflag; /* Print out process groups */ ! 44: int lflag; /* Long format */ ! 45: int mflag; /* Print scheduling values */ ! 46: int nflag; /* No header */ ! 47: int rflag; /* Print out real sizes */ ! 48: int tflag; /* Print times */ ! 49: int wflag; /* Wide format */ ! 50: int xflag; /* Get special processes */ ! 51: dev_t ttdev; /* Terminal device */ ! 52: ! 53: /* ! 54: * Table for namelist. ! 55: */ ! 56: SYMENT nl[NUM_SYMS]; ! 57: ! 58: /* ! 59: * Symbols. ! 60: */ ! 61: char *allp; /* Pointer to alloc space */ ! 62: char *nfile; /* Namelist file */ ! 63: char *mfile; /* Memory file */ ! 64: char *dfile; /* Swap file */ ! 65: char argp[ARGSIZE]; /* Arguments */ ! 66: int kfd; /* Kernel memory file descriptor */ ! 67: int mfd; /* Memory file descriptor */ ! 68: int dfd; /* Swap file descriptor */ ! 69: struct uproc u; /* User process area */ ! 70: unsigned cutimer; /* Unsigned time */ ! 71: PROC cprocq; /* Process queue header */ ! 72: PROC w; ! 73: ! 74: unsigned casize; /* Size of alloc area */ ! 75: ! 76: char *malloc(); ! 77: char *uname(); ! 78: ! 79: main(argc, argv) ! 80: int argc; ! 81: char *argv[]; ! 82: { ! 83: initialise(); ! 84: execute(); ! 85: exit(0); ! 86: } ! 87: ! 88: /* ! 89: * Initialise. ! 90: */ ! 91: initialise() ! 92: { ! 93: register char *cp; ! 94: ! 95: /* Initialise the request for coffnlist(). */ ! 96: /* The values are a STUB, taken from the kernel at386.11. */ ! 97: strcpy(nl[0]._n._n_name, "procq"); ! 98: nl[0].n_type = 0; ! 99: nl[0].n_value = 0xFFC170A0; ! 100: strcpy(nl[1]._n._n_name, "utimer"); ! 101: nl[1].n_type = 0; ! 102: nl[1].n_value = 0xFFC17FB8; ! 103: strcpy(nl[2]._n._n_name, "stimer"); ! 104: nl[2].n_type = 0; ! 105: nl[2].n_value = 0xFFC183C4; ! 106: strcpy(nl[3]._n._n_name, "asize"); ! 107: nl[3].n_type = 0; ! 108: nl[3].n_value = 0xFFC1858C; ! 109: strcpy(nl[4]._n._n_name, "end"); ! 110: nl[4].n_type = 0; ! 111: nl[4].n_value = 0xFFC1866C; ! 112: } ! 113: ! 114: /* ! 115: * Print out usage. ! 116: */ ! 117: usage() ! 118: { ! 119: panic("Usage: ps [-][acdfgklmnrtwx]"); ! 120: } ! 121: ! 122: /* ! 123: * Print out information about processes. ! 124: */ ! 125: execute() ! 126: { ! 127: int c, l; ! 128: ! 129: if ((kfd = open("/dev/kmem", 0)) < 0) ! 130: panic("Cannot open /dev/kmem"); ! 131: ! 132: kread((long)autimer, &cutimer, sizeof (cprocq)); ! 133: fprintf(stderr, "DEBUG: cutimer: %d\n", cutimer); ! 134: sleep(1); ! 135: kread((long)autimer, &cutimer, sizeof (cprocq)); ! 136: fprintf(stderr, "DEBUG: cutimer: %d\n", cutimer); ! 137: ! 138: kread((long)aprocq, &cprocq, sizeof (cprocq)); ! 139: fprintf(stderr, "DEBUG: cprocq.p_pid: %d\n", cprocq.p_pid); ! 140: fprintf(stderr, "DEBUG: cprocq.p_nforw: %x\n", cprocq.p_nforw); ! 141: fprintf(stderr, "DEBUG: cprocq.p_nback: %x\n", cprocq.p_nback); ! 142: ! 143: kread((long)cprocq.p_nforw, &w, sizeof (w)); ! 144: while (w.p_nforw != cprocq.p_nforw) { ! 145: printf("DEBUG: w.p_pid: %d\n", w.p_pid); ! 146: printf("DEBUG: w.p_nforw: %x\n", w.p_nforw); ! 147: printf("DEBUG: w.p_nback: %x\n", w.p_nback); ! 148: kread((long)w.p_nforw, &w, sizeof (w)); ! 149: } ! 150: } ! 151: /* ! 152: * Read `n' bytes into the buffer `bp' from kernel memory ! 153: * starting at seek position `s'. ! 154: */ ! 155: kread(s, bp, n) ! 156: long s; ! 157: { ! 158: lseek(kfd, (long)s, 0); ! 159: if (read(kfd, bp, n) != n) ! 160: panic("Kernel memory read error"); ! 161: } ! 162: ! 163: /* ! 164: * Print out an error message and exit. ! 165: */ ! 166: panic(a1) ! 167: char *a1; ! 168: { ! 169: fflush(stdout); ! 170: fprintf(stderr, "%s", a1); ! 171: fprintf(stderr, "\n"); ! 172: exit(1); ! 173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.