delete reference to two-character names
[unix-history] / usr / src / usr.sbin / kvm_mkdb / testdb.c
CommitLineData
b9e9d294
KB
1/*-
2 * Copyright (c) 1992 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8#ifndef lint
40492f4a 9static char sccsid[] = "@(#)testdb.c 5.2 (Berkeley) %G%";
b9e9d294
KB
10#endif /* not lint */
11
12#include <sys/param.h>
13#include <sys/file.h>
14#include <errno.h>
15#include <limits.h>
16#include <kvm.h>
17#include <db.h>
18#include <stdio.h>
19#include <unistd.h>
20#include <string.h>
21#include <paths.h>
22
23#include "extern.h"
24
25/* Return true if the db file is valid, else false */
26int
27testdb()
28{
29 register DB *db;
30 register int cc, kd, ret, dbversionlen;
31 register char *cp, *uf;
32 DBT rec;
33 struct nlist nitem;
34 char dbname[MAXPATHLEN], dbversion[_POSIX2_LINE_MAX];
35 char kversion[_POSIX2_LINE_MAX];
36
37 ret = 0;
38 db = NULL;
39
40 if ((kd = open(_PATH_KMEM, O_RDONLY, 0)) < 0)
41 goto close;
42
43 uf = _PATH_UNIX;
44 if ((cp = rindex(uf, '/')) != 0)
45 uf = cp + 1;
46 (void) snprintf(dbname, sizeof(dbname), "%skvm_%s.db", _PATH_VARDB, uf);
47 if ((db = dbopen(dbname, O_RDONLY, 0, DB_HASH, NULL)) == NULL)
48 goto close;
49
50 /* Read the version out of the database */
51 rec.data = VRS_KEY;
52 rec.size = sizeof(VRS_KEY) - 1;
53 if ((db->get)(db, &rec, &rec, 0))
54 goto close;
55 if (rec.data == 0 || rec.size > sizeof(dbversion))
56 goto close;
57 bcopy(rec.data, dbversion, rec.size);
58 dbversionlen = rec.size;
59
60 /* Read version string from kernel memory */
61 rec.data = VRS_SYM;
62 rec.size = sizeof(VRS_SYM) - 1;
63 if ((db->get)(db, &rec, &rec, 0))
64 goto close;
65 if (rec.data == 0 || rec.size != sizeof(struct nlist))
66 goto close;
40492f4a
KB
67 bcopy(rec.data, &nitem, sizeof(nitem));
68 /*
69 * Theoretically possible for lseek to be seeking to -1. Not
70 * that it's something to lie awake nights about, however.
71 */
b9e9d294 72 errno = 0;
40492f4a 73 if (lseek(kd, (off_t)nitem.n_value, SEEK_SET) == -1 && errno != 0)
b9e9d294
KB
74 goto close;
75 cc = read(kd, kversion, sizeof(kversion));
76 if (cc < 0 || cc != sizeof(kversion))
77 goto close;
78
79 /* If they match, we win */
80 ret = bcmp(dbversion, kversion, dbversionlen) == 0;
81
82close: if (kd >= 0)
83 (void)close(kd);
84 if (db)
85 (void)(db->close)(db);
86 return (ret);
87}