/* Determine name of the slave side of a pseudo-terminal.
- Copyright (C) 1998, 2002, 2010-2012 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2002, 2010-2013 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
# include <stdio.h>
#endif
+#if defined _AIX || defined __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.
}
memcpy (buf, tmpbuf, n + 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(). */
+ if (fstat (fd, &st) < 0)
+ return errno;
+ if (!S_ISCHR (st.st_mode))
+ {
+ errno = ENOTTY;
+ return errno;
+ }
+ {
+ int ret;
+ int dev;
+ char tmpbuf[9 + 10 + 1];
+ int n;
+# ifdef _AIX
+ ret = ioctl (fd, ISPTM, &dev);
+# endif
+# ifdef __osf__
+ ret = ioctl (fd, ISPTM, NULL);
+ dev = ret;
+# endif
+ if (ret < 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);
+ }
#else
if (!__isatty (fd))
{
return errno;
}
- buf[sizeof (_PATH_DEV) - 1] = 't';
+ if (strncmp(buf, "/dev/pts/", strlen("/dev/pts/")) != 0)
+ buf[sizeof (_PATH_DEV) - 1] = 't';
#endif
if (__stat (buf, &st) < 0)