[comp.unix.i386] Help needed with Streams based pseudo ttys

simon@vision.UUCP (Simon Taylor) (07/05/89)

	I need information on how to use the streams based pseudo-ttys
distributed with Interactive 386/ix 2.0. There is a single clone major
(/dev/ptmx), and 16 slaves (/dev/pts???). The major can be opened, but
I can never open the slaves, even with the master being held open. It
would seem only sensible due to the clone nature of the master, that
I need to perform some operation to discover which slave to open. The
header file defines two ioctl flags, but doesn't elaborate. Interactive
refused to answer my questions, well they didn't exactly refuse, they just
never rang back.

		Andy Warner


VisionWare Ltd.,                 
Systime House, 
Leeds Business Park,      
Leeds,                   
LS27 0NH,               
United Kingdom                  UUCP : andyw@vision.uucp
                             BANGNET : ...!uunet!mcvax!ukc!vision!andyw      

             ---------------------------------------

larry@hcr.UUCP (Larry Philps) (07/06/89)

In article <670@vision.UUCP> andyw@vision.UUCP (Andy Warner) writes:
>	I need information on how to use the streams based pseudo-ttys
>distributed with Interactive 386/ix 2.0. There is a single clone major
>(/dev/ptmx), and 16 slaves (/dev/pts???). The major can be opened, but
>I can never open the slaves, even with the master being held open. It
>would seem only sensible due to the clone nature of the master, that
>I need to perform some operation to discover which slave to open. The
>header file defines two ioctl flags, but doesn't elaborate. Interactive
>refused to answer my questions, well they didn't exactly refuse, they just
>never rang back.

I have not tried this with the 386ix 2.0 version of ptys, but have done
similar things with other "clone" pty implementations.  The code
to do such a thing is usually (using your names for the devices):

	int		master, slave;
	struct stat	statbuf;
	char		slavetty[sizeof("/dev/pts00")];

	...

	/* Get the master side */
	if ((master = open("/dev/ptmx", O_RDWR)) < 0) {
		perror("/dev/ptmx");
		exit(1);
	}
	/*
	 * Stat the master and look at the minor device number of the
	 * rdev field to find out which pty the clone device assigned
	 * to us.  Then form the name of the corresponding slave pty
	 */
	if (fstat(master, &statbuf) < 0) {
		perror("fstat");
		exit(2);
	}
	(void) sprintf(slavetty, "/dev/pts%02d", minor(statbuf.st_rdev));

	if ((slave = open(slavetty, O_RDWR) < 0) {
		perror(slavetty);
		exit(2);
	}

Warning: I have not tested this or even copied it, I just typed it in
	 off the top of my head.  This is what I would try.  Use at your
	 own risk.

---
Larry Philps                             HCR Corporation
130 Bloor St. West, 10th floor           Toronto, Ontario.  M5S 1N5
(416) 922-1937                           {utzoo,utcsri,uunet}!hcr!larry