- fread(dbversion, sizeof dbversion, 1, fp);
- if (bcmp(thisversion, dbversion, sizeof thisversion))
- goto bad;
- while ((*p = getc(fp)) != '\0')
- p++;
- if (strcmp(unixname, unamebuf))
- goto bad;
- fread((char *) &dbmtime, sizeof dbmtime, 1, fp);
- if (stat(unixname, &stb) < 0)
- stb.st_mtime = 0;
- if (stb.st_mtime != dbmtime)
- goto bad;
-
- fread((char *) &nllen, sizeof nllen, 1, fp);
- nl = (struct nlist *) malloc (nllen * sizeof (struct nlist));
- fread((char *) nl, sizeof (struct nlist), nllen, fp);
- fread((char *) cand, sizeof (cand), 1, fp);
- fread((char *) &nttys, sizeof nttys, 1, fp);
- allttys = (struct ttys *)malloc(sizeof(struct ttys)*nttys);
- if (allttys == NULL) {
- fprintf(stderr, "ps: Can't malloc space for tty table\n");
- exit(1);
- }
- fread((char *) allttys, sizeof (struct ttys), nttys, fp);
- fread((char *) &nchans, sizeof nchans, 1, fp);
- wchanhd = (struct wchan *) malloc(nchans * sizeof (struct wchan));
- if (wchanhd == NULL) {
- fprintf(stderr, "ps: Can't malloc space for wait channels\n");
- nflg++;
- fseek(fp, (long) nchans * sizeof (struct wchan), 1);
- } else
- fread((char *) wchanhd, sizeof (struct wchan), nchans, fp);
- fread((char *) wchan_index, sizeof (caddr_t), NWCINDEX, fp);
- fclose(fp);
- return(1);
-
-bad:
- fclose(fp);
- return(0);
-}
-
-openfiles(argc, argv)
- char **argv;
-{
-
- kmemf = "/dev/kmem";
- if (kflg)
- kmemf = argc > 2 ? argv[2] : "/vmcore";
- kmem = open(kmemf, 0);
- if (kmem < 0) {
- perror(kmemf);
- exit(1);
- }
- if (kflg) {
- mem = kmem;
- memf = kmemf;
- } else {
- memf = "/dev/mem";
- mem = open(memf, 0);
- if (mem < 0) {
- perror(memf);
- exit(1);
- }
- }
- if (kflg == 0 || argc > 3) {
- swapf = argc>3 ? argv[3]: "/dev/drum";
- swap = open(swapf, 0);
- if (swap < 0) {
- perror(swapf);
- exit(1);
- }
- }
-}
-
-getkvars(argc, argv)
- char **argv;
-{
- int faildb = 0; /* true if psdatabase init failed */
- int i;
-
- nlistf = argc > 1 ? argv[1] : "/vmunix";
- if (Uflg) {
- init_nlist();
- nlist(nlistf, nl);
- getvchans();
- getdev();
- writepsdb(nlistf);
- exit (0);
- } else if (!readpsdb(nlistf)) {
- init_nlist();
- if (!kflg)
- nl[X_SYSMAP].n_un.n_name = "";
- faildb = 1;
- nlist(nlistf, nl);
- nttys = 0;
- getdev();
- }
-
- if (nl[0].n_type == 0) {
- fprintf(stderr, "%s: No namelist\n", nlistf);
- exit(1);
- }
- if (kflg) {
- /* We must do the sys map first because klseek uses it */
- long addr;
-
- Syssize = nl[X_SYSSIZE].n_value;
- 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;
- addr &= ~KERNBASE;
- (void) lseek(kmem, addr, 0);
- read(kmem, (char *) Sysmap, Syssize * sizeof (struct pte));
- }
- if (faildb)
- getvchans();
- usrpt = (struct pte *)nl[X_USRPT].n_value;
- Usrptmap = (struct pte *)nl[X_USRPTMAP].n_value;
- klseek(kmem, (long)nl[X_NSWAP].n_value, 0);
- if (read(kmem, (char *)&nswap, sizeof (nswap)) != sizeof (nswap)) {
- cantread("nswap", kmemf);
- exit(1);
- }
- klseek(kmem, (long)nl[X_MAXSLP].n_value, 0);
- if (read(kmem, (char *)&maxslp, sizeof (maxslp)) != sizeof (maxslp)) {
- cantread("maxslp", kmemf);
- exit(1);
- }
- klseek(kmem, (long)nl[X_CCPU].n_value, 0);
- if (read(kmem, (char *)&ccpu, sizeof (ccpu)) != sizeof (ccpu)) {
- cantread("ccpu", kmemf);
- exit(1);
- }
- klseek(kmem, (long)nl[X_ECMX].n_value, 0);
- if (read(kmem, (char *)&ecmx, sizeof (ecmx)) != sizeof (ecmx)) {
- cantread("ecmx", kmemf);
- exit(1);
- }
- if (uflg || vflg) {
- ntext = getw(nl[X_NTEXT].n_value);
- 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);
- klseek(kmem, (long)atext, 0);
- if (read(kmem, (char *)text, ntext * sizeof (struct text))
- != ntext * sizeof (struct text)) {
- cantread("text table", kmemf);
- exit(1);
- }
- }
- dmmin = getw(nl[X_DMMIN].n_value);
- dmmax = getw(nl[X_DMMAX].n_value);
-}
-
-/*
- * get the valloc'ed kernel variables for symbolic wait channels
- */
-getvchans()
-{
- int i, tmp;
-
- if (nflg)
- return;
-
-#define addv(i) addchan(&nl[i].n_un.n_name[1], getw(nl[i].n_value))
- addv(X_INODE);
- addv(X_FILE);
- addv(X_PROC);
- addv(X_TEXT);
- addv(X_CFREE);
- addv(X_CALLOUT);
- addv(X_SWAPMAP);
- addv(X_ARGMAP);
- addv(X_KERNELMAP);
- addv(X_MBMAP);
- addv(X_NCH);
- if (nl[X_QUOTA].n_value != 0) { /* these are #ifdef QUOTA */
- addv(X_QUOTA);
- addv(X_DQUOT);
- }
- addv(X_SWBUF);
- addv(X_BUF);
- addv(X_CMAP);
- addv(X_BUFFERS);
- qsort(wchanhd, nchans, sizeof (struct wchan), wchancomp);
- for (i = 0; i < NWCINDEX; i++) {
- tmp = i * nchans;
- wchan_index[i] = wchanhd[tmp / NWCINDEX].wc_caddr;
- }
-#undef addv
-}
-printhdr()
-{
- char *hdr;
-
- if (sflg+lflg+vflg+uflg > 1) {
- fprintf(stderr, "ps: specify only one of s,l,v and u\n");
- exit(1);
- }
- if (lflg) {
- if (nflg)
- wcwidth = 6;
- else if (twidth > WTSIZ)
- wcwidth = -WNAMESIZ;
- else
- wcwidth = -WSNAMESIZ;
- if ((hdr = malloc(strlen(lhdr) + WNAMESIZ)) == NULL) {
- fprintf(stderr, "ps: out of memory\n");
- exit(1);
- }
- (void)sprintf(hdr, lhdr, wcwidth, "WCHAN");
- } else if (vflg)
- hdr = vhdr;
- else if (uflg) {
- /* add enough on so that it can hold the sprintf below */
- if ((hdr = malloc(strlen(uhdr) + 10)) == NULL) {
- fprintf(stderr, "ps: out of memory\n");
- exit(1);
- }
- (void)sprintf(hdr, uhdr, nflg ? " UID" : "USER ");
- } else
- hdr = shdr;
- if (lflg+vflg+uflg+sflg == 0)
- hdr += strlen("SSIZ ");
- cmdstart = strlen(hdr);
- printf("%s COMMAND\n", hdr);
- (void) fflush(stdout);
-}
-
-cantread(what, fromwhat)
- char *what, *fromwhat;
-{
-
- fprintf(stderr, "ps: error reading %s from %s\n", what, fromwhat);
-}
-
-struct direct *dbuf;
-int dialbase;
-
-getdev()
-{
- register DIR *df;
- struct ttys *t;
- 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)
- maybetty();
- closedir(df);
- allttys = (struct ttys *)malloc(sizeof(struct ttys)*nttys);
- if (allttys == NULL) {
- fprintf(stderr, "ps: Can't malloc space for tty table\n");