- 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);
- mode_t 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 = S_IFCHR;
- break;
- case S_IFBLK:
- specialtype = S_IFBLK;
- 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;