Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Jul 2000 08:59:24 -0400 (EDT)
From:      Brian Dean <brdean@unx.sas.com>
To:        freebsd-arch@freebsd.org
Subject:   isatty() reports false results
Message-ID:  <Pine.BSF.4.21.0007250857130.51871-100000@tribble.unx.sas.com>

next in thread | raw e-mail | index | archive | help
Hi,

Recently, while setting up a VPN using pppd to establish a link across
an 'ssh' connection, I discovered that 'isatty()' will report that a
pseudo-tty is not really a tty if the slave side of the master/slave
pair has not yet been opened.  This is due to the logic in
kern/tty_pty.c, ptyioctl() where all but 4 ioctl's return EAGAIN if
the slave side of the connection has not yet been opened.

The flaw in 'isatty()' is that it calls 'tcgetattr()', but only checks
for a -1 return code, and ignores the errno to determine the true
cause of the error return.  My approach to fixing this is to make
'isatty()' a little smarter utilizing the following logic (WARNING -
an untested patch follows [it will be fully tested before being
committed]):

Index: isatty.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/isatty.c,v
retrieving revision 1.3
diff -u -r1.3 isatty.c
--- isatty.c	1998/06/09 08:32:23	1.3
+++ isatty.c	2000/07/25 02:56:04
@@ -52,7 +52,18 @@
 #ifdef _THREAD_SAFE
 	if (_FD_LOCK(fd, FD_READ, NULL) == 0) {
 #endif
-		retval = (tcgetattr(fd, &t) != -1);
+		if (tcgetattr(fd, &t) == -1) {
+			/*
+			 * check for pty controller open, but tty
+			 * slave not yet open
+			 */
+			if (errno == EAGAIN)
+				retval = 1;
+			else
+				retval = 0;
+		}
+		else
+			retval = 1;
 #ifdef _THREAD_SAFE
         	_FD_UNLOCK(fd, FD_READ);
 	} else {


My question - does anyone know if this logic will break anything else,
i.e., a case where a call to 'tcgetattr()' with a descriptor that
*does not* refer to a tty will return EAGAIN?  I haven't seen anything
that does so; the pseudo-tty driver seems to be unique in this regard,
so I'm thinking this change should fix 'isatty()' and not break
anything else in the process (famous last words :)).

Lastly, any suggestions for a better alternative?

Thanks,
-Brian
-- 
Brian Dean
bsd@FreeBSD.org
bsd@bsdhome.com



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0007250857130.51871-100000>