Fix ttyname/ttyname_r
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Wed, 27 Aug 2008 11:35:53 +0000 (11:35 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Wed, 27 Aug 2008 11:35:53 +0000 (11:35 +0000)
sysdeps/unix/sysv/linux/ttyname.c
sysdeps/unix/sysv/linux/ttyname_r.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ttyname.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ttyname_r.c [new file with mode: 0644]

index 1b79787..82aad5e 100644 (file)
@@ -113,8 +113,10 @@ libc_freeres_ptr (static char *ttyname_buf);
 char *
 ttyname (int fd)
 {
+#ifndef __ASSUME_PROC_SELF_FD_NOT_SYMLINK
   static size_t buflen;
   char procname[30];
+#endif
   struct stat64 st, st1;
   int dostat = 0;
   char *name;
@@ -126,6 +128,7 @@ ttyname (int fd)
   if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0))
     return NULL;
 
+#ifndef __ASSUME_PROC_SELF_FD_NOT_SYMLINK
   /* We try using the /proc filesystem.  */
   *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0';
 
@@ -160,6 +163,7 @@ ttyname (int fd)
       ttyname_buf[len] = '\0';
       return ttyname_buf;
     }
+#endif /* __ASSUME_PROC_SELF_FD_NOT_SYMLINK */
 
   if (__fxstat64 (_STAT_VER, fd, &st) < 0)
     return NULL;
index cef8624..1343563 100644 (file)
@@ -97,10 +97,13 @@ getttyname_r (char *buf, size_t buflen, dev_t mydev, ino64_t myino,
 int
 __ttyname_r (int fd, char *buf, size_t buflen)
 {
+#ifndef __ASSUME_PROC_SELF_FD_NOT_SYMLINK
   char procname[30];
+#endif
   struct stat64 st, st1;
   int dostat = 0;
   int save = errno;
+  ssize_t ret;
 
   /* Test for the absolute minimal size.  This makes life easier inside
      the loop.  */
@@ -122,10 +125,11 @@ __ttyname_r (int fd, char *buf, size_t buflen)
   if (__builtin_expect (__tcgetattr (fd, &term) < 0, 0))
     return errno;
 
+#ifndef __ASSUME_PROC_SELF_FD_NOT_SYMLINK
   /* We try using the /proc filesystem.  */
   *_fitoa_word (fd, __stpcpy (procname, "/proc/self/fd/"), 10, 0) = '\0';
 
-  ssize_t ret = __readlink (procname, buf, buflen - 1);
+  ret = __readlink (procname, buf, buflen - 1);
   if (__builtin_expect (ret == -1 && errno == ENOENT, 0))
     {
       __set_errno (EBADF);
@@ -148,6 +152,7 @@ __ttyname_r (int fd, char *buf, size_t buflen)
       buf[ret] = '\0';
       return 0;
     }
+#endif /* __ASSUME_PROC_SELF_FD_NOT_SYMLINK */
 
   if (__fxstat64 (_STAT_VER, fd, &st) < 0)
     return errno;
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ttyname.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ttyname.c
new file mode 100644 (file)
index 0000000..ae64c87
--- /dev/null
@@ -0,0 +1,2 @@
+#define __ASSUME_PROC_SELF_FD_NOT_SYMLINK
+#include <sysdeps/unix/sysv/linux/ttyname.c>
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ttyname_r.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ttyname_r.c
new file mode 100644 (file)
index 0000000..c129a8a
--- /dev/null
@@ -0,0 +1,2 @@
+#define __ASSUME_PROC_SELF_FD_NOT_SYMLINK
+#include <sysdeps/unix/sysv/linux/ttyname_r.c>