*BSD News Article 32375


Return to BSD News archive

Path: sserve!newshost.anu.edu.au!dubhe.anu.edu.au!sirius.anu.edu.au!not-for-mail
From: paulus@cs.anu.edu.au (Paul Mackerras)
Newsgroups: comp.os.386bsd.questions
Subject: Re: will PPPD go through a pty?
Date: 5 Jul 1994 09:41:59 +1000
Organization: Department of Computer Science, Australian National University
Lines: 115
Message-ID: <2va6o7INN5ld@sirius.anu.edu.au>
References: <Cs9uHD.G80@ns1.nodak.edu>
NNTP-Posting-Host: sirius.anu.edu.au

axvig@plains.NoDak.edu () writes:

>Hi, when a friend tries to establish a PPP connection to
>my computer (he's got Linux + PPP, me FreeBSD 1.1R) I get these
>messages:

>> Jul  1 10:42:20 Osmeh pppd[407]: warning... not a process group leader
>> Jul  1 10:42:20 Osmeh pppd[407]: ioctl(TIOCSCTTY): Invalid argument

>Could it be because topology is somewhat like: 
>Linux_host(valid chat script)->My_gateway(rlogin -8...)->my host(of course ttyp?)

[netstat output omitted]

>Can anyone tell me where we are going wrong? Is it even possible
>to make it go through a pseudo terminal?

On BSD systems such as FreeBSD, 386BSD, etc., the pseudo-tty code
won't let a pty be set to any line discipline other than the normal
discipline.  So you can't run pppd over a pty.  The reason for this
restriction is that ptys can be set into a "remote" mode where the pty
code puts data directly into the canonical queue.  I have a patch,
included below, which changes the pty code so that the restriction is
only applied when the pty is in remote mode.  If you patch
/sys/kern/tty_pty.c with this patch and recompile your kernel, you
should then be able to run pppd over a pty.

Another point: when you run pppd over an rlogin session, you need to
tell the pppd on the "client" end of the rlogin to escape 0xff on
transmission.

Paul Mackerras		paulus@cs.anu.edu.au
Dept. of Computer Science
Australian National University

---------------------------------------------------------------------------
*** tty_pty.c.orig	Fri Jul  1 11:50:54 1994
--- tty_pty.c	Fri Jul  1 11:51:42 1994
***************
*** 632,640 ****
  			return (0);
  
  		case TIOCREMOTE:
! 			if (*(int *)data)
  				pti->pt_flags |= PF_REMOTE;
! 			else
  				pti->pt_flags &= ~PF_REMOTE;
  			ttyflush(tp, FREAD|FWRITE);
  			return (0);
--- 632,653 ----
  			return (0);
  
  		case TIOCREMOTE:
! 			if (*(int *)data) {
  				pti->pt_flags |= PF_REMOTE;
! 				/*
! 				 * Since we use the tty queues internally
! 				 * when PF_REMOTE is set, we have to
! 				 * switch back to TTYDISC, since we don't
! 				 * know what other disciplines do.
! 				 */
! 				if (linesw[tp->t_line].l_rint != ttyinput) {
! 					(*linesw[tp->t_line].l_close)
! 					    (tp, flag);
! 					tp->t_line = TTYDISC;
! 					(void)(*linesw[tp->t_line].l_open)
! 					    (dev, tp, flag);
! 				}
! 			} else
  				pti->pt_flags &= ~PF_REMOTE;
  			ttyflush(tp, FREAD|FWRITE);
  			return (0);
***************
*** 663,684 ****
  				ttyinfo(tp);
  			return(0);
  		}
! 	error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag);
! 	if (error >= 0)
! 	    return (error);
! 	error = ttioctl(tp, cmd, data, flag);
  	/*
! 	 * Since we use the tty queues internally,
! 	 * pty's can't be switched to disciplines which overwrite
! 	 * the queues.  We can't tell anything about the discipline
! 	 * from here...
  	 */
! 	if (linesw[tp->t_line].l_rint != ttyinput) {
! 		(*linesw[tp->t_line].l_close)(tp, flag);
! 		tp->t_line = TTYDISC;
! 		(void)(*linesw[tp->t_line].l_open)(dev, tp, flag);
! 		error = ENOTTY;
! 	}
  	if (error < 0) {
  		if (pti->pt_flags & PF_UCNTL &&
  		    (cmd & ~0xff) == UIOCCMD(0)) {
--- 676,693 ----
  				ttyinfo(tp);
  			return(0);
  		}
! 
  	/*
! 	 * When PF_REMOTE is set, we don't allow the
! 	 * discipline to be set to anything except TTYDISC.
  	 */
! 	if (cmd == TIOCSETD && (pti->pt_flags & PF_REMOTE)
! 	    && *(int *)data != TTYDISC)
! 		return EINVAL;
! 
! 	error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag);
! 	if (error < 0)
! 		 error = ttioctl(tp, cmd, data, flag);
  	if (error < 0) {
  		if (pti->pt_flags & PF_UCNTL &&
  		    (cmd & ~0xff) == UIOCCMD(0)) {