1 /* $NetBSD: kvm_mkdb.c,v 1.17 2000/06/14 06:49:25 cgd Exp $ */ 2 3 /*- 4 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 5 * Copyright (c) 1990, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37 #include <sys/cdefs.h> 38 #ifndef lint 39 __COPYRIGHT("@(#) Copyright (c) 1990, 1993\n\ 40 The Regents of the University of California. All rights reserved.\n"); 41 #endif /* not lint */ 42 43 #ifndef lint 44 #if 0 45 static char sccsid[] = "from: @(#)kvm_mkdb.c 8.3 (Berkeley) 5/4/95"; 46 #else 47 __RCSID("$NetBSD: kvm_mkdb.c,v 1.17 2000/06/14 06:49:25 cgd Exp $"); 48 #endif 49 #endif /* not lint */ 50 51 #include <sys/param.h> 52 #include <sys/stat.h> 53 54 #include <db.h> 55 #include <err.h> 56 #include <errno.h> 57 #include <fcntl.h> 58 #include <paths.h> 59 #include <stdio.h> 60 #include <stdlib.h> 61 #include <string.h> 62 #include <unistd.h> 63 64 #include "extern.h" 65 66 int main __P((int, char **)); 67 static void usage __P((void)); 68 69 HASHINFO openinfo = { 70 4096, /* bsize */ 71 128, /* ffactor */ 72 1024, /* nelem */ 73 2048 * 1024, /* cachesize */ 74 NULL, /* hash() */ 75 0 /* lorder */ 76 }; 77 78 static DB *db; 79 static char *dbname = NULL; 80 static char dbtemp[MAXPATHLEN]; 81 82 int 83 main(argc, argv) 84 int argc; 85 char *argv[]; 86 { 87 int ch; 88 char *p, *nlistpath, *nlistname; 89 int docheck = 0; 90 91 while ((ch = getopt(argc, argv, "o:")) != -1) 92 switch (ch) { 93 case 'o': 94 dbname = optarg; 95 break; 96 97 case '?': 98 default: 99 usage(); 100 } 101 argc -= optind; 102 argv += optind; 103 104 if (argc > 1) 105 usage(); 106 107 if (dbname == NULL) { 108 dbname = _PATH_KVMDB; 109 docheck = 1; 110 } else if (strncmp(_PATH_KVMDB, dbname, sizeof(_PATH_KVMDB)) == 0) { 111 docheck = 1; 112 } 113 if (docheck) { 114 /* 115 * If the existing db file matches the currently running 116 * kernel, exit 117 */ 118 if (testdb()) 119 exit(0); 120 } 121 122 #define basename(cp) ((p = strrchr((cp), '/')) != NULL ? p + 1 : (cp)) 123 nlistpath = argc > 0 ? argv[0] : _PATH_UNIX; 124 nlistname = basename(nlistpath); 125 126 (void)snprintf(dbtemp, sizeof(dbtemp), "%s.tmp", dbname); 127 (void)umask(0); 128 db = dbopen(dbtemp, O_CREAT | O_EXLOCK | O_TRUNC | O_RDWR, 129 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, DB_HASH, &openinfo); 130 if (db == NULL) 131 err(1, "%s", dbtemp); 132 create_knlist(nlistpath, db); 133 if (db->close(db)) { 134 warn("%s", dbtemp); 135 db = NULL; 136 punt(); 137 } 138 db = NULL; 139 if (rename(dbtemp, dbname)) { 140 warn("rename %s to %s", dbtemp, dbname); 141 punt(); 142 } 143 exit(0); 144 } 145 146 void 147 usage() 148 { 149 (void)fprintf(stderr, "usage: kvm_mkdb [-o database] [file]\n"); 150 exit(1); 151 } 152 153 void 154 punt() 155 { 156 157 if (db != NULL) 158 db->close(db); 159 unlink(dbtemp); 160 exit(1); 161 } 162