xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/isatty.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include <string.h>
33e12c5d1SDavid du Colombier #include <sys/types.h>
43e12c5d1SDavid du Colombier #include <sys/stat.h>
53e12c5d1SDavid du Colombier #include "sys9.h"
63e12c5d1SDavid du Colombier #include "dir.h"
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier int
9*219b2ee8SDavid du Colombier _isatty(int fd)
103e12c5d1SDavid du Colombier {
113e12c5d1SDavid du Colombier 	int t;
123e12c5d1SDavid du Colombier 	Dir d1, d2;
133e12c5d1SDavid du Colombier 	char cd[DIRLEN];
143e12c5d1SDavid du Colombier 	char buf[5+NAMELEN];
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier 	if(_FSTAT(fd, cd) < 0)
173e12c5d1SDavid du Colombier 		return 0;
183e12c5d1SDavid du Colombier 	convM2D(cd, &d1);
19*219b2ee8SDavid du Colombier 	if(strncmp(d1.name, "ptty", 4)==0)
20*219b2ee8SDavid du Colombier 		return 1;
213e12c5d1SDavid du Colombier 	if(_STAT("/dev/cons", cd) < 0)
223e12c5d1SDavid du Colombier 		return 0;
233e12c5d1SDavid du Colombier 	convM2D(cd, &d2);
243e12c5d1SDavid du Colombier 
253e12c5d1SDavid du Colombier 	/*
263e12c5d1SDavid du Colombier 	 * If we came in through con, /dev/cons is probably #d/0, which
273e12c5d1SDavid du Colombier 	 * won't match stdin.  Opening #d/0 and fstating it gives the
283e12c5d1SDavid du Colombier 	 * values of the underlying channel
293e12c5d1SDavid du Colombier 	 */
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier 	if(d2.type == 'd'){
323e12c5d1SDavid du Colombier 		strcpy(buf, "#d/");
333e12c5d1SDavid du Colombier 		strcpy(buf+3, d2.name);
343e12c5d1SDavid du Colombier 		if((t = _OPEN(buf, 0)) < 0)
353e12c5d1SDavid du Colombier 			return 0;
363e12c5d1SDavid du Colombier 		if(_FSTAT(t, cd) < 0){
373e12c5d1SDavid du Colombier 			_CLOSE(t);
383e12c5d1SDavid du Colombier 			return 0;
393e12c5d1SDavid du Colombier 		}
403e12c5d1SDavid du Colombier 		_CLOSE(t);
413e12c5d1SDavid du Colombier 		convM2D(cd, &d2);
423e12c5d1SDavid du Colombier 	}
433e12c5d1SDavid du Colombier 	return (d1.type == d2.type) && (d1.dev == d2.dev);
443e12c5d1SDavid du Colombier }
45*219b2ee8SDavid du Colombier 
46*219b2ee8SDavid du Colombier /* The FD_ISTTY flag is set via _isatty in _fdsetup or open */
47*219b2ee8SDavid du Colombier int
48*219b2ee8SDavid du Colombier isatty(fd)
49*219b2ee8SDavid du Colombier {
50*219b2ee8SDavid du Colombier 	if(_fdinfo[fd].flags&FD_ISTTY)
51*219b2ee8SDavid du Colombier 		return 1;
52*219b2ee8SDavid du Colombier 	else
53*219b2ee8SDavid du Colombier 		return 0;
54*219b2ee8SDavid du Colombier }
55