[openfirmware] [commit] r3542 - ofw/inet
repository service
svn at openfirmware.info
Mon Feb 11 05:58:33 CET 2013
Author: quozl
Date: Mon Feb 11 05:58:33 2013
New Revision: 3542
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3542
Log:
OLPC - telnetd, allow subsequent reconnections, display IP address of client, suppress 300ms options negotiation allowing to occur during normal mux I/O, also fixes #12539.
Modified:
ofw/inet/telnetd.fth
Modified: ofw/inet/telnetd.fth
==============================================================================
--- ofw/inet/telnetd.fth Mon Feb 11 05:20:02 2013 (r3541)
+++ ofw/inet/telnetd.fth Mon Feb 11 05:58:33 2013 (r3542)
@@ -7,6 +7,8 @@
support-package: telnet
false value debug-options?
+false value verbose?
+false value listening?
: (read) ( adr len -- actual ) " read" $call-parent ;
: (write) ( adr len -- actual ) " write" $call-parent ;
@@ -130,7 +132,7 @@
\ 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?
+false value last-was-cr?
: do-lf ( adr len -- adr' len' )
last-was-cr? if swallow else 1 /string then
@@ -148,12 +150,41 @@
repeat ( adr end-adr 0 )
drop swap - ( len' )
;
-: read ( adr len -- actual )
- over swap (read) ( adr actual )
- dup 0< if nip exit then ( adr actual )
- process-escapes ( actual' )
+
+: .his-ip-addr ( -- )
+ " his-ip-addr" $call-parent .ipaddr
;
-: write ( adr len -- actual )
+
+: accept? ( -- connected? )
+ d# 23 " accept" $call-parent 0= if false exit then
+
+ verbose? if ." telnetd: connection from " .his-ip-addr cr then
+
+ 3 send-do \ You suppress go-ahead
+ 0 send-do \ Be binary
+ 1 send-will \ I will echo
+ false to listening?
+ false to last-was-cr?
+ true
+;
+
+: disconnect ( -- )
+ " disconnect" $call-parent
+ verbose? if ." telnetd: connection closed by " .his-ip-addr cr then
+ true to listening?
+;
+
+: read ( adr len -- actual|-1|-2 )
+ listening? if accept? drop 2drop -2 exit then
+ over swap (read) ( adr actual )
+ dup case ( adr actual )
+ -1 of disconnect nip exit endof
+ -2 of nip exit endof
+ endcase
+ process-escapes ( actual' )
+;
+: write ( adr len -- actual|-1 )
+ listening? if 2drop -1 exit then
tuck begin ( len adr len )
#iac split-string ( len head$ tail$ )
dup while ( len head$ tail$ )
@@ -165,43 +196,18 @@
2drop (write) drop ( len )
;
-0 instance value verbose?
-
: open ( -- flag )
+ true to listening?
my-args " verbose" $= to verbose?
verbose? if
." telnet://" " my-ip-addr" $call-parent .ipaddr cr
then
- begin d# 23 " accept" $call-parent until
+ begin accept? until
verbose? if ." Connected" cr then
- 3 send-do \ You suppress go-ahead
- 0 send-do \ Be binary
- 1 send-will \ I will echo
-
- get-msecs ( time )
- begin
- get-msecs over d# 300 + - 0<
- while
- 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 ( -- ) ;
@@ -210,24 +216,15 @@
0 value telnet-ih
-defer getchar-hook ' = to getchar-hook
-patch getchar-hook = stdin-getchar
-
: exit-telnet ( -- )
- telnet-ih remove-output
- telnet-ih remove-input
- telnet-ih close-dev
- ['] = to getchar-hook
-;
+ telnet-ih 0= if exit then
-: ?telnet-closed ( read-return 1 -- flag )
- over -1 = if ( -1 1 )
- exit-telnet ( -1 1 )
- carret pending-char c! ( 1 1 )
- ." Connection closed" \ cr
- 2drop true exit
- then ( read-return 1 )
- =
+ " verbose?" telnet-ih $call-method ( verbose? )
+ telnet-ih remove-output ( verbose? )
+ telnet-ih remove-input ( verbose? )
+ telnet-ih close-dev ( verbose? )
+ 0 to telnet-ih ( verbose? )
+ if ." telnetd: off" cr then ( )
;
devalias telnetd tcp//telnet:verbose
@@ -238,7 +235,6 @@
telnet-ih add-output
telnet-ih add-input
\ hint: use " screen-ih remove-output " to speed up your telnet output
- ['] ?telnet-closed to getchar-hook
;
\ LICENSE_BEGIN
\ Copyright (c) 2006 FirmWorks
More information about the openfirmware
mailing list