diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-10-29 15:17:25 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-10-29 15:17:25 +0000 |
commit | c5e340c71ba6f4563ca5fa245baa82b6363ddb2e (patch) | |
tree | 3ff655dfee624df411e1f3ebc062181fc0f3f338 /sysdeps | |
parent | 05e951cd1ae7917ce25ec96cc17ebcbf401e345c (diff) | |
download | glibc-c5e340c71ba6f4563ca5fa245baa82b6363ddb2e.tar glibc-c5e340c71ba6f4563ca5fa245baa82b6363ddb2e.tar.gz glibc-c5e340c71ba6f4563ca5fa245baa82b6363ddb2e.tar.bz2 glibc-c5e340c71ba6f4563ca5fa245baa82b6363ddb2e.zip |
Update.
1998-10-29 Ulrich Drepper <drepper@cygnus.com>
* 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.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/ttyname.c | 22 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ttyname_r.c | 15 |
2 files changed, 37 insertions, 0 deletions
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 <string.h> #include <stdlib.h> +#include <stdio-common/_itoa.h> + 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 <string.h> #include <stdlib.h> +#include <stdio-common/_itoa.h> + 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; |