| 1 | /* @(#)ttyname.c 4.2 (Berkeley) %G% */ |
| 2 | /* |
| 3 | * ttyname(f): return "/dev/ttyXX" which the the name of the |
| 4 | * tty belonging to file f. |
| 5 | * NULL if it is not a tty |
| 6 | */ |
| 7 | |
| 8 | #define NULL 0 |
| 9 | #include <sys/param.h> |
| 10 | #include <sys/ndir.h> |
| 11 | #include <sys/stat.h> |
| 12 | |
| 13 | static char dev[] = "/dev/"; |
| 14 | char *strcpy(); |
| 15 | char *strcat(); |
| 16 | |
| 17 | char * |
| 18 | ttyname(f) |
| 19 | { |
| 20 | struct stat fsb; |
| 21 | struct stat tsb; |
| 22 | register struct direct *db; |
| 23 | register DIR *df; |
| 24 | static char rbuf[32]; |
| 25 | |
| 26 | if (isatty(f)==0) |
| 27 | return(NULL); |
| 28 | if (fstat(f, &fsb) < 0) |
| 29 | return(NULL); |
| 30 | if ((fsb.st_mode&S_IFMT) != S_IFCHR) |
| 31 | return(NULL); |
| 32 | if ((df = opendir(dev)) == NULL) |
| 33 | return(NULL); |
| 34 | while ((db = readdir(df)) != NULL) { |
| 35 | if (db->d_ino != fsb.st_ino) |
| 36 | continue; |
| 37 | strcpy(rbuf, dev); |
| 38 | strcat(rbuf, db->d_name); |
| 39 | if (stat(rbuf, &tsb) < 0) |
| 40 | continue; |
| 41 | if (tsb.st_dev == fsb.st_dev && tsb.st_ino == fsb.st_ino) { |
| 42 | closedir(df); |
| 43 | return(rbuf); |
| 44 | } |
| 45 | } |
| 46 | closedir(df); |
| 47 | return(NULL); |
| 48 | } |