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 <br...@clisp.org> 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);