summaryrefslogtreecommitdiffstats
path: root/plugins/netutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/netutils.c')
-rw-r--r--plugins/netutils.c103
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
281int
282send_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
288int
289send_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
295int
296send_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
318int 343int
319is_host (const char *address) 344is_host (const char *address)
320{ 345{