From d9200335a44aaf4ab8eff5c57c564dd1f2d6c46e Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 25 Jun 2012 01:00:57 +0200 Subject: [PATCH] ptsname_r: Make it consistent with ptsname on AIX. * lib/ptsname_r.c (__ptsname_r): For AIX, use nearly the same implementation as for OSF/1. * tests/test-ptsname_r.c (main) [AIX]: Use the modern way of opening a pty master. --- ChangeLog | 6 ++++++ lib/ptsname_r.c | 13 ++++++++++--- tests/test-ptsname_r.c | 29 ++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 908dca4d6..ebbc96ba9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2012-06-24 Bruno Haible + ptsname_r: Make it consistent with ptsname on AIX. + * lib/ptsname_r.c (__ptsname_r): For AIX, use nearly the same + implementation as for OSF/1. + * tests/test-ptsname_r.c (main) [AIX]: Use the modern way of opening + a pty master. + ptsname_r: Make it consistent with ptsname on OSF/1. * lib/ptsname_r.c (__ptsname_r): Add a different implementation for OSF/1. diff --git a/lib/ptsname_r.c b/lib/ptsname_r.c index ec314c6b4..1d0ba8226 100644 --- a/lib/ptsname_r.c +++ b/lib/ptsname_r.c @@ -53,7 +53,7 @@ # include #endif -#ifdef __osf__ +#if defined _AIX || defined __osf__ /* Get ioctl(), ISPTM. */ # include /* Get the major, minor macros. */ @@ -115,7 +115,7 @@ __ptsname_r (int fd, char *buf, size_t buflen) } memcpy (buf, tmpbuf, n + 1); } -#elif defined __osf__ /* OSF/1 */ +#elif defined _AIX || defined __osf__ /* AIX, OSF/1 */ /* This implementation returns /dev/pts/N, like ptsname() does. Whereas the generic implementation below returns /dev/ttypN. Both are correct, but let's be consistent with ptsname(). */ @@ -127,10 +127,17 @@ __ptsname_r (int fd, char *buf, size_t buflen) return errno; } { + int ret; int dev; char tmpbuf[9 + 10 + 1]; int n; - dev = ioctl (fd, ISPTM, NULL); +# ifdef _AIX + ret = ioctl (fd, ISPTM, &dev); +# endif +# ifdef __osf__ + ret = ioctl (fd, ISPTM, NULL); + dev = ret; +# endif if (dev < 0) { errno = ENOTTY; diff --git a/tests/test-ptsname_r.c b/tests/test-ptsname_r.c index edb5e3d9d..45ae8f05e 100644 --- a/tests/test-ptsname_r.c +++ b/tests/test-ptsname_r.c @@ -151,7 +151,7 @@ main (void) char buffer[256]; int result; - /* Open the controlling tty of the current process. */ + /* Open a pty master. */ fd = open ("/dev/ptmx", O_RDWR | O_NOCTTY); if (fd < 0) { @@ -168,6 +168,32 @@ main (void) close (fd); } +#elif defined _AIX + /* AIX has BSD-style /dev/ptyp[0-9a-f] files, but the modern way to open + a pty is to go through /dev/ptc. */ + { + int fd; + char buffer[256]; + int result; + + /* Open a pty master. */ + fd = open ("/dev/ptc", O_RDWR | O_NOCTTY); + if (fd < 0) + { + fprintf (stderr, "Skipping test: cannot open pseudo-terminal\n"); + return 77; + } + + result = ptsname_r (fd, buffer, sizeof buffer); + ASSERT (result == 0); + ASSERT (memcmp (buffer, "/dev/pts/", 9) == 0); + + test_errors (fd, buffer); + + /* This call hangs on AIX. */ + close (fd); + } + #else /* Try various master names of Mac OS X: /dev/pty[p-w][0-9a-f] */ @@ -196,6 +222,7 @@ main (void) test_errors (fd, buffer); + /* This call hangs on AIX. */ close (fd); } } -- 2.11.0