6 |
use IO::Socket::INET; |
use IO::Socket::INET; |
7 |
use Data::Dump qw/dump/; |
use Data::Dump qw/dump/; |
8 |
|
|
|
sub hdump { |
|
|
my $data = shift; |
|
|
my $out = unpack('H*', $data),$/; |
|
|
$out =~ s/(..)/$1 /g; |
|
|
warn $out,$/; |
|
|
} |
|
|
|
|
9 |
our $sock; |
our $sock; |
10 |
|
|
11 |
|
my $MAX_TRANSMIT_BUFFER = 1000; |
12 |
|
my $TRANSMIT_BUFFER_TIMEOUT = 100; |
13 |
|
my $TRANSMIT_OVERFLOW_TIMEOUT = 0; |
14 |
|
my $HOST_SESSION_RX_TIMEOUT = 10000; |
15 |
|
my $HOST_FIFO_RX_FLUSH_TIMEOUT = 0; |
16 |
|
my $HEARTBEAT_INTERVAL = 5000; |
17 |
|
|
18 |
sub connect { |
sub connect { |
19 |
my ( $host ) = shift; |
my ( $host ) = shift; |
20 |
my $port = 16994; |
my $port = 16994; |
31 |
|
|
32 |
$sock->autoflush(1); |
$sock->autoflush(1); |
33 |
|
|
34 |
put( pack('C4A4', 0x10, 0, 0, 0, "SOL ") ); |
put( pack('C4A4', 0x10, 0, 0, 0, "SOL ") |
35 |
get( 0x11, 13 ); |
, 'start redirection session' ); |
36 |
|
get( 0x11, 13 |
37 |
|
, 'start redirection session reply' ); |
38 |
|
|
39 |
my $credentials = pack('CA*CA*', length($user), $user, length($passwd), $passwd); |
my $credentials = pack('CA*CA*', length($user), $user, length($passwd), $passwd); |
40 |
|
|
41 |
put( pack('C9', 0x13, 0, 0, 0, 0x01, length($credentials), 0, 0, 0) . $credentials ); |
put( pack('C9', 0x13, 0, 0, 0, 0x01, length($credentials), 0, 0, 0) . $credentials |
42 |
get( 0x14, 9 ); |
, 'autheniticate session' ); |
43 |
|
get( 0x14, 9 |
44 |
|
, 'authenticate session reply' ); |
45 |
|
|
46 |
|
put( |
47 |
|
pack('C8v6C4', |
48 |
|
0x20, 0,0,0, |
49 |
|
0,0,0,0, |
50 |
|
$MAX_TRANSMIT_BUFFER, |
51 |
|
$TRANSMIT_BUFFER_TIMEOUT, |
52 |
|
$TRANSMIT_OVERFLOW_TIMEOUT, |
53 |
|
$HOST_SESSION_RX_TIMEOUT, |
54 |
|
$HOST_FIFO_RX_FLUSH_TIMEOUT, |
55 |
|
$HEARTBEAT_INTERVAL, |
56 |
|
0,0,0,0, |
57 |
|
) |
58 |
|
, 'start sol redirection' ); |
59 |
|
get( 0x21, 23 |
60 |
|
, 'start sol redirection reply' ); |
61 |
|
|
62 |
|
my $send = "\r"; |
63 |
|
|
64 |
|
put( |
65 |
|
pack('C8v', 0x28,0,0,0, 0,0,0,0, length($send) ) . $send, |
66 |
|
'sol data to host' |
67 |
|
); |
68 |
|
my $host = get( 0x2a, -10, 'sol data from host' ); |
69 |
|
|
70 |
} |
} |
71 |
|
|
72 |
|
sub hdump { |
73 |
|
my ($data,$desc) = @_; |
74 |
|
my $out = unpack('H*', $data); |
75 |
|
$out =~ s/(.{16})/$1 /g; |
76 |
|
$out =~ s/(\S\S)/$1 /g; |
77 |
|
warn $desc ? "# $desc\n$out\n" : "$out\n"; |
78 |
|
} |
79 |
|
|
80 |
sub put { |
sub put { |
81 |
my ( $data ) = shift; |
my ( $data, $desc ) = @_; |
82 |
hdump $data; |
hdump $data, $desc; |
83 |
syswrite $sock, $data, length($data); |
syswrite $sock, $data, length($data); |
84 |
} |
} |
85 |
|
|
86 |
sub get { |
sub get { |
87 |
my ( $expect, $len ) = @_; |
my ( $expect, $len, $desc ) = @_; |
88 |
|
|
89 |
my $reply; |
my $reply; |
90 |
sysread $sock,$reply,$len; |
sysread $sock,$reply,abs($len); |
91 |
hdump $reply; |
hdump $reply, $desc; |
92 |
|
|
93 |
my ( $op, $error ) = unpack('CC', $reply); |
my ( $op, $error ) = unpack('CC', $reply); |
94 |
die "expected $expect got $op" unless $op == $expect; |
die "expected $expect got $op" unless $op == $expect; |
95 |
die "error" unless $error == 0x00; |
die "error" unless $error == 0x00; |
96 |
|
|
97 |
|
if ( $len < 0 ) { |
98 |
|
$len = unpack('x8v', $reply); |
99 |
|
warn "len: $len\n"; |
100 |
|
sysread $sock, $reply, $len; |
101 |
|
hdump $reply, 'data'; |
102 |
|
} |
103 |
|
|
104 |
return $reply; |
return $reply; |
105 |
} |
} |
106 |
|
|