Rev 2002 | Rev 2158 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 2002 | Rev 2101 | ||
|---|---|---|---|
| 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-1); |
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-1); |
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 | # $payload_length = sprintf("%04d", length($payload)+1); |
47 | # $payload_length = sprintf("%04d", length($payload)+1); |
| 48 | # $packet = $command.$payload_length.$payload.chr(0); |
48 | # $packet = $command.$payload_length.$payload.chr(0); |
| 49 | $payload_length = sprintf("%04d", length($payload)); |
49 | $payload_length = sprintf("%04d", length($payload)); |
| 50 | $packet = $command.$payload_length.$payload; |
50 | $packet = $command.$payload_length.$payload; |
| 51 | 51 | ||
| 52 | #print "awritepacket ".$packet."\n"; |
52 | #print "awritepacket ".$packet."\n"; |
| 53 | print $socket $packet; |
53 | print $socket $packet; |
| 54 | } |
54 | } |
| 55 | 55 | ||
| 56 | 56 | ||
| 57 | sub atomd_data_available |
57 | sub atomd_data_available |
| 58 | { |
58 | { |
| 59 | ($socket) = @_; |
59 | ($socket) = @_; |
| 60 | 60 | ||
| 61 | $s = IO::Select->new(); |
61 | $s = IO::Select->new(); |
| 62 | $s->add($socket); |
62 | $s->add($socket); |
| 63 | @handles = $s->can_read(0. |
63 | @handles = $s->can_read(0.005); |
| 64 | 64 | ||
| 65 | $has_data = 0; |
65 | $has_data = 0; |
| 66 | if (@handles) |
66 | if (@handles) |
| 67 | { |
67 | { |
| 68 | $has_data = 1; |
68 | $has_data = 1; |
| 69 | } |
69 | } |
| 70 | 70 | ||
| 71 | return $has_data; |
71 | return $has_data; |
| 72 | } |
72 | } |
| 73 | 73 | ||
| 74 | sub atomd_kill_promt |
74 | sub atomd_kill_promt |
| 75 | { |
75 | { |
| 76 | ($socket) = @_; |
76 | ($socket) = @_; |
| 77 | 77 | ||
| 78 | while (atomd_data_available($socket)) |
78 | while (atomd_data_available($socket)) |
| 79 | { |
79 | { |
| 80 | $packet = atomd_read_packet($socket); # Read prompt |
80 | $packet = atomd_read_packet($socket); # Read prompt |
| 81 | } |
81 | } |
| 82 | } |
82 | } |
| 83 | 83 | ||
| 84 | sub atomd_initialize |
84 | sub atomd_initialize |
| 85 | { |
85 | { |
| 86 | ($host, $port) = @_; |
86 | ($host, $port) = @_; |
| 87 | $socket = atomd_connect($host, $port); |
87 | $socket = atomd_connect($host, $port); |
| 88 | 88 | ||
| 89 | atomd_kill_promt($socket); |
89 | atomd_kill_promt($socket); |
| 90 | 90 | ||
| 91 | return $socket; |
91 | return $socket; |
| 92 | } |
92 | } |
| 93 | 93 | ||
| 94 | 94 | ||
| 95 | sub atomd_send_command |
95 | sub atomd_send_command |
| 96 | { |
96 | { |
| 97 | ($socket, $command) = @_; |
97 | ($socket, $command) = @_; |
| 98 | atomd_write_packet($socket, "RESP", $command); |
98 | atomd_write_packet($socket, "RESP", $command); |
| 99 | } |
99 | } |
| 100 | 100 | ||
| 101 | 101 | ||
| 102 | sub atomd_read_command_response |
102 | sub atomd_read_command_response |
| 103 | { |
103 | { |
| 104 | ($socket) = @_; |
104 | ($socket) = @_; |
| 105 | 105 | ||
| 106 | $response = ""; |
106 | $response = ""; |
| 107 | 107 | ||
| 108 | while (1) |
108 | while (1) |
| 109 | { |
109 | { |
| 110 | $packet = atomd_read_packet($socket); |
110 | $packet = atomd_read_packet($socket); |
| 111 | 111 | ||
| 112 | if (substr($packet, 0, 4) ne "TEXT") |
112 | if (substr($packet, 0, 4) ne "TEXT") |
| 113 | { |
113 | { |
| 114 | last; |
114 | last; |
| 115 | } |
115 | } |
| 116 | 116 | ||
| 117 | $packet =~ s/\n//g; |
117 | $packet =~ s/\n//g; |
| 118 | # $response .= substr($packet, 8, -1); |
118 | # $response .= substr($packet, 8, -1); |
| 119 | $response .= substr($packet, 8); |
119 | $response .= substr($packet, 8); |
| 120 | $response .= "\n"; |
120 | $response .= "\n"; |
| 121 | } |
121 | } |
| 122 | 122 | ||
| 123 | return $response; |
123 | return $response; |
| 124 | } |
124 | } |
| 125 | 125 | ||
| 126 | 126 | ||
| 127 | # Perl trim function to remove whitespace from the start and end of the string |
127 | # Perl trim function to remove whitespace from the start and end of the string |
| 128 | sub trim($) |
128 | sub trim($) |
| 129 | { |
129 | { |
| 130 | my $string = shift; |
130 | my $string = shift; |
| 131 | $string =~ s/^\s+//; |
131 | $string =~ s/^\s+//; |
| 132 | $string =~ s/\s+$//; |
132 | $string =~ s/\s+$//; |
| 133 | return $string; |
133 | return $string; |
| 134 | } |
134 | } |
| 135 | # Left trim function to remove leading whitespace |
135 | # Left trim function to remove leading whitespace |
| 136 | sub ltrim($) |
136 | sub ltrim($) |
| 137 | { |
137 | { |
| 138 | my $string = shift; |
138 | my $string = shift; |
| 139 | $string =~ s/^\s+//; |
139 | $string =~ s/^\s+//; |
| 140 | return $string; |
140 | return $string; |
| 141 | } |
141 | } |
| 142 | # Right trim function to remove trailing whitespace |
142 | # Right trim function to remove trailing whitespace |
| 143 | sub rtrim($) |
143 | sub rtrim($) |
| 144 | { |
144 | { |
| 145 | my $string = shift; |
145 | my $string = shift; |
| 146 | $string =~ s/\s+$//; |
146 | $string =~ s/\s+$//; |
| 147 | return $string; |
147 | return $string; |
| 148 | } |
148 | } |
| 149 | 149 | ||
| 150 | 150 | ||
| 151 | 151 | ||
| 152 | # "return" 1 to not generate an error when loading file |
152 | # "return" 1 to not generate an error when loading file |
| 153 | 1; |
153 | 1; |
| 154 | 154 | ||
| 155 | 155 | ||