1: /*- 2: * Copyright (c) 1990, 1993 3: * The Regents of the University of California. All rights reserved. 4: * 5: * Redistribution and use in source and binary forms, with or without 6: * modification, are permitted provided that the following conditions 7: * are met: 8: * 1. Redistributions of source code must retain the above copyright 9: * notice, this list of conditions and the following disclaimer. 10: * 2. Redistributions in binary form must reproduce the above copyright 11: * notice, this list of conditions and the following disclaimer in the 12: * documentation and/or other materials provided with the distribution. 13: * 3. All advertising materials mentioning features or use of this software 14: * must display the following acknowledgement: 15: * This product includes software developed by the University of 16: * California, Berkeley and its contributors. 17: * 4. Neither the name of the University nor the names of its contributors 18: * may be used to endorse or promote products derived from this software 19: * without specific prior written permission. 20: * 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31: * SUCH DAMAGE. 32: */ 33: 34: #if !defined(lint) && defined(DOSCCS) 35: static char copyright[] = 36: "@(#) Copyright (c) 1990, 1993\n\ 37: The Regents of the University of California. All rights reserved.\n"; 38: 39: static char sccsid[] = "@(#)dev_mkdb.c 8.1.2 (2.11BSD) 1999/10/24"; 40: #endif 41: 42: #include <stdlib.h> 43: #include <sys/param.h> 44: #include <sys/stat.h> 45: #include <fcntl.h> 46: #include <sys/dir.h> 47: #include <ndbm.h> 48: #include <stdio.h> 49: #include <paths.h> 50: 51: extern void err(); 52: void usage(); 53: 54: int 55: main(argc, argv) 56: int argc; 57: char *argv[]; 58: { 59: sigset_t set; 60: register DIR *dirp; 61: register struct direct *dp; 62: struct stat sb; 63: struct { 64: mode_t type; 65: dev_t dev; 66: } bkey; 67: DBM *db; 68: datum data, key; 69: int ch; 70: u_char buf[MAXNAMLEN + 1]; 71: char dbtmp[MAXPATHLEN + 1], dbname[MAXPATHLEN + 1]; 72: char *varrun = _PATH_VARRUN; 73: 74: umask(022); 75: 76: while ((ch = getopt(argc, argv, "")) != EOF) 77: switch((char)ch) { 78: case '?': 79: default: 80: usage(); 81: } 82: argc -= optind; 83: argv += optind; 84: 85: if (argc > 0) 86: usage(); 87: 88: if (chdir(_PATH_DEV)) 89: err(1, "%s", _PATH_DEV); 90: 91: dirp = opendir("."); 92: 93: (void)sprintf(dbtmp, "%sdev.tmp", varrun); 94: db = dbm_open(dbtmp, O_CREAT|O_EXLOCK|O_RDWR|O_TRUNC, 0644); 95: if (db == NULL) 96: err(1, "%s", dbtmp); 97: 98: /* 99: * Keys are a mode_t followed by a dev_t. The former is the type of 100: * the file (mode & S_IFMT), the latter is the st_rdev field. Note 101: * that the structure may contain padding, so we have to clear it 102: * out here. 103: */ 104: bzero(&bkey, sizeof(bkey)); 105: key.dptr = (char *)&bkey; 106: key.dsize = sizeof(bkey); 107: data.dptr = (char *)buf; 108: while (dp = readdir(dirp)) { 109: if (lstat(dp->d_name, &sb)) { 110: warn("%s", dp->d_name); 111: continue; 112: } 113: 114: /* Create the key. */ 115: if ((sb.st_mode & S_IFMT) == S_IFCHR) 116: bkey.type = S_IFCHR; 117: else if ((sb.st_mode & S_IFMT) == S_IFBLK) 118: bkey.type = S_IFBLK; 119: else 120: continue; 121: bkey.dev = sb.st_rdev; 122: 123: /* 124: * Create the data; nul terminate the name so caller doesn't 125: * have to. 126: */ 127: bcopy(dp->d_name, buf, dp->d_namlen); 128: buf[dp->d_namlen] = '\0'; 129: data.dsize = dp->d_namlen + 1; 130: if (dbm_store(db, key, data, DBM_REPLACE) < 0) 131: err(1, "dbm_store %s", dbtmp); 132: } 133: (void)dbm_close(db); 134: 135: (void)sigfillset(&set); 136: (void)sigprocmask(SIG_BLOCK, &set, NULL); 137: 138: sprintf(dbname, "%sdev.pag", varrun); 139: sprintf(dbtmp, "%sdev.tmp.pag", varrun); 140: if (rename(dbtmp, dbname)) 141: err(1, "rename %s to %s", dbtmp, dbname); 142: sprintf(dbname, "%sdev.dir", varrun); 143: sprintf(dbtmp, "%sdev.tmp.dir", varrun); 144: if (rename(dbtmp, dbname)) 145: err(1, "rename %s to %s", dbtmp, dbname); 146: exit(0); 147: } 148: 149: void 150: usage() 151: { 152: err(1, "usage: dev_mkdb"); 153: }