summaryrefslogtreecommitdiff
path: root/lib/ttyname_r.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2010-04-25 20:57:52 +0200
committerBruno Haible <bruno@clisp.org>2010-04-25 20:57:52 +0200
commita731808a4ac512228e870d5f443b91557f418559 (patch)
treece2ed135184d82c8cfcd171cd1bd0418b8e5edec /lib/ttyname_r.c
parent3a684fbdcc7cc1381585d5c2c8c27099bf4a1281 (diff)
downloadgnulib-a731808a4ac512228e870d5f443b91557f418559.tar.gz
ttyname_r: Make it work on MacOS X 10.4 and Solaris 10.
Diffstat (limited to 'lib/ttyname_r.c')
-rw-r--r--lib/ttyname_r.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/ttyname_r.c b/lib/ttyname_r.c
index dc8b923f1b..d3e58eb21d 100644
--- a/lib/ttyname_r.c
+++ b/lib/ttyname_r.c
@@ -22,12 +22,30 @@
#include <unistd.h>
#include <errno.h>
+#include <limits.h>
#include <string.h>
int
ttyname_r (int fd, char *buf, size_t buflen)
+#undef ttyname_r
{
-#if HAVE_TTYNAME
+ /* When ttyname_r exists and works, use it.
+ But on Solaris 10, ttyname_r is broken: it returns NULL in situations
+ when ttyname finds the result. */
+#if HAVE_TTYNAME_R && !defined __sun
+ /* This code is multithread-safe. */
+ char *name = ttyname_r (fd, buf, buflen <= INT_MAX ? buflen : INT_MAX);
+ if (name == NULL)
+ return errno;
+ if (name != buf)
+ {
+ size_t namelen = strlen (name) + 1;
+ if (namelen > buflen)
+ return ERANGE;
+ memmove (buf, name, namelen);
+ }
+ return 0;
+#elif HAVE_TTYNAME
/* Note: This is not multithread-safe. */
char *name;
size_t namelen;