tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pty(4) doco fix



On Thu, Sep 02, 2010 at 11:40:18AM -0500, David Young wrote:
> I'm trying to use TIOCPKT_IOCTL, which is described in pty(4).  I had
> to use an undocumented ioctl, TIOCEXT, to get it to work, and it worked
> differently than the manual page said it would.  I've attached a patch
> for the manual page, and the new manual page, for review.
> 
> All uses of TIOCPKT_IOCTL in the kernel should be reviewed.  ISTR that
> the way it's used in sysinst doesn't accord with the documentation, old
> or new.

I still think that the TIOCEXT doco fix is correct, but the reason
that TIOCPKT_IOCTL works differently than I expected *seems* to be a
regression in ptcread().  In NetBSD, we have this:

                if (ISSET(tp->t_state, TS_ISOPEN)) {
                        if (pti->pt_flags & PF_PKT && (c = pti->pt_send)) {
                                pti->pt_send = 0;
                                mutex_spin_exit(&tty_lock);
                                error = ureadc(c, uio);
                                if (error)
                                        return (error);
                                /*
                                 * Since we don't have the tty locked, there's
                                 * a risk of messing up `t_termios'. This is
                                 * relevant only if the tty got closed and then
                                 * opened again while we were out uiomoving.
                                 */
                                if (pti->pt_send & TIOCPKT_IOCTL) {
                                        cc = min(uio->uio_resid,
                                                sizeof(tp->t_termios));
                                        uiomove((void *) &tp->t_termios,
                                                cc, uio);
                                }
                                return (0);
                        }

pti->pt_send is set to 0 before the test for TIOCPKT_IOCTL, so ptcread()
never writes a termios structure.  I guess that we could test 'c' for
TIOCPKT_IOCTL, instead.

I compared with the code in FreeBSD.  Their manual page doesn't describe
TIOCPKT_IOCTL, but it looks their pty(4) behaves the way our manual says
ours should:

                if (tp->t_state&TS_ISOPEN) {
                        if (pt->pt_flags&PF_PKT && pt->pt_send) {
                                error = ureadc((int)pt->pt_send, uio);
                                if (error)
                                        return (error);
                                if (pt->pt_send & TIOCPKT_IOCTL) {
                                        cc = min(uio->uio_resid,
                                                sizeof(tp->t_termios));
                                        uiomove(&tp->t_termios, cc, uio);
                                }
                                pt->pt_send = 0;
                                return (0);
                        }

Dave

-- 
David Young             OJC Technologies
dyoung%ojctech.com@localhost      Urbana, IL * (217) 278-3933


Home | Main Index | Thread Index | Old Index