+ register int i = 0;
+ static char flags[20];
+
+# define BIT(flag, ch) flags[i++] = ( f & flag ) ? ch : ' '
+
+ BIT( ASU, 'S');
+ BIT( AFORK, 'F');
+ BIT( ACOMPAT, 'C');
+ BIT( ACORE, 'D');
+ BIT( AXSIG, 'X');
+
+ flags[i] = '\0';
+
+ return(flags);
+}
+
+setupdevs()
+{
+ register DIR * fd;
+ register struct devhash * hashtab;
+ register ndevs = NDEVS;
+ struct direct * dp;
+
+ if ((fd = opendir("/dev")) == NULL) {
+ perror("/dev");
+ return;
+ }
+
+ if ((hashtab = (struct devhash *)malloc(NDEVS * sizeof(struct devhash)))
+ == (struct devhash *) 0) {
+ fprintf(stderr, "No mem for dev table\n");
+ return;
+ }
+
+ while (dp = readdir(fd)) {
+ if (dp->d_ino == 0)
+ continue;
+#ifdef MELB
+ if (dp->d_name[0] != 't' && strcmp(dp->d_name, "console"))
+ continue;
+#endif
+ strncpy(hashtab->dev_name, dp->d_name, fldsiz(utmp, ut_line));
+ hashtab->dev_name[fldsiz(utmp, ut_line)] = 0;
+ hashtab->dev_nxt = dev_chain;
+ dev_chain = hashtab;
+ hashtab++;
+ if (--ndevs <= 0)
+ break;
+ }
+ closedir(fd);
+}
+
+char *
+tername(dev)
+dev_t dev;
+{
+ register struct devhash *hp, *nhp;
+ struct stat statb;
+ char name [fldsiz(devhash, dev_name) + 6];
+ static dev_t lastdev = (dev_t) -1;
+ static char *lastname;
+
+ if (dev == NODEV)
+ return("__");
+
+ if (dev == lastdev)
+ return(lastname);
+
+ for (hp = dev_hash[HASH(dev)]; hp; hp = hp->dev_nxt)
+ if (hp->dev_dev == dev) {
+ lastdev = dev;
+ return(lastname = hp->dev_name);
+ }
+
+ for (hp = dev_chain; hp; hp = nhp) {
+ nhp = hp->dev_nxt;
+ strcpy(name, "/dev/");
+ strcat(name, hp->dev_name);
+ if (stat(name, &statb) < 0) /* name truncated usually */
+ continue;
+ if ((statb.st_mode & S_IFMT) != S_IFCHR)
+ continue;
+ hp->dev_dev = statb.st_rdev;
+ hp->dev_nxt = dev_hash[HASH(hp->dev_dev)];
+ dev_hash[HASH(hp->dev_dev)] = hp;
+ if (hp->dev_dev == dev) {
+ dev_chain = nhp;
+ lastdev = dev;
+ return(lastname = hp->dev_name);
+ }