# 2.11BSD#431 - /usr/src/usr.sbin/dev_mkdb/dev_mkdb.c

##### Functions

    main              X
    usage             X

       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: }

#### Defined functions

main defined in line 54; never used
usage defined in line 149; used 3 times

- in line 52, 80, 86

#### Defined variables

copyright defined in line 35; never used
sccsid defined in line 39; never used

Last modified: 1999-10-24 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1458 |