From: Bruno Haible Date: Sun, 24 Jun 2012 16:46:57 +0000 (+0200) Subject: ptsname_r: Add support for Solaris. X-Git-Tag: v0.1~586 X-Git-Url: http://erislabs.net/gitweb/?p=gnulib.git;a=commitdiff_plain;h=aa72d59556c6234a781bb08c138face189649842 ptsname_r: Add support for Solaris. * lib/ptsname_r.c (__ptsname_r): Add a different implementation for Solaris. --- diff --git a/ChangeLog b/ChangeLog index 7348a2913..08131d3c9 100644 --- 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 index aa3ba38cb..3805347c7 100644 --- 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 @@ __ptsname_r (int fd, char *buf, size_t buflen) 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 @@ __ptsname_r (int fd, char *buf, size_t buflen) } buf[sizeof (_PATH_DEV) - 1] = 't'; +#endif if (__stat (buf, &st) < 0) return errno;