char * _ttyname_dev (dev_t rdev, char *buffer, size_t buflen) { struct stat64 st; int dostat = 0; char *name; int save = errno; if (__xstat64 (_STAT_VER, "/dev/pts", &st) == 0 && S_ISDIR (st.st_mode)) { dostat = 1; name = getttyname ("/dev/pts", rdev, -1, save, &dostat); } else { __set_errno (save); name = NULL; } if (!name && dostat != -1) { dostat = 1; name = getttyname ("/dev", rdev, -1, save, &dostat); } return name; }
/* Return the pathname of the terminal FD is open on, or NULL on errors. The returned storage is good only until the next call to this function. */ char * ttyname (int fd) { struct stat st; int dostat = 0; char *name; int save = errno; if (!__isatty (fd)) return NULL; if (fstat (fd, &st) < 0) return NULL; #ifdef _STATBUF_ST_RDEV name = getttyname (fd, st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname (fd, st.st_dev, st.st_ino, save, &dostat); #endif if (!name && dostat != -1) { dostat = 1; #ifdef _STATBUF_ST_RDEV name = getttyname (fd, st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname (fd, st.st_dev, st.st_ino, save, &dostat); #endif } return name; }
/* Return the pathname of the terminal FD is open on, or NULL on errors. The returned storage is good only until the next call to this function. */ char * ttyname (int fd) { struct stat64 st; char *name; int save = errno; if (!__isatty (fd)) return NULL; if (__fxstat64 (_STAT_VER, fd, &st) < 0) return NULL; name = getttyname ("/dev/pty/slv", st.st_dev, st.st_ino, save); if (!name) { name = getttyname ("/dev/pty/mst", st.st_dev, st.st_ino, save); } return name; }
/* Return the pathname of the terminal FD is open on, or NULL on errors. The returned storage is good only until the next call to this function. */ char * ttyname (int fd) { struct stat64 st, st1; int dostat = 0; char *name; int save = errno; struct termios term; /* isatty check, tcgetattr is used because it sets the correct errno (EBADF resp. ENOTTY) on error. */ if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0)) return NULL; if (__fxstat64 (_STAT_VER, fd, &st) < 0) return NULL; if (__xstat64 (_STAT_VER, "/dev/pts", &st1) == 0 && S_ISDIR (st1.st_mode)) { #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev/pts", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev/pts", st.st_dev, st.st_ino, save, &dostat); #endif } else { __set_errno (save); name = NULL; } if (!name && dostat != -1) { #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); #endif } if (!name && dostat != -1) { dostat = 1; #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); #endif } return name; }
/* Return the pathname of the terminal FD is open on, or NULL on errors. The returned storage is good only until the next call to this function. */ char * ttyname (int fd) { static size_t buflen; char procname[30]; struct stat64 st, st1; int dostat = 0; char *name; int save = errno; struct termios term; /* isatty check, tcgetattr is used because it sets the correct errno (EBADF resp. ENOTTY) on error. */ if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0)) return NULL; /* We try using the /proc filesystem. */ *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0'; if (buflen == 0) { buflen = 4095; ttyname_buf = (char *) malloc (buflen + 1); if (ttyname_buf == NULL) { buflen = 0; return NULL; } } ssize_t len = __readlink (procname, ttyname_buf, buflen); if (__builtin_expect (len == -1 && errno == ENOENT, 0)) { __set_errno (EBADF); return NULL; } if (__builtin_expect (len != -1 #ifndef __ASSUME_PROC_SELF_FD_SYMLINK /* This is for Linux 2.0. */ && ttyname_buf[0] != '[' #endif , 1)) { if ((size_t) len >= buflen) return NULL; /* readlink need not terminate the string. */ ttyname_buf[len] = '\0'; return ttyname_buf; } if (__fxstat64 (_STAT_VER, fd, &st) < 0) return NULL; if (__xstat64 (_STAT_VER, "/dev/pts", &st1) == 0 && S_ISDIR (st1.st_mode)) { #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev/pts", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev/pts", st.st_dev, st.st_ino, save, &dostat); #endif } else { __set_errno (save); name = NULL; } if (!name && dostat != -1) { #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); #endif } if (!name && dostat != -1) { dostat = 1; #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); #endif } return name; }
/* Return the pathname of the terminal FD is open on, or NULL on errors. The returned storage is good only until the next call to this function. */ char * ttyname (int fd) { static size_t buflen; char procname[30]; struct stat64 st, st1; int dostat = 0; char *name; int save = errno; struct termios term; /* isatty check, tcgetattr is used because it sets the correct errno (EBADF resp. ENOTTY) on error. */ if (__glibc_unlikely (__tcgetattr (fd, &term) < 0)) return NULL; if (__fxstat64 (_STAT_VER, fd, &st) < 0) return NULL; /* We try using the /proc filesystem. */ *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0'; if (buflen == 0) { buflen = 4095; ttyname_buf = (char *) malloc (buflen + 1); if (ttyname_buf == NULL) { buflen = 0; return NULL; } } ssize_t len = __readlink (procname, ttyname_buf, buflen); if (__glibc_likely (len != -1)) { if ((size_t) len >= buflen) return NULL; #define UNREACHABLE_LEN strlen ("(unreachable)") if (len > UNREACHABLE_LEN && memcmp (ttyname_buf, "(unreachable)", UNREACHABLE_LEN) == 0) { memmove (ttyname_buf, ttyname_buf + UNREACHABLE_LEN, len - UNREACHABLE_LEN); len -= UNREACHABLE_LEN; } /* readlink need not terminate the string. */ ttyname_buf[len] = '\0'; /* Verify readlink result, fall back on iterating through devices. */ if (ttyname_buf[0] == '/' && __xstat64 (_STAT_VER, ttyname_buf, &st1) == 0 #ifdef _STATBUF_ST_RDEV && S_ISCHR (st1.st_mode) && st1.st_rdev == st.st_rdev #else && st1.st_ino == st.st_ino && st1.st_dev == st.st_dev #endif ) return ttyname_buf; } if (__xstat64 (_STAT_VER, "/dev/pts", &st1) == 0 && S_ISDIR (st1.st_mode)) { #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev/pts", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev/pts", st.st_dev, st.st_ino, save, &dostat); #endif } else { __set_errno (save); name = NULL; } if (!name && dostat != -1) { #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); #endif } if (!name && dostat != -1) { dostat = 1; #ifdef _STATBUF_ST_RDEV name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat); #else name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat); #endif } return name; }