From c5e340c71ba6f4563ca5fa245baa82b6363ddb2e Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 29 Oct 1998 15:17:25 +0000 Subject: Update. 1998-10-29 Ulrich Drepper * sysdeps/unix/sysv/linux/ttyname_r.c (ttyname_r): Try reading /prof/self/fd/FD first. * sysdeps/unix/sysv/linux/ttyname.c (ttyname): Likewise. * stdio-common/_itoa.h (_fitoa_word): New inline function. Write formatted number starting at given position and return pointer to following byte. (_fitoa): Likewise, for long long. --- sysdeps/unix/sysv/linux/ttyname.c | 22 ++++++++++++++++++++++ sysdeps/unix/sysv/linux/ttyname_r.c | 15 +++++++++++++++ 2 files changed, 37 insertions(+) (limited to 'sysdeps/unix/sysv/linux') diff --git a/sysdeps/unix/sysv/linux/ttyname.c b/sysdeps/unix/sysv/linux/ttyname.c index 91f0d7a40f..40b006a8cd 100644 --- a/sysdeps/unix/sysv/linux/ttyname.c +++ b/sysdeps/unix/sysv/linux/ttyname.c @@ -26,6 +26,8 @@ #include #include +#include + char *__ttyname = NULL; static char * getttyname __P ((const char *dev, int fd, dev_t mydev, @@ -104,6 +106,9 @@ char * ttyname (fd) int fd; { + static char *buf; + static size_t buflen = 0; + char procname[30]; struct stat st, st1; int dostat = 0; char *name; @@ -112,6 +117,23 @@ ttyname (fd) if (!__isatty (fd)) return NULL; + /* We try using the /proc filesystem. */ + *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0'; + + if (buflen == 0) + { + buflen = 4095; + buf = (char *) malloc (buflen + 1); + if (buf == NULL) + { + buflen = 0; + return NULL; + } + } + + if (__readlink (procname, buf, buflen) != -1) + return buf; + if (fstat (fd, &st) < 0) return NULL; diff --git a/sysdeps/unix/sysv/linux/ttyname_r.c b/sysdeps/unix/sysv/linux/ttyname_r.c index 9c859caa25..8306cf56c0 100644 --- a/sysdeps/unix/sysv/linux/ttyname_r.c +++ b/sysdeps/unix/sysv/linux/ttyname_r.c @@ -26,6 +26,8 @@ #include #include +#include + static int getttyname_r __P ((int fd, char *buf, size_t buflen, dev_t mydev, ino_t myino, int save, int *dostat)) internal_function; @@ -102,6 +104,7 @@ __ttyname_r (fd, buf, buflen) char *buf; size_t buflen; { + char procname[30]; struct stat st, st1; int dostat = 0; int save = errno; @@ -127,6 +130,18 @@ __ttyname_r (fd, buf, buflen) return ENOTTY; } + /* We try using the /proc filesystem. */ + *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0'; + + ret = __readlink (procname, buf, buflen - 1); + if (ret != -1) + return 0; + if (errno == ENAMETOOLONG) + { + __set_errno (ERANGE); + return ERANGE; + } + if (fstat (fd, &st) < 0) return errno; -- cgit v1.2.3-70-g09d2