[Top][All Lists]
[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);
- ptsname_r on OSF/1,
Bruno Haible <=