Subject: Re: telnet spins to dead tty
To: None <tech-userlevel@netbsd.org>
From: Christos Zoulas <christos@zoulas.com>
List: tech-userlevel
Date: 10/25/2002 17:19:15
In article <20021025075812.B22781@shrubbery.net>,
john heasley <heas@shrubbery.net> wrote:

>i have a set of scripts that use expect to login to devices via telnet
>(or ssh).  if the scripts are not configured properly, it is possible
>that the expect script deadlocks waiting for the output it expects
>once a login (username and password) is successful.
>
>a timeout ensues and the expect script closed the tty and waits for
>the process for the child to exit.  and sometime after this, the device
>closes the connection due to inactivity.
>
>here's the telnet issue; telnet takes a SIGPIPE and spins out of control
>trying to flush the tty facing expect, terminal.c:ttyflush().
>
>#0  ttyflush (drop=0) at /home/src/usr.bin/telnet/terminal.c:159
>#1  0x804ed93 in TerminalNewMode (f=-1)
>    at /home/src/usr.bin/telnet/sys_bsd.c:445
>#2  0x8053cc8 in setcommandmode () at /home/src/usr.bin/telnet/terminal.c:249
>#3  0x804f143 in deadpeer (sig=13) at /home/src/usr.bin/telnet/sys_bsd.c:869
>#4  0x480fc1f0 in __sigtramp_sigcontext_1 () from /usr/lib/libc.so.12
>#5  0x804e40a in netflush () at /home/src/usr.bin/telnet/network.c:145
>
>so, the telnet process:
>
>COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
>telnet  28617 heas    0u  VBAD                         (revoked)
>telnet  28617 heas    1u  VBAD                         (revoked)
>telnet  28617 heas    2u  VBAD                         (revoked)
>telnet  28617 heas    3u  IPv4             0t0     TCP no PCB,
>CANTSENDMORE, CANTRCVMORE
>telnet  28617 heas    4w  VREG    0,0      331 1022641 / (/dev/wd0a)
>
>the write(fd=1) within TerminalWrite() returns -1 (errno = 5).  but,
>ttyflush() only communicates the following in it's return value:
>
> *              Return value:
> *                      -1: No useful work done, data waiting to go out.
> *                       0: No data was waiting, so nothing was done.
> *                       1: All waiting data was written out.
> *                       n: All data - n was written out.
>
>since ttyflush() isnt designed to return a "permanent failure" result,
>the callee just calls it again, forever.
>
>i suppose the question is how best to fix this.  teach ttyflush() about
>permanent errors and the folks that call its new return value?

Yes, that would be great. Can you send-pr it?

Thanks,

christos