date and time created 91/04/12 13:40:37 by bostic
[unix-history] / usr / src / lib / libc / gen / devname.c
index 0f5a593..8f528e1 100644 (file)
@@ -2,99 +2,37 @@
  * Copyright (c) 1989 The Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1989 The Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * %sccs.include.redist.c%
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)devname.c  5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)devname.c  5.13 (Berkeley) %G%";
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#include <dirent.h>
+#include <fcntl.h>
+#include <db.h>
+#include <stdio.h>
 #include <paths.h>
 
 #include <paths.h>
 
-static struct devs {
-       struct  devs *next;
-       dev_t   dev;
-       char    name[MAXNAMLEN+1];
-       char    type;
-};
-
-#define        hash(x) ((x)&0xff)
-static struct devs *devhash[minor(~0)];
-
-static int devinit;
-
 char *
 char *
-devname(dev, type)
+devname(dev)
        dev_t dev;
 {
        dev_t dev;
 {
-       struct devs *devp;
-
-       if (devinit == 0) {
-               register struct devs *devpp;
-               register struct dirent *entry;
-               struct stat sb;
-               DIR *dp = opendir(_PATH_DEV);
-               int savewd = open(".", O_RDONLY, 0);
-               int specialtype;
-
-               if (savewd == -1 || dp == NULL || chdir(_PATH_DEV) == -1)
-                       return (NULL);
-               while ((entry = readdir(dp)) != NULL) {
-                       if (stat(entry->d_name, &sb) == -1)
-                               continue;
-                       switch(sb.st_mode&S_IFMT) {
-                       case S_IFCHR:
-                               specialtype = 1;
-                               break;
-                       case S_IFBLK:
-                               specialtype = 0;
-                               break;
-                       default:
-                               continue;
-                       }
-                       devp = (struct devs *)malloc(sizeof (struct devs));
-                       if (devp == NULL)
-                               return (NULL);
-                       devp->type = specialtype;
-                       devp->dev = sb.st_rdev;
-                       strcpy(devp->name, entry->d_name);
-                       devp->next = NULL;
-                       if ((devpp = devhash[hash(sb.st_rdev)]) == NULL)
-                               devhash[hash(sb.st_rdev)] = devp;
-                       else {
-                               for (;devpp->next != NULL; devpp = devpp->next)
-                                       ;
-                               devpp->next = devp;
-                       }
-               }
-               fchdir(savewd);
-               close(savewd);
-               closedir(dp);
-               devinit = 1;
+       static DB *db;
+       static int failure;
+       DBT data, key;
+
+       if (!db && !failure &&
+           !(db = hash_open(_PATH_DEVDB, O_RDONLY, 0, NULL))) {
+               (void)fprintf(stderr,
+                   "ps: no device database %s\n", _PATH_DEVDB);
+               failure = 1;
        }
        }
-       for (devp = devhash[hash(dev)]; devp != NULL; devp = devp->next)
-               if (dev == devp->dev && type == devp->type)
-                       return(devp->name);
-
-       return (NULL);
-}
+       if (failure)
+               return("??");
 
 
-#ifdef TEST
-main() {
-       printf(" %s \n", devname(0));
+       key.data = (u_char *)&dev;
+       key.size = sizeof(dev);
+       return((db->get)(db, &key, &data, 0L) ? "??" : (char *)data.data);
 }
 }
-#endif