[OpenBIOS] r748 - ofw/inet
svn at openbios.org
svn at openbios.org
Mon Dec 3 06:27:55 CET 2007
Author: wmb
Date: 2007-12-03 06:27:55 +0100 (Mon, 03 Dec 2007)
New Revision: 748
Modified:
ofw/inet/telnetd.fth
Log:
Telnetd - fixed incompatibility with the Windows telnet client -
looping on option negotiation and doubling carriage returns.
Modified: ofw/inet/telnetd.fth
===================================================================
--- ofw/inet/telnetd.fth 2007-12-02 10:35:56 UTC (rev 747)
+++ ofw/inet/telnetd.fth 2007-12-03 05:27:55 UTC (rev 748)
@@ -55,7 +55,9 @@
: will ( rem$ -- rem$' )
next-cmd-byte " WILL" .got
dup case
- 0 of send-do endof
+\ Since we have already sent "do binary", there is no need to re-ack it
+\ 0 of send-do endof
+ 0 of drop endof \ Suppress go-ahead
\ Since we have already sent "do suppressGA", there is no need to re-ack it
\ 3 of send-do endof \ Suppress go-ahead
@@ -125,16 +127,26 @@
endcase
;
+\ Remove the linefeed in a cr-lf pair.
+\ The Windows telnet client sends CR-LF per the Telnet NVT spec.
+\ The Linux telnet client just sends CR.
+0 value last-was-cr?
+
+: do-lf ( adr len -- adr' len' )
+ last-was-cr? if swallow else 1 /string then
+;
+
: process-escapes ( adr len -- len' )
- over swap ( adr rem$ )
- begin dup while ( adr rem$ )
- over c@ #iac = if ( adr rem$ )
- do-command ( adr rem$' )
- else ( adr rem$ )
- 1 /string ( adr rem$' )
- then ( adr rem$ )
- repeat ( adr end-adr 0 )
- drop swap - ( len' )
+ over swap ( adr rem$ )
+ begin dup while ( adr rem$ )
+ over c@ dup >r case ( adr rem$ r: char )
+ #iac of do-command endof ( adr rem$' r: char )
+ linefeed of do-lf endof ( adr rem$' r: char )
+ ( adr rem$ char ) >r 1 /string r> ( adr rem$' r: char )
+ endcase ( adr rem$ r: char )
+ r> carret = to last-was-cr? ( adr rem$ )
+ repeat ( adr end-adr 0 )
+ drop swap - ( len' )
;
: read ( adr len -- actual )
over swap (read) ( adr actual )
@@ -174,13 +186,22 @@
begin
get-msecs over d# 300 + - 0<
while
- the-byte 1 (read) case ( msecs [byte] )
- 1 of drop get-msecs the-byte 1 process-escapes drop endof
- -1 of drop false exit endof
- endcase
+ the-byte h# 10 (read) dup 0< if ( msecs count )
+ \ Bail out if the connection closed
+ -1 = if drop false exit then
+
+ \ The other alternative is -2, meaning no bytes available.
+ \ In that case, we'll eventually time out.
+ else ( msecs count )
+ \ Keep advancing the timeout while bytes are still coming in
+ the-byte swap process-escapes drop ( msecs )
+ drop get-msecs
+ then
repeat
drop
+ false to last-was-cr?
+
true
;
: close ( -- ) ;
More information about the OpenBIOS
mailing list