home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3298 / getdevicename.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  3.8 KB  |  165 lines

  1. /* History:
  2. 5/1/91 DJB baseline. todo: hash device names.
  3. 3/15/91 DJB separated into library function
  4. Originally stolen from printdevice() in Dupuy ofiles.
  5. */
  6.  
  7. /*
  8.  
  9. char *getdevicename(node) struct Xnode *node; returns the name of a
  10. device in /dev (e.g., /dev/kmem) with the same remote device as node, or
  11. 0 if no such device exists.
  12.  
  13. char *getttydevname(dev) dev_t dev; returns the name of a character
  14. device with the given remote device, or 0 if no such device exists. XXX
  15. for the name and modularization: this is used to find the ctty of a
  16. process given u_ttyd, but that doesn't make it logical.
  17.  
  18. */
  19.  
  20. #include <stdio.h>
  21. #include <sys/types.h>
  22. #include <sys/stat.h>
  23. #include "confnfs.h"
  24. #include "confundefstdcbeforedir.h"
  25. #ifdef UNDEFSTDCBEFOREDIR /* stupid features don't deserve short names */
  26. #undef __stdc__ /* dorks */
  27. #endif
  28. #include <sys/dir.h>
  29. #include <errno.h>
  30. extern int errno;
  31. #include "mallocfree.h"
  32. #include "structxnode.h"
  33. #include "confgnode.h"
  34. #include "confclonedev.h"
  35. #include "confmajorminor.h"
  36.  
  37. static char dev[] = "/dev/";
  38.  
  39. static int scanned = 0;
  40.  
  41. struct devname
  42.  {
  43.   struct devname *next;
  44.   char *name;
  45.   unsigned mode;
  46.   dev_t rdev;
  47. #ifdef CLONEDEV
  48.   short clonedev;
  49. #endif
  50. #ifndef NFS
  51.   unsigned ino;
  52. #endif
  53.  }
  54. ;
  55.  
  56. static struct devname *devnamelist = 0;
  57.  
  58. static int scandev()
  59. {
  60.  struct stat status;
  61.  register struct direct *entry;
  62.  register DIR *devdir;
  63.  register struct devname *dvent;
  64.  
  65.  scanned = 1;
  66.  
  67.  errno = 0;
  68.  if (!(devdir = opendir(dev)))
  69.    return -1; /*XXX*/
  70.  
  71.  if (dvent = (struct devname *) malloc(sizeof(struct devname)))
  72.   {
  73.    while (entry = readdir(devdir))
  74.     {
  75.      if (!(dvent->name = malloc(sizeof(dev) + strlen(entry->d_name))))
  76.        break;
  77.      (void) strcpy(dvent->name,dev);
  78.      (void) strcat(dvent->name,entry->d_name);
  79.      if (stat(dvent->name, &status) < 0
  80.       || ((status.st_mode & S_IFMT) != S_IFBLK
  81.        && (status.st_mode & S_IFMT) != S_IFCHR))
  82.       {
  83.        free((char *) dvent->name);
  84.        continue;
  85.       }
  86.  
  87.      dvent->mode = status.st_mode & S_IFMT;
  88.      dvent->rdev = status.st_rdev;
  89. #ifdef CLONEDEV
  90.      if (dvent->mode == S_IFCHR && major(dvent->rdev) == CLONEDEV)
  91.        dvent->clonedev = minor(dvent->rdev);
  92.      else
  93.        dvent->clonedev = -1;
  94. #endif
  95. #ifndef NFS
  96.      dvent->ino = status.st_ino;
  97. #endif
  98.      dvent->next = devnamelist;
  99.      devnamelist = dvent;
  100.      if (!(dvent = (struct devname *) malloc(sizeof(struct devname))))
  101.        break;
  102.     }
  103.    free ((char *) dvent);
  104.   }
  105.  closedir(devdir);
  106.  return 0;
  107. }
  108.  
  109. char *getdevicename(node)
  110. struct Xnode *node;
  111. {
  112.  register struct devname *dvent;
  113.  
  114.  if (!scanned)
  115.    if (scandev() == -1)
  116.      return 0; /*XXX*/
  117.  
  118.  for (dvent = devnamelist;dvent;dvent = dvent->next)
  119.   {
  120. #ifdef NFS
  121.    if (dvent->rdev == node->v_rdev
  122.     && (dvent->mode == ((node->v_type == VBLK) ? S_IFBLK : S_IFCHR)))
  123. #else
  124. #ifdef GNODE
  125.    if (dvent->rdev == node->g_rdev && dvent->ino == node->g_number
  126.     && (dvent->mode == (((node->g_mode & GFMT) == GFBLK) ? S_IFBLK : S_IFCHR)))
  127. #else
  128.    if (dvent->rdev == node->i_rdev && dvent->ino == node->i_number
  129.     && (dvent->mode == (((node->i_mode & IFMT) == IFBLK) ? S_IFBLK : S_IFCHR)))
  130. #endif
  131. #endif
  132.      return dvent->name;
  133. #ifdef CLONEDEV
  134.    if (node->v_type == VCHR && dvent->clonedev > 0
  135.     && major(node->v_rdev) == dvent->clonedev)
  136.      return dvent->name;
  137. #endif
  138.   }
  139.  return 0; /*XXX*/
  140. }
  141.  
  142. char *getttydevname(dev)
  143. dev_t dev;
  144. {
  145.  register struct devname *dvent;
  146.  
  147.  if (!scanned)
  148.    if (scandev() == -1)
  149.      return 0; /*XXX*/
  150.  
  151.  for (dvent = devnamelist;dvent;dvent = dvent->next)
  152.   {
  153.    /*XXX: is this right normally? */
  154.    if (dvent->rdev == dev
  155.     && (dvent->mode == S_IFCHR))
  156.      return dvent->name;
  157. #ifdef notdef /* XXX: CLONEDEV */
  158.    if (node->v_type == VCHR && dvent->clonedev > 0
  159.     && major(node->v_rdev) == dvent->clonedev)
  160.      return dvent->name;
  161. #endif
  162.   }
  163.  return 0; /*XXX*/
  164. }
  165.