140966Smarc /* 240966Smarc * Copyright (c) 1989 The Regents of the University of California. 340966Smarc * All rights reserved. 440966Smarc * 5*42537Sbostic * %sccs.include.redist.c% 640966Smarc */ 740966Smarc 840966Smarc #if defined(LIBC_SCCS) && !defined(lint) 9*42537Sbostic static char sccsid[] = "@(#)devname.c 5.5 (Berkeley) 05/31/90"; 1040966Smarc #endif /* LIBC_SCCS and not lint */ 1140966Smarc 1240258Smarc #include <sys/types.h> 1340258Smarc #include <sys/stat.h> 1440966Smarc #include <sys/file.h> 1540966Smarc #include <dirent.h> 1640966Smarc #include <paths.h> 1740258Smarc 1840966Smarc static struct devs { 1940966Smarc struct devs *next; 2040258Smarc dev_t dev; 2140258Smarc char name[MAXNAMLEN+1]; 2240971Smarc mode_t type; 2340258Smarc }; 2440258Smarc 2540966Smarc #define hash(x) ((x)&0xff) 2641330Smarc static struct devs *devhash[0xff]; 2740258Smarc 2840966Smarc static int devinit; 2940258Smarc 3040258Smarc char * 3140966Smarc devname(dev, type) 3240258Smarc dev_t dev; 3340971Smarc mode_t type; 3440258Smarc { 3540258Smarc struct devs *devp; 3640258Smarc 3740258Smarc if (devinit == 0) { 3840966Smarc register struct devs *devpp; 3940966Smarc register struct dirent *entry; 4040966Smarc struct stat sb; 4140258Smarc DIR *dp = opendir(_PATH_DEV); 4240966Smarc int savewd = open(".", O_RDONLY, 0); 4340971Smarc mode_t specialtype; 4440258Smarc 4540966Smarc if (savewd == -1 || dp == NULL || chdir(_PATH_DEV) == -1) 4640258Smarc return (NULL); 4740258Smarc while ((entry = readdir(dp)) != NULL) { 4840258Smarc if (stat(entry->d_name, &sb) == -1) 4940258Smarc continue; 5040966Smarc switch(sb.st_mode&S_IFMT) { 5140966Smarc case S_IFCHR: 5240971Smarc specialtype = S_IFCHR; 5340966Smarc break; 5440966Smarc case S_IFBLK: 5540971Smarc specialtype = S_IFBLK; 5640966Smarc break; 5740966Smarc default: 5840258Smarc continue; 5940966Smarc } 6040258Smarc devp = (struct devs *)malloc(sizeof (struct devs)); 6140258Smarc if (devp == NULL) 6240258Smarc return (NULL); 6340966Smarc devp->type = specialtype; 6440258Smarc devp->dev = sb.st_rdev; 6540258Smarc strcpy(devp->name, entry->d_name); 6640258Smarc devp->next = NULL; 6740966Smarc if ((devpp = devhash[hash(sb.st_rdev)]) == NULL) 6840966Smarc devhash[hash(sb.st_rdev)] = devp; 6940258Smarc else { 7040258Smarc for (;devpp->next != NULL; devpp = devpp->next) 7140258Smarc ; 7240258Smarc devpp->next = devp; 7340258Smarc } 7440258Smarc } 7540966Smarc fchdir(savewd); 7640966Smarc close(savewd); 7740966Smarc closedir(dp); 7840966Smarc devinit = 1; 7940258Smarc } 8040966Smarc for (devp = devhash[hash(dev)]; devp != NULL; devp = devp->next) 8140966Smarc if (dev == devp->dev && type == devp->type) 8240258Smarc return(devp->name); 8340258Smarc 8440258Smarc return (NULL); 8540258Smarc } 8640258Smarc 8740258Smarc #ifdef TEST 8840258Smarc main() { 8940258Smarc printf(" %s \n", devname(0)); 9040258Smarc } 9140258Smarc #endif 92