strtoimax: port to HP-UX 11.11
[gnulib.git] / lib / ptsname_r.c
index ec314c6..5b345f3 100644 (file)
@@ -1,5 +1,5 @@
 /* Determine name of the slave side of a pseudo-terminal.
-   Copyright (C) 1998, 2002, 2010-2012 Free Software Foundation, Inc.
+   Copyright (C) 1998, 2002, 2010-2013 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -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,11 +127,18 @@ __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);
-    if (dev < 0)
+# ifdef _AIX
+    ret = ioctl (fd, ISPTM, &dev);
+# endif
+# ifdef __osf__
+    ret = ioctl (fd, ISPTM, NULL);
+    dev = ret;
+# endif
+    if (ret < 0)
       {
         errno = ENOTTY;
         return errno;
@@ -170,7 +177,8 @@ __ptsname_r (int fd, char *buf, size_t buflen)
       return errno;
     }
 
-  buf[sizeof (_PATH_DEV) - 1] = 't';
+  if (strncmp(buf, "/dev/pts/", strlen("/dev/pts/")) != 0)
+    buf[sizeof (_PATH_DEV) - 1] = 't';
 #endif
 
   if (__stat (buf, &st) < 0)