|
|
1.1 ! root 1: #define NEWTTYS 1 ! 2: /* ! 3: * libc/gen/ttyname.c ! 4: * Coherent I/O Library. ! 5: * Return the name of the terminal device ! 6: * associated with the given file descriptor. ! 7: * The names in /etc/ttys define the domain. ! 8: */ ! 9: ! 10: #include <stdio.h> ! 11: #include <sys/stat.h> ! 12: #include <sys/dir.h> ! 13: ! 14: extern char *index(); ! 15: ! 16: static char dev_buff[DIRSIZ+8] = "/dev/console"; ! 17: ! 18: char * ! 19: ttyname(fd) int fd; ! 20: { ! 21: if (_ttyslot(fd) >= 0) ! 22: return dev_buff; ! 23: return NULL; ! 24: } ! 25: ! 26: /* ! 27: * Return the /etc/ttys slot for fd, -1 on error. ! 28: * The /dev/... name is left in dev_buff. ! 29: * Used by ttyname() and ttyslot(). ! 30: */ ! 31: int ! 32: _ttyslot(fd) int fd; ! 33: { ! 34: register FILE *fp; ! 35: register short fd_mode; ! 36: register dev_t fd_rdev; ! 37: register int slot; ! 38: struct stat sb; ! 39: ! 40: if (fstat(fd, &sb) < 0 ! 41: || (fp = fopen("/etc/ttys", "r")) == NULL) ! 42: return -1; ! 43: fd_mode = sb.st_mode; ! 44: fd_rdev = sb.st_rdev; ! 45: for (slot = 0; ; slot += 1) { ! 46: if (getc(fp) == '\n' /* Missing status */ ! 47: #if NEWTTYS ! 48: || getc(fp) == '\n' /* Missing line type, ie loc or rem */ ! 49: #endif ! 50: || getc(fp) == '\n' /* Missing getty arg */ ! 51: || fgets(dev_buff+5, DIRSIZ, fp) == NULL ! 52: || index(dev_buff, '\n') == NULL) { ! 53: slot = -1; ! 54: break; ! 55: } ! 56: *index(dev_buff, '\n') = 0; ! 57: if (stat(dev_buff, &sb) >= 0 ! 58: && sb.st_mode == fd_mode ! 59: && sb.st_rdev == fd_rdev) ! 60: break; ! 61: } ! 62: fclose(fp); ! 63: return slot; ! 64: } ! 65: ! 66: /* end of libc/gen/ttyname.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.