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