[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ptsname_r on OSF/1
From: |
Bruno Haible |
Subject: |
Re: ptsname_r on OSF/1 |
Date: |
Mon, 25 Jun 2012 01:04:03 +0200 |
User-agent: |
KMail/4.7.4 (Linux/3.1.10-1.9-desktop; KDE/4.7.4; x86_64; ; ) |
> 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.
Nearly the same code works also on AIX. Unfortunately, it does not fix
the problem that close() hangs when applied to the pty master's fd. Add
a comment about it in the test.
2012-06-24 Bruno Haible <address@hidden>
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.
--- lib/ptsname_r.c.orig Mon Jun 25 00:58:44 2012
+++ lib/ptsname_r.c Mon Jun 25 00:40:19 2012
@@ -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 @@
}
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 @@
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;
--- tests/test-ptsname_r.c.orig Mon Jun 25 00:58:44 2012
+++ tests/test-ptsname_r.c Mon Jun 25 00:42:36 2012
@@ -151,7 +151,7 @@
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 @@
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 @@
test_errors (fd, buffer);
+ /* This call hangs on AIX. */
close (fd);
}
}