summaryrefslogtreecommitdiff
path: root/usr.sbin/kvm_mkdb
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>1998-08-23 00:57:16 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>1998-08-23 00:57:16 +0000
commitb056f8ef8097b1963e2b530eb56b85e2d0a5ee22 (patch)
treed5557f7dfb3942436b3792de23ea7494b690d4a5 /usr.sbin/kvm_mkdb
parentd522b3e526fc31b0fcfc4a6c51735df556e5b15d (diff)
o If the user doesn't specify a file, use /dev/ksyms in preference to
/bsd if it exists and we can open it. o Fix a bug where kvm_mkdb would leave a temp file in /var/db if the file argument didn't exit.
Diffstat (limited to 'usr.sbin/kvm_mkdb')
-rw-r--r--usr.sbin/kvm_mkdb/extern.h4
-rw-r--r--usr.sbin/kvm_mkdb/kvm_mkdb.c21
-rw-r--r--usr.sbin/kvm_mkdb/nlist.c57
3 files changed, 40 insertions, 42 deletions
diff --git a/usr.sbin/kvm_mkdb/extern.h b/usr.sbin/kvm_mkdb/extern.h
index 67118f52a25..2e8b6069771 100644
--- a/usr.sbin/kvm_mkdb/extern.h
+++ b/usr.sbin/kvm_mkdb/extern.h
@@ -31,8 +31,8 @@
* SUCH DAMAGE.
*
* from: @(#)extern.h 8.1 (Berkeley) 6/6/93
- * $OpenBSD: extern.h,v 1.4 1998/08/19 07:43:36 millert Exp $
+ * $OpenBSD: extern.h,v 1.5 1998/08/23 00:57:12 millert Exp $
*/
-int create_knlist __P((char *, DB *));
+int create_knlist __P((char *, int, DB *));
int testdb __P((char *));
diff --git a/usr.sbin/kvm_mkdb/kvm_mkdb.c b/usr.sbin/kvm_mkdb/kvm_mkdb.c
index f40ee17a593..e745504f27b 100644
--- a/usr.sbin/kvm_mkdb/kvm_mkdb.c
+++ b/usr.sbin/kvm_mkdb/kvm_mkdb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_mkdb.c,v 1.4 1998/08/19 07:43:37 millert Exp $ */
+/* $OpenBSD: kvm_mkdb.c,v 1.5 1998/08/23 00:57:14 millert Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -43,7 +43,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "from: @(#)kvm_mkdb.c 8.3 (Berkeley) 5/4/95";
#else
-static char *rcsid = "$OpenBSD: kvm_mkdb.c,v 1.4 1998/08/19 07:43:37 millert Exp $";
+static char *rcsid = "$OpenBSD: kvm_mkdb.c,v 1.5 1998/08/23 00:57:14 millert Exp $";
#endif
#endif /* not lint */
@@ -80,7 +80,7 @@ main(argc, argv)
char *argv[];
{
DB *db;
- int ch, verbose = 0;
+ int fd, ch, verbose = 0;
char *nlistpath, *nlistname, dbtemp[MAXPATHLEN], dbname[MAXPATHLEN];
while ((ch = getopt(argc, argv, "v")) != -1)
@@ -98,8 +98,17 @@ main(argc, argv)
if (argc > 1)
usage();
- nlistpath = argc > 0 ? argv[0] : _PATH_UNIX;
- nlistname = basename(nlistpath);
+ /* If no kernel specified use _PATH_KSYMS and fall back to _PATH_UNIX */
+ if (argc > 0) {
+ nlistpath = argv[0];
+ if ((fd = open(nlistpath, O_RDONLY, 0)) == -1)
+ err(1, "can't open %s", nlistpath);
+ } else {
+ if ((fd = open((nlistpath = _PATH_KSYMS), O_RDONLY, 0)) == -1 &&
+ (fd = open((nlistpath = _PATH_UNIX), O_RDONLY, 0)) == -1)
+ err(1, "can't open %s", nlistpath);
+ }
+ nlistname = argc > 0 ? basename(argv[0]) : basename(_PATH_UNIX);
(void)snprintf(dbtemp, sizeof(dbtemp), "%skvm_%s.tmp",
_PATH_VARDB, nlistname);
@@ -117,7 +126,7 @@ main(argc, argv)
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, DB_HASH, &openinfo);
if (db == NULL)
err(1, "can't dbopen %s", dbtemp);
- if (create_knlist(nlistpath, db) != 0) {
+ if (create_knlist(nlistpath, fd, db) != 0) {
(void)unlink(dbtemp);
errx(1, "cannot determine executable type of %s", nlistpath);
}
diff --git a/usr.sbin/kvm_mkdb/nlist.c b/usr.sbin/kvm_mkdb/nlist.c
index d369bafb500..6fe58067d12 100644
--- a/usr.sbin/kvm_mkdb/nlist.c
+++ b/usr.sbin/kvm_mkdb/nlist.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nlist.c,v 1.12 1998/08/21 19:31:29 millert Exp $ */
+/* $OpenBSD: nlist.c,v 1.13 1998/08/23 00:57:15 millert Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "from: @(#)nlist.c 8.1 (Berkeley) 6/6/93";
#else
-static char *rcsid = "$OpenBSD: nlist.c,v 1.12 1998/08/21 19:31:29 millert Exp $";
+static char *rcsid = "$OpenBSD: nlist.c,v 1.13 1998/08/23 00:57:15 millert Exp $";
#endif
#endif /* not lint */
@@ -84,8 +84,8 @@ static void badread __P((int, char *));
static u_long get_kerntext __P((char *kfn, u_int magic));
int
-__aout_knlist(name, db)
- char *name;
+__aout_knlist(fd, db)
+ int fd;
DB *db;
{
register int nsyms;
@@ -93,16 +93,12 @@ __aout_knlist(name, db)
FILE *fp;
NLIST nbuf;
DBT data, key;
- int fd, nr, strsize;
+ int nr, strsize;
size_t len;
u_long kerntextoff;
size_t snamesize;
char *strtab, buf[1024], *sname, *p;
- kfile = name;
- if ((fd = open(name, O_RDONLY, 0)) < 0)
- err(1, "can't open %s", name);
-
/* Read in exec structure. */
nr = read(fd, &ebuf, sizeof(struct exec));
if (nr != sizeof(struct exec)) {
@@ -138,14 +134,14 @@ __aout_knlist(name, db)
/* Seek to symbol table. */
if (!(fp = fdopen(fd, "r")))
- err(1, "%s", name);
+ err(1, "%s", kfile);
if (fseek(fp, N_SYMOFF(ebuf), SEEK_SET) == -1)
- err(1, "%s", name);
+ err(1, "%s", kfile);
data.data = (u_char *)&nbuf;
data.size = sizeof(NLIST);
- kerntextoff = get_kerntext(name, N_GETMAGIC(ebuf));
+ kerntextoff = get_kerntext(kfile, N_GETMAGIC(ebuf));
/* Read each symbol and enter it into the database. */
nsyms = ebuf.a_syms / sizeof(struct nlist);
@@ -154,7 +150,7 @@ __aout_knlist(name, db)
if (fread((char *)&nbuf, sizeof (NLIST), 1, fp) != 1) {
if (feof(fp))
badfmt("corrupted symbol table");
- err(1, "%s", name);
+ err(1, "%s", kfile);
}
if (!nbuf._strx || nbuf.n_type&N_STAB)
continue;
@@ -287,30 +283,26 @@ badread(nr, p)
#ifdef _NLIST_DO_ELF
int
-__elf_knlist(name, db)
- char *name;
+__elf_knlist(fd, db)
+ int fd;
DB *db;
{
- register struct nlist *p;
register caddr_t strtab;
register off_t symstroff, symoff;
register u_long symsize;
register u_long kernvma, kernoffs;
- register int cc, i;
+ register int i;
Elf32_Sym sbuf;
- Elf32_Sym *s;
size_t symstrsize;
char *shstr, buf[1024];
Elf32_Ehdr eh;
Elf32_Shdr *sh = NULL;
- struct stat st;
DBT data, key;
NLIST nbuf;
FILE *fp;
- kfile = name;
- if ((fp = fopen(name, "r")) < 0)
- err(1, "%s", name);
+ if ((fp = fdopen(fd, "r")) < 0)
+ err(1, "%s", kfile);
if (fseek(fp, (off_t)0, SEEK_SET) == -1 ||
fread(&eh, sizeof(eh), 1, fp) != 1 ||
@@ -379,7 +371,7 @@ __elf_knlist(name, db)
if (fread((char *)&sbuf, sizeof(sbuf), 1, fp) != 1) {
if (feof(fp))
badfmt("corrupted symbol table");
- err(1, "%s", name);
+ err(1, "%s", kfile);
}
if (!sbuf.st_name)
continue;
@@ -464,8 +456,8 @@ __elf_knlist(name, db)
(p) < (e)->a.data_start + (e)->a.dsize)
int
-__ecoff_knlist(name, db)
- char *name;
+__ecoff_knlist(fd, db)
+ int fd;
DB *db;
{
struct ecoff_exechdr *exechdrp;
@@ -480,16 +472,11 @@ __ecoff_knlist(name, db)
long i, nesyms;
DBT data, key;
NLIST nbuf;
- int fd;
char *sname = NULL;
size_t len, snamesize = 0;
- kfile = name;
- if ((fd = open(name, O_RDONLY)) == -1)
- err(1, "%s", name);
-
if (fstat(fd, &st) < 0)
- err(1, "can't stat %s", name);
+ err(1, "can't stat %s", kfile);
if (st.st_size > SIZE_T_MAX) {
fmterr = "file too large";
BAD;
@@ -588,7 +575,7 @@ out:
#endif /* _NLIST_DO_ECOFF */
static struct knlist_handlers {
- int (*fn) __P((char *name, DB *db));
+ int (*fn) __P((int fd, DB *db));
} nlist_fn[] = {
#ifdef _NLIST_DO_AOUT
{ __aout_knlist },
@@ -602,15 +589,17 @@ static struct knlist_handlers {
};
int
-create_knlist(name, db)
+create_knlist(name, fd, db)
char *name;
+ int fd;
DB *db;
{
int i, error;
for (i = 0; i < sizeof(nlist_fn)/sizeof(nlist_fn[0]); i++) {
fmterr = NULL;
- if ((error = (nlist_fn[i].fn)(name, db)) == 0)
+ kfile = name;
+ if ((error = (nlist_fn[i].fn)(fd, db)) == 0)
break;
}
if (fmterr != NULL)