1 #include <sys/types.h> 2 #include <sys/dir.h> 3 #include <sys/stat.h> 4 #include "pathnames.h" 5 #include <stdio.h> 6 7 struct devs { 8 dev_t dev; 9 char name[MAXNAMLEN+1]; 10 struct devs *next; 11 }; 12 13 struct devs *devhash[minor(~0)]; 14 15 int devinit; 16 17 /* TODO - use a database file stored in /dev, - just check mod time on /dev 18 hide data structures 19 */ 20 21 char * 22 devname(dev) 23 dev_t dev; 24 { 25 struct devs *devp; 26 27 if (devinit == 0) { 28 DIR *dp = opendir(_PATH_DEV); 29 struct direct *entry; 30 struct stat sb; 31 struct devs *devpp; 32 33 /* XXX XXX - can't chdir as a library routine (add flag?) */ 34 if (dp == NULL || chdir(_PATH_DEV) == -1) 35 return (NULL); 36 while ((entry = readdir(dp)) != NULL) { 37 if (stat(entry->d_name, &sb) == -1) 38 continue; 39 if ((sb.st_mode&S_IFMT) != S_IFCHR) 40 continue; 41 devp = (struct devs *)malloc(sizeof (struct devs)); 42 if (devp == NULL) 43 return (NULL); 44 devp->dev = sb.st_rdev; 45 strcpy(devp->name, entry->d_name); 46 devp->next = NULL; 47 if ((devpp = devhash[minor(sb.st_rdev)]) == NULL) 48 devhash[minor(sb.st_rdev)] = devp; 49 else { 50 for (;devpp->next != NULL; devpp = devpp->next) 51 ; 52 devpp->next = devp; 53 } 54 } 55 devinit = 1; /* XXX - should have way to invalidate cache ?*/ 56 } 57 for (devp = devhash[minor(dev)]; devp != NULL; devp = devp->next) 58 if (dev == devp->dev) 59 return(devp->name); 60 61 return (NULL); 62 } 63 64 #ifdef TEST 65 main() { 66 printf(" %s \n", devname(0)); 67 } 68 #endif 69