1 /* $NetBSD: kvm_mkdb.c,v 1.18 2003/05/02 16:25:22 ragge 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.18 2003/05/02 16:25:22 ragge 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 *nlistpath; 89 int docheck = 0; 90 int fd; 91 92 while ((ch = getopt(argc, argv, "o:")) != -1) 93 switch (ch) { 94 case 'o': 95 dbname = optarg; 96 break; 97 98 case '?': 99 default: 100 usage(); 101 } 102 argc -= optind; 103 argv += optind; 104 105 if (argc > 1) 106 usage(); 107 108 if (dbname == NULL) { 109 dbname = _PATH_KVMDB; 110 docheck = 1; 111 } else if (strncmp(_PATH_KVMDB, dbname, sizeof(_PATH_KVMDB)) == 0) { 112 docheck = 1; 113 } 114 if (docheck) { 115 /* 116 * If the existing db file matches the currently running 117 * kernel, exit 118 */ 119 if (testdb()) 120 exit(0); 121 } 122 123 if (argc <= 0) { 124 /* 125 * Check for useability of _PATH_KSYMS, if not 126 * then fallback to _PATH_UNIX. 127 * Should we complain if failure? 128 */ 129 if ((fd = open(_PATH_KSYMS, O_RDONLY)) >= 0) { 130 close(fd); 131 nlistpath = _PATH_KSYMS; 132 } else 133 nlistpath = _PATH_UNIX; 134 } else 135 nlistpath = argv[0]; 136 137 (void)snprintf(dbtemp, sizeof(dbtemp), "%s.tmp", dbname); 138 (void)umask(0); 139 db = dbopen(dbtemp, O_CREAT | O_EXLOCK | O_TRUNC | O_RDWR, 140 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, DB_HASH, &openinfo); 141 if (db == NULL) 142 err(1, "%s", dbtemp); 143 create_knlist(nlistpath, db); 144 if (db->close(db)) { 145 warn("%s", dbtemp); 146 db = NULL; 147 punt(); 148 } 149 db = NULL; 150 if (rename(dbtemp, dbname)) { 151 warn("rename %s to %s", dbtemp, dbname); 152 punt(); 153 } 154 exit(0); 155 } 156 157 void 158 usage() 159 { 160 (void)fprintf(stderr, "usage: kvm_mkdb [-o database] [file]\n"); 161 exit(1); 162 } 163 164 void 165 punt() 166 { 167 168 if (db != NULL) 169 db->close(db); 170 unlink(dbtemp); 171 exit(1); 172 } 173