|
|
1.1 root 1: /*
2: * on success:
3: * returns the pathname ("/dev/...") of the terminal
4: * with file descriptor "fd".
5: * bug: returns pointer to static area.
6: * on failure:
7: * returns 0.
8: */
9:
10: #include <sys/types.h>
11: #include <ndir.h>
12: #include <sys/stat.h>
13: #include <string.h>
14:
15: #define ARB 64 /* arbitrary and not checked safely */
16:
17: char *_ttyname();
18: static char ttybuf[ARB];
19:
20: char *
21: ttyname(fd)
22: int fd;
23: {
24: return(_ttyname(&ttybuf[0], fd));
25: }
26:
27: /*
28: * on success:
29: * stores at "s" the pathname of the terminal with file descriptor fd,
30: * and returns "s".
31: * on failure:
32: * leaves "s" unchanged,
33: * and returns 0.
34: */
35:
36: static char *ttymatch();
37:
38: char *
39: _ttyname(s, fd)
40: char *s;
41: int fd;
42: {
43: int ff;
44: register char *p, *q;
45: register int n;
46: struct stat fstb;
47: char buf[ARB+1];
48:
49: if (fstat(fd, &fstb) < 0)
50: return(0);
51: if ((ff = open("/lib/ttydevs", 0)) < 0)
52: return (ttymatch(&fstb, "/dev", s));
53: while ((n = read(ff, buf, ARB)) > 0) {
54: buf[n] = 0;
55: for (q = buf; p = strchr(q, '\n'); q = p) {
56: *p++ = 0;
57: if ((q = ttymatch(&fstb, q, s)) != NULL) {
58: close(ff);
59: return (q);
60: }
61: }
62: if (q < &buf[n])
63: memcpy(buf, q, n - (q - buf));
64: }
65: close(ff);
66: return (NULL);
67: }
68:
69: static char *
70: ttymatch(stp, dp, s)
71: register struct stat *stp;
72: char *dp;
73: char *s;
74: {
75: struct stat tsb;
76: DIR *dfp;
77: register struct direct *dir;
78: char tmps[ARB];
79:
80: if ((dfp = opendir(dp)) == NULL)
81: return (NULL);
82: while ((dir = readdir(dfp)) != NULL) {
83: if (dir->d_ino != stp->st_ino)
84: continue;
85: strcpy(tmps, dp);
86: strcat(tmps, "/");
87: strcat(tmps, dir->d_name);
88: if (stat(tmps, &tsb) < 0)
89: continue;
90: if (stp->st_dev != tsb.st_dev || stp->st_ino != tsb.st_ino)
91: continue;
92: closedir(dfp);
93: strcpy(s, tmps);
94: return(s);
95: }
96: closedir(dfp);
97: return(0);
98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.