bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

ptsname_r on OSF/1


From: Bruno Haible
Subject: ptsname_r on OSF/1
Date: Sun, 24 Jun 2012 23:40:06 +0200
User-agent: KMail/4.7.4 (Linux/3.1.10-1.9-desktop; KDE/4.7.4; x86_64; ; )

On OSF/1, gnulib's ptsname_r function returns a file name like
"/dev/ttyp5". But ptsname() returns something like "/dev/pts/5".
How does it do this? 'truss' reveals it:

  ioctl(3, 0x20007447, 0x00000000)                = 7340037 = 0x700005
  stat("/dev/pts/5", 0x000000011FFFBA70)          = 0

To make ptsname_r() consistent with ptsname(), I'm therefore adding this
patch:


2012-06-24  Bruno Haible  <address@hidden>

        ptsname_r: Make it consistent with ptsname on OSF/1.
        * lib/ptsname_r.c (__ptsname_r): Add a different implementation for
        OSF/1.

--- lib/ptsname_r.c.orig        Sun Jun 24 23:24:44 2012
+++ lib/ptsname_r.c     Sun Jun 24 23:23:10 2012
@@ -53,6 +53,14 @@
 # include <stdio.h>
 #endif
 
+#ifdef __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.
@@ -103,6 +111,35 @@
     if (n >= buflen)
       {
         errno = ERANGE;
+        return errno;
+      }
+    memcpy (buf, tmpbuf, n + 1);
+  }
+#elif defined __osf__ /* 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 dev;
+    char tmpbuf[9 + 10 + 1];
+    int n;
+    dev = ioctl (fd, ISPTM, NULL);
+    if (dev < 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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]