ttyname.c 843 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /* $Id$ */
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <sys/dir.h>
  5. #define DEV "/dev/"
  6. extern char *strcpy(), *strcat();
  7. char *
  8. ttyname(filedes)
  9. {
  10. static char result[MAXNAMLEN + 1 + 5];
  11. DIR *dirp;
  12. register struct direct *dp;
  13. struct stat fdstat;
  14. ino_t inode;
  15. dev_t device;
  16. char *name;
  17. if (! isatty(filedes) ||
  18. fstat(filedes, &fdstat) < 0 ||
  19. (fdstat.st_mode & S_IFMT) != S_IFCHR ||
  20. (dirp = opendir(DEV)) == NULL) {
  21. return 0;
  22. }
  23. inode = fdstat.st_ino;
  24. device = fdstat.st_rdev;
  25. while ((dp = readdir(dirp)) != NULL) {
  26. if (dp->d_ino != inode) continue;
  27. strcpy(result, DEV);
  28. strcat(result, dp->d_name);
  29. if (stat(result, &fdstat) < 0) continue;
  30. if (fdstat.st_rdev == device &&
  31. (fdstat.st_mode & S_IFMT) == S_IFCHR) {
  32. closedir(dirp);
  33. return result;
  34. }
  35. }
  36. closedir(dirp);
  37. return 0;
  38. }