- if (flen > (MAXPATHLEN - 5) || tlen > (MAXPATHLEN - 5))
- errexit("pathname too long: %s or %s", from, to);
- strcpy(from+flen, ".dir");
- strcpy(to+tlen, ".dir");
- if (rename(from, to) == -1)
- syserrexit("rename %s to %s", from, to);
- strcpy(from+flen, ".pag");
- strcpy(to+tlen, ".pag");
- if (rename(from, to) == -1)
- syserrexit("rename %s to %s", from, to);
- *(from+flen) = *(to+tlen) = '\0';
-}
-
-/* from libc/nlist.c */
-#include <unistd.h>
-
-typedef struct nlist NLIST;
-#define _strx n_un.n_strx
-#define _name n_un.n_name
-#define ISVALID(p) (p->_name && p->_name[0])
-#define MAXSYMSIZE 256
-
-create_knlist(name, db)
- char *name;
- DBM *db;
-{
- register NLIST *p, *s;
- struct exec ebuf;
- FILE *fstr, *fsym;
- NLIST nbuf;
- off_t strings_offset, symbol_offset, symbol_size, lseek();
- char sbuf[MAXSYMSIZE+1];
- register char *bp;
- register int c, len;
- datum key, data;
-
- if (!(fsym = fopen(name, "r")))
- syserrexit("can't open %s", name);
- if (fread((char *)&ebuf, sizeof(struct exec), 1, fsym) != 1 ||
- N_BADMAG(ebuf))
- syserrexit("can't read exec");
-
- symbol_offset = N_SYMOFF(ebuf);
- symbol_size = ebuf.a_syms;
- strings_offset = symbol_offset + symbol_size;
-
- if (fseek(fsym, symbol_offset, SEEK_SET) == -1)
- syserrexit("can't seek symbol table: %x", symbol_offset);
- if ((fstr = fopen(name, "r")) == NULL)
- syserrexit("can't open %s", name);
-
- sbuf[0] = KVMDB_NLIST;
- key.dptr = sbuf;
- data.dptr = (char *)&nbuf;
- data.dsize = sizeof (NLIST);
-
- for (s = &nbuf; symbol_size; symbol_size -= sizeof (NLIST)) {
- if (fread((char *)s, sizeof (NLIST), 1, fsym) != 1)
- syserrexit("can't read nlist entry");
- if (!s->_strx || s->n_type&N_STAB)
- continue;
- if (fseek(fstr, strings_offset + s->_strx, SEEK_SET) == -1)
- syserrexit("can't seek string: %x",
- strings_offset + s->_strx);
- /*
- * read string
- */
- bp = sbuf + 1;
- len = 0;
- while ((c = fgetc(fstr)) != EOF && c != '\0') {
- if (++len == MAXSYMSIZE)
- errexit("string too long");
- *bp++ = c;
- }
- *bp = '\0';
- /*
- * and store it
- */
- key.dsize = bp - sbuf;
- if (dbm_store(db, key, data, DBM_INSERT) < 0)
- syserrexit("dbm_store");
- if (strcmp(sbuf+1, "_version") == 0) {
- /*
- * store the value of version in VERSION
- */
- datum vers;
- char versbuf[_BSD_LINE_MAX];
- long versoff;
- long reloffset;
-
- /* offset relative to start of text image in VM. */
-#ifdef hp300
- reloffset = s->n_value;
-#endif
-#ifdef tahoe
- /*
- * on tahoe, first 0x800 is reserved for communication
- * with the console processor.
- */
- reloffset = ((s->n_value & ~KERNBASE) - 0x800);
-#endif
-#ifdef vax
- reloffset = (s->n_value & ~KERNBASE);
-#endif
- /*
- * When loaded, data is rounded
- * to next page cluster after text, but not in file.
- */
- reloffset -= CLBYTES - (ebuf.a_text % CLBYTES);
- versoff = N_TXTOFF(ebuf) + reloffset;
- if (fseek(fstr, versoff, SEEK_SET) == -1)
- syserrexit("seek (version): %x", s->n_value);
- /*
- * Just read version string up to, and
- * including newline.
- */
- if (fgets(versbuf, _BSD_LINE_MAX, fstr) == NULL)
- syserrexit("can't read version");
- strcpy(sbuf+1, "VERSION");
- key.dsize = (sizeof ("VERSION") - 1) + 1;
- vers.dptr = versbuf;
- vers.dsize = strlen(versbuf);
- if (dbm_store(db, key, vers, DBM_INSERT) < 0)
- syserrexit("dbm_store: can't store VERSION");
- }