gettimeofday: port recent C++ fix to Emacs
[gnulib.git] / lib / ptsname_r.c
index 3805347..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
 # include <stdio.h>
 #endif
 
+#if defined _AIX || defined __osf__
+/* Get ioctl(), ISPTM.  */
+# include <sys/ioctl.h>
+/* Get the major, minor macros.  */
+# include <sys/sysmacros.h>
+# include <stdio.h>
+#endif
+
 
 /* Store at most BUFLEN characters of the pathname of the slave pseudo
    terminal associated with the master FD is open on in BUF.
@@ -107,6 +115,42 @@ __ptsname_r (int fd, char *buf, size_t buflen)
       }
     memcpy (buf, tmpbuf, n + 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().  */
+  if (fstat (fd, &st) < 0)
+    return errno;
+  if (!S_ISCHR (st.st_mode))
+    {
+      errno = ENOTTY;
+      return errno;
+    }
+  {
+    int ret;
+    int dev;
+    char tmpbuf[9 + 10 + 1];
+    int n;
+# 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;
+      }
+    n = sprintf (tmpbuf, "/dev/pts/%u", minor (dev));
+    if (n >= buflen)
+      {
+        errno = ERANGE;
+        return errno;
+      }
+    memcpy (buf, tmpbuf, n + 1);
+  }
 #else
   if (!__isatty (fd))
     {
@@ -133,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)