Rev 1892 | Rev 2101 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1892 | Rev 2002 | ||
|---|---|---|---|
| 1 | use IO::Select; |
1 | use IO::Select; |
| 2 | use IO::Socket; |
2 | use IO::Socket; |
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | sub atomd_connect |
5 | sub atomd_connect |
| 6 | { |
6 | { |
| 7 | ($host, $port) = @_; |
7 | ($host, $port) = @_; |
| 8 | $socket = IO::Socket::INET->new( |
8 | $socket = IO::Socket::INET->new( |
| 9 | Proto => "tcp", |
9 | Proto => "tcp", |
| 10 | PeerAddr => $host, |
10 | PeerAddr => $host, |
| 11 | PeerPort => $port, |
11 | PeerPort => $port, |
| 12 | Blocking => 1, |
12 | Blocking => 1, |
| 13 | ) |
13 | ) |
| 14 | or die "Error: Cannot connect to port $port at $host\n"; |
14 | or die "Error: Cannot connect to port $port at $host\n"; |
| 15 | 15 | ||
| 16 | return $socket; |
16 | return $socket; |
| 17 | } |
17 | } |
| 18 | 18 | ||
| 19 | sub atomd_read_packet |
19 | sub atomd_read_packet |
| 20 | { |
20 | { |
| 21 | ($socket) = @_; |
21 | ($socket) = @_; |
| 22 | $command=""; |
22 | $command=""; |
| 23 | read($socket, $command, 4); |
23 | read($socket, $command, 4); |
| 24 | 24 | ||
| 25 | $payload_length=""; |
25 | $payload_length=""; |
| 26 | read($socket, $payload_length, 4); |
26 | read($socket, $payload_length, 4); |
| 27 | 27 | ||
| 28 | $payload_length = int($payload_length); |
28 | $payload_length = int($payload_length); |
| 29 | $payload=""; |
29 | $payload=""; |
| 30 | if ($payload_length > 0) |
30 | if ($payload_length > 0) |
| 31 | { |
31 | { |
| 32 | read($socket, $payload, $payload_length); |
32 | read($socket, $payload, $payload_length-1); |
| 33 | } |
33 | } |
| 34 | 34 | ||
| 35 | #Pad payload length with 0s |
35 | #Pad payload length with 0s |
| 36 | $payload_length = sprintf("%04d", $payload_length); |
36 | $payload_length = sprintf("%04d", $payload_length-1); |
| 37 | 37 | ||
| 38 | #print "areadpacket ".$command . $payload_length . $payload."\n"; |
38 | #print "areadpacket ".$command . $payload_length . $payload."\n"; |
| 39 | return $command . $payload_length . $payload; |
39 | return $command . $payload_length . $payload; |
| 40 | } |
40 | } |
| 41 | 41 | ||
| 42 | sub atomd_write_packet |
42 | sub atomd_write_packet |
| 43 | { |
43 | { |
| 44 | ($socket, $command, $payload) = @_; |
44 | ($socket, $command, $payload) = @_; |
| 45 | 45 | ||
| 46 | #Pad payload length with 0s |
46 | #Pad payload length with 0s |
| 47 |
|
47 | # $payload_length = sprintf("%04d", length($payload)+1); |
| 48 |
|
48 | # $packet = $command.$payload_length.$payload.chr(0); |
| - | 49 | $payload_length = sprintf("%04d", length($payload)); |
|
| - | 50 | $packet = $command.$payload_length.$payload; |
|
| 49 | 51 | ||
| 50 | #print "awritepacket ".$packet."\n"; |
52 | #print "awritepacket ".$packet."\n"; |
| 51 | print $socket $packet; |
53 | print $socket $packet; |
| 52 | } |
54 | } |
| 53 | 55 | ||
| 54 | 56 | ||
| 55 | sub atomd_data_available |
57 | sub atomd_data_available |
| 56 | { |
58 | { |
| 57 | ($socket) = @_; |
59 | ($socket) = @_; |
| 58 | 60 | ||
| 59 | $s = IO::Select->new(); |
61 | $s = IO::Select->new(); |
| 60 | $s->add($socket); |
62 | $s->add($socket); |
| 61 | @handles = $s->can_read(0.001); |
63 | @handles = $s->can_read(0.001); |
| 62 | 64 | ||
| 63 | $has_data = 0; |
65 | $has_data = 0; |
| 64 | if (@handles) |
66 | if (@handles) |
| 65 | { |
67 | { |
| 66 | $has_data = 1; |
68 | $has_data = 1; |
| 67 | } |
69 | } |
| 68 | 70 | ||
| 69 | return $has_data; |
71 | return $has_data; |
| 70 | } |
72 | } |
| 71 | 73 | ||
| 72 | sub atomd_kill_promt |
74 | sub atomd_kill_promt |
| 73 | { |
75 | { |
| 74 | ($socket) = @_; |
76 | ($socket) = @_; |
| 75 | 77 | ||
| 76 | while (atomd_data_available($socket)) |
78 | while (atomd_data_available($socket)) |
| 77 | { |
79 | { |
| 78 | $packet = atomd_read_packet($socket); # Read prompt |
80 | $packet = atomd_read_packet($socket); # Read prompt |
| 79 | } |
81 | } |
| 80 | } |
82 | } |
| 81 | 83 | ||
| 82 | sub atomd_initialize |
84 | sub atomd_initialize |
| 83 | { |
85 | { |
| 84 | ($host, $port) = @_; |
86 | ($host, $port) = @_; |
| 85 | $socket = atomd_connect($host, $port); |
87 | $socket = atomd_connect($host, $port); |
| 86 | 88 | ||
| 87 | atomd_kill_promt($socket); |
89 | atomd_kill_promt($socket); |
| 88 | 90 | ||
| 89 | return $socket; |
91 | return $socket; |
| 90 | } |
92 | } |
| 91 | 93 | ||
| 92 | 94 | ||
| 93 | sub atomd_send_command |
95 | sub atomd_send_command |
| 94 | { |
96 | { |
| 95 | ($socket, $command) = @_; |
97 | ($socket, $command) = @_; |
| 96 | atomd_write_packet($socket, "RESP", $command); |
98 | atomd_write_packet($socket, "RESP", $command); |
| 97 | } |
99 | } |
| 98 | 100 | ||
| 99 | 101 | ||
| 100 | sub atomd_read_command_response |
102 | sub atomd_read_command_response |
| 101 | { |
103 | { |
| 102 | ($socket) = @_; |
104 | ($socket) = @_; |
| 103 | 105 | ||
| 104 | $response = ""; |
106 | $response = ""; |
| 105 | 107 | ||
| 106 | while (1) |
108 | while (1) |
| 107 | { |
109 | { |
| 108 | $packet = atomd_read_packet($socket); |
110 | $packet = atomd_read_packet($socket); |
| 109 | 111 | ||
| 110 | if (substr($packet, 0, 4) ne "TEXT") |
112 | if (substr($packet, 0, 4) ne "TEXT") |
| 111 | { |
113 | { |
| 112 | last; |
114 | last; |
| 113 | } |
115 | } |
| 114 | 116 | ||
| 115 | $packet =~ s/\n//g; |
117 | $packet =~ s/\n//g; |
| 116 |
|
118 | # $response .= substr($packet, 8, -1); |
| - | 119 | $response .= substr($packet, 8); |
|
| 117 | $response .= "\n"; |
120 | $response .= "\n"; |
| 118 | } |
121 | } |
| 119 | 122 | ||
| 120 | return $response; |
123 | return $response; |
| 121 | } |
124 | } |
| - | 125 | ||
| - | 126 | ||
| - | 127 | # Perl trim function to remove whitespace from the start and end of the string |
|
| - | 128 | sub trim($) |
|
| - | 129 | { |
|
| - | 130 | my $string = shift; |
|
| - | 131 | $string =~ s/^\s+//; |
|
| - | 132 | $string =~ s/\s+$//; |
|
| - | 133 | return $string; |
|
| - | 134 | } |
|
| - | 135 | # Left trim function to remove leading whitespace |
|
| - | 136 | sub ltrim($) |
|
| - | 137 | { |
|
| - | 138 | my $string = shift; |
|
| - | 139 | $string =~ s/^\s+//; |
|
| - | 140 | return $string; |
|
| - | 141 | } |
|
| - | 142 | # Right trim function to remove trailing whitespace |
|
| - | 143 | sub rtrim($) |
|
| - | 144 | { |
|
| - | 145 | my $string = shift; |
|
| - | 146 | $string =~ s/\s+$//; |
|
| - | 147 | return $string; |
|
| - | 148 | } |
|
| - | 149 | ||
| - | 150 | ||
| 122 | 151 | ||
| 123 | # "return" 1 to not generate an error when loading file |
152 | # "return" 1 to not generate an error when loading file |
| 124 | 1; |
153 | 1; |
| 125 | 154 | ||
| 126 | 155 | ||