ptsname_r: Make it consistent with ptsname on AIX.
authorBruno Haible <bruno@clisp.org>
Sun, 24 Jun 2012 23:00:57 +0000 (01:00 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 24 Jun 2012 23:00:57 +0000 (01:00 +0200)
* 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
lib/ptsname_r.c
tests/test-ptsname_r.c

index 908dca4..ebbc96b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2012-06-24  Bruno Haible  <bruno@clisp.org>
 
+       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.
index ec314c6..1d0ba82 100644 (file)
@@ -53,7 +53,7 @@
 # include <stdio.h>
 #endif
 
-#ifdef __osf__
+#if defined _AIX || defined __osf__
 /* Get ioctl(), ISPTM.  */
 # include <sys/ioctl.h>
 /* 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;
index edb5e3d..45ae8f0 100644 (file)
@@ -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);
             }
         }