add confSORT_QUEUE_BY_HOST and confBROKEN_SMTP_PEERS
[unix-history] / usr / src / usr.sbin / dev_mkdb / dev_mkdb.c
index 149f235..efb745b 100644 (file)
@@ -1,41 +1,51 @@
 /*-
 /*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * %sccs.include.redist.c%
  */
 
 #ifndef lint
  *
  * %sccs.include.redist.c%
  */
 
 #ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1990 The Regents of the University of California.\n\
- All rights reserved.\n";
+static char copyright[] =
+"@(#) Copyright (c) 1990, 1993\n\
      The Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)dev_mkdb.c 5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)dev_mkdb.c 8.1 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/param.h>
 #include <sys/stat.h>
 #endif /* not lint */
 
 #include <sys/param.h>
 #include <sys/stat.h>
+
 #include <fcntl.h>
 #undef DIRBLKSIZ
 #include <dirent.h>
 #include <fcntl.h>
 #undef DIRBLKSIZ
 #include <dirent.h>
+#include <nlist.h>
 #include <kvm.h>
 #include <db.h>
 #include <errno.h>
 #include <kvm.h>
 #include <db.h>
 #include <errno.h>
+#include <unistd.h>
 #include <stdio.h>
 #include <paths.h>
 #include <stdio.h>
 #include <paths.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include <string.h>
 
+void   err __P((const char *, ...));
+void   usage __P((void));
+
+int
 main(argc, argv)
        int argc;
 main(argc, argv)
        int argc;
-       char **argv;
+       char *argv[];
 {
 {
-       extern int optind;
        register DIR *dirp;
        register struct dirent *dp;
        struct stat sb;
        register DIR *dirp;
        register struct dirent *dp;
        struct stat sb;
-       char bkeybuf[sizeof(sb.st_rdev) + 1];
+       struct {
+               mode_t type;
+               dev_t dev;
+       } bkey;
        DB *db;
        DBT data, key;
        int ch;
        DB *db;
        DBT data, key;
        int ch;
@@ -51,65 +61,95 @@ main(argc, argv)
        argc -= optind;
        argv += optind;
 
        argc -= optind;
        argv += optind;
 
+       if (argc > 0)
+               usage();
+
        if (chdir(_PATH_DEV))
        if (chdir(_PATH_DEV))
-               error(_PATH_DEV);
+               err("%s: %s", _PATH_DEV, strerror(errno));
 
        dirp = opendir(".");
 
 
        dirp = opendir(".");
 
-       (void)snprintf(dbtmp, sizeof(dbtmp), "%s/dev.tmp", _PATH_VARRUN);
-       (void)snprintf(dbname, sizeof(dbtmp), "%s/dev.db", _PATH_VARRUN);
-       db = hash_open(dbtmp, O_CREAT|O_WRONLY|O_EXCL, DEFFILEMODE,
-           (HASHINFO *)NULL);
-       if (!db)
-               error(dbtmp);
+       (void)snprintf(dbtmp, sizeof(dbtmp), "%sdev.tmp", _PATH_VARRUN);
+       (void)snprintf(dbname, sizeof(dbtmp), "%sdev.db", _PATH_VARRUN);
+       db = dbopen(dbtmp, O_CREAT|O_EXLOCK|O_RDWR|O_TRUNC,
+           S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, DB_HASH, NULL);
+       if (db == NULL)
+               err("%s: %s", dbtmp, strerror(errno));
 
        /*
 
        /*
-        * Character devices are stored using st_rdev as the key.
-        * Block devices are stores using st_rdev followed by exactly
-        * one NULL byte as the key.
+        * Keys are a mode_t followed by a dev_t.  The former is the type of
+        * the file (mode & S_IFMT), the latter is the st_rdev field.  Note
+        * that the structure may contain padding, so we have to clear it
+        * out here.
         */
         */
-       key.data = bkeybuf;
-       bkeybuf[sizeof(sb.st_rdev)] = NULL;
+       bzero(&bkey, sizeof(bkey));
+       key.data = &bkey;
+       key.size = sizeof(bkey);
        data.data = buf;
        while (dp = readdir(dirp)) {
        data.data = buf;
        while (dp = readdir(dirp)) {
-               if (stat(dp->d_name, &sb)) {
-                       (void)fprintf(stderr, "dev_mkdb: can't stat %s\n",
-                               dp->d_name);
+               if (lstat(dp->d_name, &sb)) {
+                       (void)fprintf(stderr,
+                           "dev_mkdb: %s: %s\n", dp->d_name, strerror(errno));
                        continue;
                }
                        continue;
                }
+
+               /* Create the key. */
                if (S_ISCHR(sb.st_mode))
                if (S_ISCHR(sb.st_mode))
-                       key.size = sizeof(sb.st_rdev);
+                       bkey.type = S_IFCHR;
                else if (S_ISBLK(sb.st_mode))
                else if (S_ISBLK(sb.st_mode))
-                       key.size = sizeof(sb.st_rdev) + 1;
+                       bkey.type = S_IFBLK;
                else
                        continue;
                else
                        continue;
-               /* 
-                * Nul terminate the name so caller doesn't have to. 
+               bkey.dev = sb.st_rdev;
+
+               /*
+                * Create the data; nul terminate the name so caller doesn't
+                * have to.
                 */
                bcopy(dp->d_name, buf, dp->d_namlen);
                buf[dp->d_namlen] = '\0';
                data.size = dp->d_namlen + 1;
                if ((db->put)(db, &key, &data, 0))
                 */
                bcopy(dp->d_name, buf, dp->d_namlen);
                buf[dp->d_namlen] = '\0';
                data.size = dp->d_namlen + 1;
                if ((db->put)(db, &key, &data, 0))
-                       error(dbtmp);
+                       err("dbput %s: %s\n", dbtmp, strerror(errno));
        }
        (void)(db->close)(db);
        }
        (void)(db->close)(db);
-       if (rename(dbtmp, dbname)) {
-               (void)fprintf(stderr, "dev_mkdb: %s to %s: %s.\n",
-                   dbtmp, dbname, strerror(errno));
-               exit(1);
-       }
+       if (rename(dbtmp, dbname))
+               err("rename %s to %s: %s", dbtmp, dbname, strerror(errno));
        exit(0);
 }
 
        exit(0);
 }
 
-error(n)
-       char *n;
+void
+usage()
 {
 {
-       (void)fprintf(stderr, "dev_mkdb: %s: %s\n", n, strerror(errno));
+       (void)fprintf(stderr, "usage: dev_mkdb\n");
        exit(1);
 }
 
        exit(1);
 }
 
-usage()
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+void
+#if __STDC__
+err(const char *fmt, ...)
+#else
+err(fmt, va_alist)
+       char *fmt;
+        va_dcl
+#endif
 {
 {
-       (void)fprintf(stderr, "usage: dev_mkdb\n");
+       va_list ap;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       (void)fprintf(stderr, "dev_mkdb: ");
+       (void)vfprintf(stderr, fmt, ap);
+       va_end(ap);
+       (void)fprintf(stderr, "\n");
        exit(1);
        exit(1);
+       /* NOTREACHED */
 }
 }