diff options
Diffstat (limited to 'plugins/netutils.c')
-rw-r--r-- | plugins/netutils.c | 103 |
1 files changed, 64 insertions, 39 deletions
diff --git a/plugins/netutils.c b/plugins/netutils.c index 55f02cad..5017eb9e 100644 --- a/plugins/netutils.c +++ b/plugins/netutils.c | |||
@@ -168,11 +168,7 @@ process_request (const char *server_address, int server_port, int proto, | |||
168 | const char *send_buffer, char *recv_buffer, int recv_size) | 168 | const char *send_buffer, char *recv_buffer, int recv_size) |
169 | { | 169 | { |
170 | int result; | 170 | int result; |
171 | int send_result; | ||
172 | int recv_result; | ||
173 | int sd; | 171 | int sd; |
174 | struct timeval tv; | ||
175 | fd_set readfds; | ||
176 | 172 | ||
177 | result = STATE_OK; | 173 | result = STATE_OK; |
178 | 174 | ||
@@ -180,41 +176,7 @@ process_request (const char *server_address, int server_port, int proto, | |||
180 | if (result != STATE_OK) | 176 | if (result != STATE_OK) |
181 | return STATE_CRITICAL; | 177 | return STATE_CRITICAL; |
182 | 178 | ||
183 | send_result = send (sd, send_buffer, strlen (send_buffer), 0); | 179 | result = send_request (sd, proto, send_buffer, recv_buffer, recv_size); |
184 | if (send_result<0 || (size_t)send_result!=strlen(send_buffer)) { | ||
185 | printf ("send() failed\n"); | ||
186 | result = STATE_WARNING; | ||
187 | } | ||
188 | |||
189 | /* wait up to the number of seconds for socket timeout minus one | ||
190 | for data from the host */ | ||
191 | tv.tv_sec = socket_timeout - 1; | ||
192 | tv.tv_usec = 0; | ||
193 | FD_ZERO (&readfds); | ||
194 | FD_SET (sd, &readfds); | ||
195 | select (sd + 1, &readfds, NULL, NULL, &tv); | ||
196 | |||
197 | /* make sure some data has arrived */ | ||
198 | if (!FD_ISSET (sd, &readfds)) { | ||
199 | strcpy (recv_buffer, ""); | ||
200 | printf ("No data was received from host!\n"); | ||
201 | result = STATE_WARNING; | ||
202 | } | ||
203 | |||
204 | else { | ||
205 | recv_result = recv (sd, recv_buffer, (size_t)recv_size - 1, 0); | ||
206 | if (recv_result == -1) { | ||
207 | strcpy (recv_buffer, ""); | ||
208 | if (proto != IPPROTO_TCP) | ||
209 | printf ("recv() failed\n"); | ||
210 | result = STATE_WARNING; | ||
211 | } | ||
212 | else | ||
213 | recv_buffer[recv_result] = 0; | ||
214 | |||
215 | /* die returned string */ | ||
216 | recv_buffer[recv_size - 1] = 0; | ||
217 | } | ||
218 | 180 | ||
219 | close (sd); | 181 | close (sd); |
220 | 182 | ||
@@ -315,6 +277,69 @@ my_connect (const char *host_name, int port, int *sd, int proto) | |||
315 | } | 277 | } |
316 | } | 278 | } |
317 | 279 | ||
280 | |||
281 | int | ||
282 | send_tcp_request (int sd, const char *send_buffer, char *recv_buffer, int recv_size) | ||
283 | { | ||
284 | return send_request (sd, IPPROTO_TCP, send_buffer, recv_buffer, recv_size); | ||
285 | } | ||
286 | |||
287 | |||
288 | int | ||
289 | send_udp_request (int sd, const char *send_buffer, char *recv_buffer, int recv_size) | ||
290 | { | ||
291 | return send_request (sd, IPPROTO_UDP, send_buffer, recv_buffer, recv_size); | ||
292 | } | ||
293 | |||
294 | |||
295 | int | ||
296 | send_request (int sd, int proto, const char *send_buffer, char *recv_buffer, int recv_size) | ||
297 | { | ||
298 | int result; | ||
299 | int send_result; | ||
300 | int recv_result; | ||
301 | struct timeval tv; | ||
302 | fd_set readfds; | ||
303 | |||
304 | send_result = send (sd, send_buffer, strlen (send_buffer), 0); | ||
305 | if (send_result<0 || (size_t)send_result!=strlen(send_buffer)) { | ||
306 | printf ("send() failed\n"); | ||
307 | result = STATE_WARNING; | ||
308 | } | ||
309 | |||
310 | /* wait up to the number of seconds for socket timeout minus one | ||
311 | for data from the host */ | ||
312 | tv.tv_sec = socket_timeout - 1; | ||
313 | tv.tv_usec = 0; | ||
314 | FD_ZERO (&readfds); | ||
315 | FD_SET (sd, &readfds); | ||
316 | select (sd + 1, &readfds, NULL, NULL, &tv); | ||
317 | |||
318 | /* make sure some data has arrived */ | ||
319 | if (!FD_ISSET (sd, &readfds)) { | ||
320 | strcpy (recv_buffer, ""); | ||
321 | printf ("No data was received from host!\n"); | ||
322 | result = STATE_WARNING; | ||
323 | } | ||
324 | |||
325 | else { | ||
326 | recv_result = recv (sd, recv_buffer, (size_t)recv_size - 1, 0); | ||
327 | if (recv_result == -1) { | ||
328 | strcpy (recv_buffer, ""); | ||
329 | if (proto != IPPROTO_TCP) | ||
330 | printf ("recv() failed\n"); | ||
331 | result = STATE_WARNING; | ||
332 | } | ||
333 | else | ||
334 | recv_buffer[recv_result] = 0; | ||
335 | |||
336 | /* die returned string */ | ||
337 | recv_buffer[recv_size - 1] = 0; | ||
338 | } | ||
339 | return result; | ||
340 | } | ||
341 | |||
342 | |||
318 | int | 343 | int |
319 | is_host (const char *address) | 344 | is_host (const char *address) |
320 | { | 345 | { |