V10/cmd/ps/gettty.c
#include "ps.h"
#include <stdio.h>
#include <ndir.h>
char *
gettty(dev, node)
{
register char *nm;
if (dev == NODEV) { /* cheap hack: assume it's a pipe */
static char buf[8];
sprintf(buf, "p%4.4x", node&0xffff);
return buf;
}
nm = lookdir(node);
if (nm == 0)
return "?";
if (nm[0] == 't' && nm[1] == 't' && nm[2] == 'y')
nm += 3;
return nm;
}
initttys()
{
char dirname[100]; /* arbitrary size */
List *lp;
FILE *fp;
if ((fp = fopen("/lib/ttydevs", "r")) == NULL) {
devlist = getdir("/dev", devlist);
return;
}
while (fgets(dirname, sizeof(dirname), fp)) {
dirname[strlen(dirname)-1] = 0;
if ((lp = getdir(dirname, devlist)) != NULL)
devlist = lp;
}
fclose(fp);
}
char *
lookdir(node)
register node;
{
register List *lp;
register Entry *ep;
if (node)
for (lp = devlist; lp; lp = lp->next)
for (ep = lp->begin; ep; ep = ep->next)
if (ep->e_val == node)
return ep->e_name;
return 0;
}
List *
getdir(dirname, list)
char *dirname;
List *list;
{
register List *lp;
register Entry *ep;
register DIR *dirp;
register struct direct *dp;
if((dirp = opendir(dirname)) == 0)
return 0;
if((lp = Malloc(List, 1)) == 0) {
closedir(dirp);
return 0;
}
lp->next = list;
lp->begin = 0;
lp->nentry = 0;
for(dp = readdir(dirp); dp; dp = readdir(dirp)) {
if(dp->d_name[0] == '.') {
if(dp->d_name[1] == '\0')
continue;
if(dp->d_name[1] == '.' && dp->d_name[2] == '\0')
continue;
}
if((ep = Malloc(Entry, 1)) == 0)
break;
ep->next = lp->begin;
lp->begin = ep;
lp->nentry++;
ep->e_val = dp->d_ino;
strncpy(ep->e_name, dp->d_name, sizeof(ep->e_name));
}
closedir(dirp);
return lp;
}