Subject: Re: Linux pseudo tty
To: None <>
From: Christos Zoulas <>
List: tech-kern
Date: 02/14/2001 00:28:18
In article <1eosjsq.1n8c6c11356f9rM@[]>,
Emmanuel Dreyfus <> wrote:
>Here is the ktrace of Linux's xterm on PowerPC.
>   210 xterm    CALL  ioctl(0x4,_IOR('T',0x30,0x4),0x7fffd178)
>   210 xterm    RET   ioctl 0
>   210 xterm    CALL  stat(0x5040ce08,0x7fffcbc8)
>   210 xterm    NAMI  "/emul/linux/dev/pts/0"
>   210 xterm    NAMI  "/dev/pts/0"
>   210 xterm    RET   stat -1 errno 2 No such file or directory
>_IOR('T',0x30,0x4) is LINUX_TIOCGPTN, it should return the pty number. I
>implemented it like this
>        case LINUX_TIOCGPTN:    /* get Pty number */
>                tty = curproc->p_pgrp->pg_session->s_ttyp;
>                idat = minor(tty->t_dev);
>                error = copyout (&idat, SCARG(uap,data), sizeof idat);
>It seems Linux uses things we don't do (the /dev/pts stuff). I've got
>very basic understanding of the tty stuff. Anyone can explain me what is
>going wrong?

1. All ioctl routines pass in struct proc *p, so you should be using that
   instead of curproc. New code should avoid using curproc.
2. s_ttyp could be null if the process does not have a controlling tty.
   In that case my guess is that ioctl should return ENOTTY or something.
3. For sizeof I usually do sizeof(output), instead of input for safety.
4. Look at the cloning device on compat_svr4 to see how the pty multiplexor
   code can be made to work. I am not sure what linux needs [svr4_net.c].
5. Well you are returning the right number, but you need to make the correct
   device nodes under /dev/pts [slave] /dev/ptc [master]
	ln -s /dev/ptyp0 /dev/ptc/0
	ln -s /dev/ttyp0 /dev/pts/0
	ln -s /dev/ptypf /dev/ptc/15
	ln -s /dev/ttypf /dev/pts/15
	ln -s /dev/ptyq0 /dev/ptc/16
	ln -s /dev/ttyq0 /dev/pts/16

    I prefer symlinks rather than making the actual devices so that locking

I hope that helps. Of course it would be nice if NetBSD supported a pty
cloning device as opposed to the current scanning kludge...