home *** CD-ROM | disk | FTP | other *** search
- /* History:
- 5/1/91 DJB baseline. todo: hash device names.
- 3/15/91 DJB separated into library function
- Originally stolen from printdevice() in Dupuy ofiles.
- */
-
- /*
-
- char *getdevicename(node) struct Xnode *node; returns the name of a
- device in /dev (e.g., /dev/kmem) with the same remote device as node, or
- 0 if no such device exists.
-
- char *getttydevname(dev) dev_t dev; returns the name of a character
- device with the given remote device, or 0 if no such device exists. XXX
- for the name and modularization: this is used to find the ctty of a
- process given u_ttyd, but that doesn't make it logical.
-
- */
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include "confnfs.h"
- #include "confundefstdcbeforedir.h"
- #ifdef UNDEFSTDCBEFOREDIR /* stupid features don't deserve short names */
- #undef __stdc__ /* dorks */
- #endif
- #include <sys/dir.h>
- #include <errno.h>
- extern int errno;
- #include "mallocfree.h"
- #include "structxnode.h"
- #include "confgnode.h"
- #include "confclonedev.h"
- #include "confmajorminor.h"
-
- static char dev[] = "/dev/";
-
- static int scanned = 0;
-
- struct devname
- {
- struct devname *next;
- char *name;
- unsigned mode;
- dev_t rdev;
- #ifdef CLONEDEV
- short clonedev;
- #endif
- #ifndef NFS
- unsigned ino;
- #endif
- }
- ;
-
- static struct devname *devnamelist = 0;
-
- static int scandev()
- {
- struct stat status;
- register struct direct *entry;
- register DIR *devdir;
- register struct devname *dvent;
-
- scanned = 1;
-
- errno = 0;
- if (!(devdir = opendir(dev)))
- return -1; /*XXX*/
-
- if (dvent = (struct devname *) malloc(sizeof(struct devname)))
- {
- while (entry = readdir(devdir))
- {
- if (!(dvent->name = malloc(sizeof(dev) + strlen(entry->d_name))))
- break;
- (void) strcpy(dvent->name,dev);
- (void) strcat(dvent->name,entry->d_name);
- if (stat(dvent->name, &status) < 0
- || ((status.st_mode & S_IFMT) != S_IFBLK
- && (status.st_mode & S_IFMT) != S_IFCHR))
- {
- free((char *) dvent->name);
- continue;
- }
-
- dvent->mode = status.st_mode & S_IFMT;
- dvent->rdev = status.st_rdev;
- #ifdef CLONEDEV
- if (dvent->mode == S_IFCHR && major(dvent->rdev) == CLONEDEV)
- dvent->clonedev = minor(dvent->rdev);
- else
- dvent->clonedev = -1;
- #endif
- #ifndef NFS
- dvent->ino = status.st_ino;
- #endif
- dvent->next = devnamelist;
- devnamelist = dvent;
- if (!(dvent = (struct devname *) malloc(sizeof(struct devname))))
- break;
- }
- free ((char *) dvent);
- }
- closedir(devdir);
- return 0;
- }
-
- char *getdevicename(node)
- struct Xnode *node;
- {
- register struct devname *dvent;
-
- if (!scanned)
- if (scandev() == -1)
- return 0; /*XXX*/
-
- for (dvent = devnamelist;dvent;dvent = dvent->next)
- {
- #ifdef NFS
- if (dvent->rdev == node->v_rdev
- && (dvent->mode == ((node->v_type == VBLK) ? S_IFBLK : S_IFCHR)))
- #else
- #ifdef GNODE
- if (dvent->rdev == node->g_rdev && dvent->ino == node->g_number
- && (dvent->mode == (((node->g_mode & GFMT) == GFBLK) ? S_IFBLK : S_IFCHR)))
- #else
- if (dvent->rdev == node->i_rdev && dvent->ino == node->i_number
- && (dvent->mode == (((node->i_mode & IFMT) == IFBLK) ? S_IFBLK : S_IFCHR)))
- #endif
- #endif
- return dvent->name;
- #ifdef CLONEDEV
- if (node->v_type == VCHR && dvent->clonedev > 0
- && major(node->v_rdev) == dvent->clonedev)
- return dvent->name;
- #endif
- }
- return 0; /*XXX*/
- }
-
- char *getttydevname(dev)
- dev_t dev;
- {
- register struct devname *dvent;
-
- if (!scanned)
- if (scandev() == -1)
- return 0; /*XXX*/
-
- for (dvent = devnamelist;dvent;dvent = dvent->next)
- {
- /*XXX: is this right normally? */
- if (dvent->rdev == dev
- && (dvent->mode == S_IFCHR))
- return dvent->name;
- #ifdef notdef /* XXX: CLONEDEV */
- if (node->v_type == VCHR && dvent->clonedev > 0
- && major(node->v_rdev) == dvent->clonedev)
- return dvent->name;
- #endif
- }
- return 0; /*XXX*/
- }
-