+klseek(fd, loc, off)
+ int fd;
+ long loc;
+ int off;
+{
+ if (kflg) {
+ if ((loc = vtophys(loc)) == -1)
+ return;
+ }
+ (void) lseek(fd, (long)loc, off);
+}
+
+/*
+ * Version allows change of db format w/o temporarily bombing ps's
+ */
+char thisversion[4] = "V2"; /* length must remain 4 */
+
+writepsdb(unixname)
+ char *unixname;
+{
+ register FILE *fp;
+ struct lttys *lt;
+ struct stat stb;
+
+ setgid(getgid());
+ setuid(getuid());
+ if ((fp = fopen(psdb, "w")) == NULL) {
+ perror(psdb);
+ exit(1);
+ } else
+ fchmod(fileno(fp), 0644);
+
+ fwrite(thisversion, sizeof thisversion, 1, fp);
+ fwrite(unixname, strlen(unixname) + 1, 1, fp);
+ if (stat(unixname, &stb) < 0)
+ stb.st_mtime = 0;
+ fwrite((char *) &stb.st_mtime, sizeof stb.st_mtime, 1, fp);
+
+ fwrite((char *) &nllen, sizeof nllen, 1, fp);
+ fwrite((char *) nl, sizeof (struct nlist), nllen, fp);
+ fwrite((char *) cand, sizeof (cand), 1, fp);
+ fwrite((char *) &nttys, sizeof nttys, 1, fp);
+ for (lt = lallttys ; lt ; lt = lt->next)
+ fwrite((char *)<->ttys, sizeof (struct ttys), 1, fp);
+ fwrite((char *) &nchans, sizeof nchans, 1, fp);
+ fwrite((char *) wchanhd, sizeof (struct wchan), nchans, fp);
+ fwrite((char *) wchan_index, sizeof (caddr_t), NWCINDEX, fp);
+ fclose(fp);
+}
+
+readpsdb(unixname)
+ char *unixname;
+{
+ register i;
+ register FILE *fp;
+ char unamebuf[BUFSIZ];
+ char *p = unamebuf;
+ char dbversion[sizeof thisversion];
+ struct stat stb;
+ time_t dbmtime;
+ extern int errno;
+
+ if ((fp = fopen(psdb, "r")) == NULL) {
+ if (errno == ENOENT)
+ return (0);
+ perror(psdb);
+ exit(1);
+ }
+
+ /*
+ * Does the db file match this unix?
+ */
+ 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);
+}
+