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