V10/cmd/ps/gettty.c

Compare this file to the similar file:
Show the results in this format:

#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;
}