ttyname.c 747 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include <errno.h>
  2. #include <sys/stat.h>
  3. #include <dirent.h>
  4. char *
  5. ttyname(fd)
  6. int fd;
  7. {
  8. static char dev[] = "/dev";
  9. struct stat st, dst;
  10. DIR *fp;
  11. struct dirent *d;
  12. static char name[NAME_MAX];
  13. int noerr = errno;
  14. if (fstat(fd, &st) < 0)
  15. return 0;
  16. if (!isatty(fd))
  17. {
  18. errno = ENOTTY;
  19. return 0;
  20. }
  21. fp = opendir(dev);
  22. if (fp == 0)
  23. return 0;
  24. strcpy(name, dev);
  25. strcat(name, "/");
  26. while ((d = readdir(fp)) != 0)
  27. {
  28. strcpy(name + sizeof(dev), d->d_name);
  29. if (stat(name, &dst) == 0
  30. && st.st_dev == dst.st_dev && st.st_ino == dst.st_ino)
  31. {
  32. closedir(fp);
  33. errno = noerr;
  34. return name;
  35. }
  36. }
  37. closedir(fp);
  38. errno = noerr;
  39. return 0;
  40. }