# HG changeset patch # User Bruno Haible # Date 1340556417 -7200 # Node ID 17843e28426490c9b08b2f23498cdcf85c998322 # Parent 55517840cca91c5f3429469d8366aa6b37d9d0da ptsname_r: Add support for Solaris. * lib/ptsname_r.c (__ptsname_r): Add a different implementation for Solaris. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2012-06-24 Bruno Haible + ptsname_r: Add support for Solaris. + * lib/ptsname_r.c (__ptsname_r): Add a different implementation for + Solaris. + ptsname_r: Fix test failure on native Windows. * modules/ptsname_r (Depends-on): Add isatty. diff --git a/lib/ptsname_r.c b/lib/ptsname_r.c --- a/lib/ptsname_r.c +++ b/lib/ptsname_r.c @@ -42,6 +42,17 @@ #endif +#ifdef __sun +/* Get ioctl() and 'struct strioctl'. */ +# include +/* Get ISPTM. */ +# include +# include +/* Get the major, minor macros. */ +# include +# include +#endif + /* Store at most BUFLEN characters of the pathname of the slave pseudo terminal associated with the master FD is open on in BUF. @@ -59,6 +70,44 @@ return EINVAL; } +#if defined __sun /* Solaris */ + if (fstat (fd, &st) < 0) + return errno; + if (!(S_ISCHR (st.st_mode) && major (st.st_rdev) == 0)) + { + errno = ENOTTY; + return errno; + } + { + /* Master ptys can be recognized through a STREAMS ioctl. See + "STREAMS-based Pseudo-Terminal Subsystem" + + and "STREAMS ioctl commands" + + */ + struct strioctl ioctl_arg; + ioctl_arg.ic_cmd = ISPTM; + ioctl_arg.ic_timout = 0; + ioctl_arg.ic_len = 0; + ioctl_arg.ic_dp = NULL; + + if (ioctl (fd, I_STR, &ioctl_arg) < 0) + { + errno = ENOTTY; + return errno; + } + } + { + char tmpbuf[9 + 10 + 1]; + int n = sprintf (tmpbuf, "/dev/pts/%u", minor (st.st_rdev)); + if (n >= buflen) + { + errno = ERANGE; + return errno; + } + memcpy (buf, tmpbuf, n + 1); + } +#else if (!__isatty (fd)) { #if ISATTY_FAILS_WITHOUT_SETTING_ERRNO && defined F_GETFL /* IRIX, Solaris */ @@ -85,6 +134,7 @@ } buf[sizeof (_PATH_DEV) - 1] = 't'; +#endif if (__stat (buf, &st) < 0) return errno;