-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtelnet.rkt
82 lines (67 loc) · 1.42 KB
/
telnet.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#lang racket
(provide
cmd-SE
cmd-NOP
cmd-DM
cmd-BRK
cmd-IP
cmd-AO
cmd-AYT
cmd-EC
cmd-EL
cmd-GA
cmd-SB
cmd-WILL
cmd-WONT
cmd-DO
cmd-DONT
cmd-IAC
telnet-connect
make-telnet-port)
(define cmd-SE 240)
(define cmd-NOP 241)
(define cmd-DM 242)
(define cmd-BRK 243)
(define cmd-IP 244)
(define cmd-AO 245)
(define cmd-AYT 246)
(define cmd-EC 247)
(define cmd-EL 248)
(define cmd-GA 249)
(define cmd-SB 250)
(define cmd-WILL 251)
(define cmd-WONT 252)
(define cmd-DO 253)
(define cmd-DONT 254)
(define cmd-IAC 255)
(define (make-telnet-port in)
(define-values (pin pout) (make-pipe))
(thread (λ ()
(for ([b (in-port read-byte in)])
(if (= b cmd-IAC)
(handle-cmd in pout)
(write-byte b pout)))
(close-output-port pout)))
pin)
;; ignore cmds
(define (handle-cmd in out)
(define b (read-byte in))
(cond
[(= b cmd-IAC)
(write-byte b out)]
[(or (= b cmd-DO)
(= b cmd-DONT)
(= b cmd-WILL)
(= b cmd-WONT))
(read-byte in)]
[(= b cmd-SB)
(for ([b (in-port read-byte in)])
#:break (and
(= b cmd-IAC)
(= (peek-byte in) cmd-SE))
#f)
(read-byte in)] ;; pop cmd-SE
[else #f]))
(define (telnet-connect host port)
(define-values (in out) (tcp-connect host port))
(values (make-telnet-port in) out))