|
View:
New views
2 Messages
—
Rating Filter:
Alert me
|
|
|
ptsname_r on OSF/1On 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 <bruno@...> 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); |
|
|
Re: ptsname_r on OSF/1> 2012-06-24 Bruno Haible <bruno@...>
> > 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 <bruno@...> 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); } } |
| Free embeddable forum powered by Nabble | Forum Help |