View in color | View discussion [16 posts] | License | Download script | History |
30-Apr 9:00 UTC
[0.049] 14.821k
[0.049] 14.821k
telnet.rREBOL [
Title: "Telnet protcol scheme"
Date: 6-Jul-2001/17:51
Version: 1.0.1.1
File: %telnet.r
Author: "Frank Sievertsen"
Usage: {
read telnet://user:%password--host/command
port: open telnet://user:%password--host/command
port: open telnet://user:%password--host/
port: open telnet://host/
You will habe to use "copy" more than once to receive
data from the port.
}
Purpose: "A telnet protocol scheme"
History: [
1.1.0 2-Jul-2001 "Original version"
1.1.1 6-Jul-2001 "Returns none, when connection closed"
]
Email: %fsievert--uos--de
library: [
level: 'advanced
platform: none
type: 'protocol
domain: [ldc other-net tcp]
tested-under: none
support: none
license: none
see-also: none
]
]
make Root-Protocol [
scheme: 'telnet
port-id: 23
port-flags: system/standard/port-flags/pass-thru
tmp: none
open: func [port /local in] [
open-proto port
if any [port/target port/path] [
if not port/target [port/target: ""]
if port/path [insert port/target port/path]
]
port/state/flags: port/state/flags or system/standard/port-flags/direct or 32 or 2051; No-Wait, BINARY (51) (2048)
port/sub-port/state/flags: port/sub-port/state/flags or 2051 or 32
if all [port/user port/pass] [
in: make string! 100
until [
append in copy port
find in "login:"
]
system/words/insert port/sub-port join port/user "^/"
clear in
until [
append in copy port
find in "password"
]
system/words/insert port/sub-port join port/pass "^/"
while ["" <> copy port] []
if port/target [
system/words/insert port/sub-port join port/target ";exit^/"
clear in
forever [
wait port/sub-port
tmp: make string! 100
if zero? read-io port/sub-port tmp 100 [break]
append in tmp
]
port/user-data: in
]
]
]
copy: func [port /part range /local in num] [
either port/user-data [
port/user-data
] [
in: make string! 100
out: make string! 100
forever [
num: 1
while [wait [0 port/sub-port]] [
tmp: make string! 100
if zero? num: read-io port/sub-port tmp 100 [break]
append in tmp
]
if zero? num [break/return none]
if parser/incoming in out [
write-io port/sub-port out length? out
break/return in
]
system/words/wait port/sub-port
]
]
]
insert: func [port data] [
system/words/insert port/sub-port data
]
parser: make object! [
s-will: to-char 251
s-wont: to-char 252
s-do: to-char 253
s-dont: to-char 254
iac: to-char 255
sb: to-char 250
se: to-char 240
required: to-char 1
supplied: to-char 0
non-command: complement charset reduce [iac]
terminal-type: to-char 24
terminal-speed: to-char 32
suppress-go-ahead: to-char 3
echo: to-char 1
tmp: none
send: func [block [block!]] [
system/words/append out-port to-binary join iac reduce block
]
sb-data: [
iac se
| skip sb-data
]
start: end: none
data: [any [
start: iac [
s-do terminal-type (
send [s-will terminal-type]
)
| s-do echo (
; Ignore
)
| sb terminal-type required iac se (
send [sb terminal-type supplied "vt100" iac se]
)
; DEFAULTS
| sb sb-data
| s-do copy tmp skip (
send [s-wont tmp]
)
| s-will copy tmp skip (
send [s-dont tmp]
)
| s-wont copy tmp skip (
;Ignore
)
| s-dont copy tmp skip (
;Ignore
)
] end: (remove/part start end) :start
| non-command
]]
out-port: none
incoming: func [str [any-string!] port [port! any-string!]] [
out-port: port
parse/all str data
]
]
net-utils/net-install :scheme self port-id
] Notes
|