|
|
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: char *_ttyname();
11: static char ttybuf[32];
12:
13: char *
14: ttyname(fd)
15: int fd;
16: {
17: return(_ttyname(&ttybuf[0], fd));
18: }
19:
20: /*
21: * on success:
22: * stores at "s" the pathname of the terminal with file descriptor fd,
23: * and returns "s".
24: * on failure:
25: * leaves "s" unchanged,
26: * and returns 0.
27: */
28:
29: #include <sys/types.h>
30: #include <sys/dir.h>
31: #include <sys/stat.h>
32:
33: static char *dirlist[] = {
34: "/dev/",
35: "/dev/dk/",
36: "/dev/pt/",
37: 0
38: };
39:
40: char *strcpy();
41: char *strncat();
42:
43: char *
44: _ttyname(s, fd)
45: char *s;
46: register int fd;
47: {
48: register char **dpp, *dp;
49: struct stat fstb, tsb;
50: struct direct db;
51: char tmps[32];
52:
53: if (fstat(fd, &fstb) < 0)
54: return(0);
55: for (dpp = dirlist; dp = *dpp++;) {
56: if ((fd = open(dp, 0)) < 0)
57: continue;
58: while (read(fd, (char *) &db, sizeof(db)) == sizeof(db)) {
59: if (db.d_ino == 0 || db.d_ino != fstb.st_ino)
60: continue;
61: strcpy(tmps, dp);
62: strncat(tmps, db.d_name, sizeof(db.d_name));
63: if (stat(tmps, &tsb) < 0)
64: continue;
65: if (tsb.st_dev != fstb.st_dev || tsb.st_ino != fstb.st_ino)
66: continue;
67: close(fd);
68: strcpy(s, tmps);
69: return(s);
70: }
71: close(fd);
72: }
73: return(0);
74: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.