diff options
author | Bruno Haible <bruno@clisp.org> | 2010-04-25 20:57:52 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2010-04-25 20:57:52 +0200 |
commit | a731808a4ac512228e870d5f443b91557f418559 (patch) | |
tree | ce2ed135184d82c8cfcd171cd1bd0418b8e5edec /lib/ttyname_r.c | |
parent | 3a684fbdcc7cc1381585d5c2c8c27099bf4a1281 (diff) | |
download | gnulib-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.c | 20 |
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; |