summaryrefslogtreecommitdiffstats
path: root/web/attachments/37324-nagiosplugins-netutils-20021210.diff
diff options
context:
space:
mode:
Diffstat (limited to 'web/attachments/37324-nagiosplugins-netutils-20021210.diff')
-rw-r--r--web/attachments/37324-nagiosplugins-netutils-20021210.diff434
1 files changed, 434 insertions, 0 deletions
diff --git a/web/attachments/37324-nagiosplugins-netutils-20021210.diff b/web/attachments/37324-nagiosplugins-netutils-20021210.diff
new file mode 100644
index 0000000..06cdcbb
--- /dev/null
+++ b/web/attachments/37324-nagiosplugins-netutils-20021210.diff
@@ -0,0 +1,434 @@
1Index: netutils.c
2===================================================================
3RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/netutils.c,v
4retrieving revision 1.1.1.1
5diff -u -r1.1.1.1 netutils.c
6--- netutils.c 28 Feb 2002 06:42:59 -0000 1.1.1.1
7+++ netutils.c 11 Dec 2002 02:38:43 -0000
8@@ -42,13 +42,11 @@
9 int process_tcp_request2 (char *, int, char *, char *, int);
10 int process_tcp_request (char *, int, char *, char *, int);
11 int process_udp_request (char *, int, char *, char *, int);
12-int process_request (char *, int, char *, char *, char *, int);
13+int process_request (char *, int, int, char *, char *, int);
14
15 int my_tcp_connect (char *, int, int *);
16 int my_udp_connect (char *, int, int *);
17-int my_connect (char *, int, int *, char *);
18-
19-int my_inet_aton (register const char *, struct in_addr *);
20+int my_connect (char *, int, int *, int);
21
22 /* handles socket timeouts */
23 void
24@@ -64,47 +62,29 @@
25 /* connects to a host on a specified TCP port, sends a string,
26 and gets a response */
27 int
28-process_tcp_request (char *server_address,
29- int server_port,
30- char *send_buffer, char *recv_buffer, int recv_size)
31+process_tcp_request (char *server_address, int server_port,
32+ char *send_buffer, char *recv_buffer, int recv_size)
33 {
34- int result;
35- char proto[4] = "tcp";
36-
37- result = process_request (server_address,
38- server_port,
39- proto, send_buffer, recv_buffer, recv_size);
40-
41- return result;
42+ return process_request (server_address, server_port, IPPROTO_TCP,
43+ send_buffer, recv_buffer, recv_size);
44 }
45
46-
47 /* connects to a host on a specified UDP port, sends a string, and gets a
48 response */
49 int
50-process_udp_request (char *server_address,
51- int server_port,
52- char *send_buffer, char *recv_buffer, int recv_size)
53+process_udp_request (char *server_address, int server_port,
54+ char *send_buffer, char *recv_buffer, int recv_size)
55 {
56- int result;
57- char proto[4] = "udp";
58-
59- result = process_request (server_address,
60- server_port,
61- proto, send_buffer, recv_buffer, recv_size);
62-
63- return result;
64+ return process_request (server_address, server_port, IPPROTO_UDP,
65+ send_buffer, recv_buffer, recv_size);
66 }
67
68-
69-
70 /* connects to a host on a specified tcp port, sends a string, and gets a
71 response. loops on select-recv until timeout or eof to get all of a
72 multi-packet answer */
73 int
74-process_tcp_request2 (char *server_address,
75- int server_port,
76- char *send_buffer, char *recv_buffer, int recv_size)
77+process_tcp_request2 (char *server_address, int server_port,
78+ char *send_buffer, char *recv_buffer, int recv_size)
79 {
80
81 int result;
82@@ -115,7 +95,7 @@
83 fd_set readfds;
84 int recv_length = 0;
85
86- result = my_connect (server_address, server_port, &sd, "tcp");
87+ result = my_connect (server_address, server_port, &sd, IPPROTO_TCP);
88 if (result != STATE_OK)
89 return STATE_CRITICAL;
90
91@@ -149,24 +129,30 @@
92 else { /* it has */
93 recv_result =
94 recv (sd, recv_buffer + recv_length, recv_size - recv_length - 1, 0);
95- if (recv_result == -1) { /* recv failed, bail out */
96+ if (recv_result == -1) {
97+ /* recv failed, bail out */
98 strcpy (recv_buffer + recv_length, "");
99 result = STATE_WARNING;
100 break;
101 }
102- else if (recv_result == 0) { /* end of file ? */
103+ else if (recv_result == 0) {
104+ /* end of file ? */
105 recv_buffer[recv_length] = 0;
106 break;
107 }
108- else { /* we got data! */
109+ else {
110+ /* we got data! */
111 recv_length += recv_result;
112- if (recv_length >= recv_size - 1) { /* buffer full, we're done */
113+ if (recv_length >= recv_size - 1) {
114+ /* buffer full, we're done */
115 recv_buffer[recv_size - 1] = 0;
116 break;
117 }
118 }
119- } /* end if(!FD_ISSET(sd,&readfds)) */
120- } /* end while(1) */
121+ }
122+ /* end if(!FD_ISSET(sd,&readfds)) */
123+ }
124+ /* end while(1) */
125
126 close (sd);
127 return result;
128@@ -175,10 +161,8 @@
129 /* connects to a host on a specified port, sends a string, and gets a
130 response */
131 int
132-process_request (char *server_address,
133- int server_port,
134- char *proto,
135- char *send_buffer, char *recv_buffer, int recv_size)
136+process_request (char *server_address, int server_port, int proto,
137+ char *send_buffer, char *recv_buffer, int recv_size)
138 {
139 int result;
140 int send_result;
141@@ -218,7 +202,7 @@
142 recv_result = recv (sd, recv_buffer, recv_size - 1, 0);
143 if (recv_result == -1) {
144 strcpy (recv_buffer, "");
145- if (!strcmp (proto, "tcp"))
146+ if (proto != IPPROTO_TCP)
147 printf ("recv() failed\n");
148 result = STATE_WARNING;
149 }
150@@ -236,196 +220,74 @@
151
152
153 /* opens a connection to a remote host/tcp port */
154+
155 int
156 my_tcp_connect (char *host_name, int port, int *sd)
157 {
158- int result;
159- char proto[4] = "tcp";
160-
161- result = my_connect (host_name, port, sd, proto);
162-
163- return result;
164+ return my_connect (host_name, port, sd, IPPROTO_TCP);
165 }
166
167-
168 /* opens a connection to a remote host/udp port */
169 int
170 my_udp_connect (char *host_name, int port, int *sd)
171 {
172- int result;
173- char proto[4] = "udp";
174-
175- result = my_connect (host_name, port, sd, proto);
176-
177- return result;
178+ return my_connect (host_name, port, sd, IPPROTO_UDP);
179 }
180
181
182 /* opens a tcp or udp connection to a remote host */
183 int
184-my_connect (char *host_name, int port, int *sd, char *proto)
185-{
186- struct sockaddr_in servaddr;
187- struct hostent *hp;
188- struct protoent *ptrp;
189- int result;
190-
191- bzero ((char *) &servaddr, sizeof (servaddr));
192- servaddr.sin_family = AF_INET;
193- servaddr.sin_port = htons (port);
194-
195- /* try to bypass using a DNS lookup if this is just an IP address */
196- if (!my_inet_aton (host_name, &servaddr.sin_addr)) {
197-
198- /* else do a DNS lookup */
199- hp = gethostbyname ((const char *) host_name);
200- if (hp == NULL) {
201- printf ("Invalid host name '%s'\n", host_name);
202- return STATE_UNKNOWN;
203- }
204-
205- memcpy (&servaddr.sin_addr, hp->h_addr, hp->h_length);
206- }
207-
208- /* map transport protocol name to protocol number */
209- if ((ptrp = getprotobyname (proto)) == NULL) {
210- printf ("Cannot map \"%s\" to protocol number\n", proto);
211- return STATE_UNKNOWN;
212- }
213-
214- /* create a socket */
215- *sd =
216- socket (PF_INET, (!strcmp (proto, "udp")) ? SOCK_DGRAM : SOCK_STREAM,
217- ptrp->p_proto);
218- if (*sd < 0) {
219- printf ("Socket creation failed\n");
220- return STATE_UNKNOWN;
221- }
222-
223- /* open a connection */
224- result = connect (*sd, (struct sockaddr *) &servaddr, sizeof (servaddr));
225- if (result < 0) {
226- switch (errno) {
227- case ECONNREFUSED:
228- printf ("Connection refused by host\n");
229- break;
230- case ETIMEDOUT:
231- printf ("Timeout while attempting connection\n");
232- break;
233- case ENETUNREACH:
234- printf ("Network is unreachable\n");
235- break;
236- default:
237- printf ("Connection refused or timed out\n");
238- }
239-
240- return STATE_CRITICAL;
241- }
242-
243- return STATE_OK;
244-}
245-
246-
247-
248-/* This code was taken from Fyodor's nmap utility, which was originally
249- taken from the GLIBC 2.0.6 libraries because Solaris doesn't contain
250- the inet_aton() funtion. */
251-int
252-my_inet_aton (register const char *cp, struct in_addr *addr)
253+my_connect (char *host_name, int port, int *sd, int proto)
254 {
255- register unsigned int val; /* changed from u_long --david */
256- register int base, n;
257- register char c;
258- u_int parts[4];
259- register u_int *pp = parts;
260-
261- c = *cp;
262-
263- for (;;) {
264-
265- /*
266- * Collect number up to ``.''.
267- * Values are specified as for C:
268- * 0x=hex, 0=octal, isdigit=decimal.
269- */
270- if (!isdigit ((int) c))
271- return (0);
272- val = 0;
273- base = 10;
274-
275- if (c == '0') {
276- c = *++cp;
277- if (c == 'x' || c == 'X')
278- base = 16, c = *++cp;
279- else
280- base = 8;
281- }
282-
283- for (;;) {
284- if (isascii ((int) c) && isdigit ((int) c)) {
285- val = (val * base) + (c - '0');
286- c = *++cp;
287- }
288- else if (base == 16 && isascii ((int) c) && isxdigit ((int) c)) {
289- val = (val << 4) | (c + 10 - (islower ((int) c) ? 'a' : 'A'));
290- c = *++cp;
291- }
292- else
293- break;
294- }
295-
296- if (c == '.') {
297-
298- /*
299- * Internet format:
300- * a.b.c.d
301- * a.b.c (with c treated as 16 bits)
302- * a.b (with b treated as 24 bits)
303- */
304- if (pp >= parts + 3)
305- return (0);
306- *pp++ = val;
307- c = *++cp;
308- }
309- else
310- break;
311- }
312-
313- /* Check for trailing characters */
314- if (c != '\0' && (!isascii ((int) c) || !isspace ((int) c)))
315- return (0);
316-
317- /* Concoct the address according to the number of parts specified */
318- n = pp - parts + 1;
319- switch (n) {
320-
321- case 0:
322- return (0); /* initial nondigit */
323-
324- case 1: /* a -- 32 bits */
325- break;
326-
327- case 2: /* a.b -- 8.24 bits */
328- if (val > 0xffffff)
329- return (0);
330- val |= parts[0] << 24;
331- break;
332-
333- case 3: /* a.b.c -- 8.8.16 bits */
334- if (val > 0xffff)
335- return (0);
336- val |= (parts[0] << 24) | (parts[1] << 16);
337- break;
338-
339- case 4: /* a.b.c.d -- 8.8.8.8 bits */
340- if (val > 0xff)
341- return (0);
342- val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
343- break;
344- }
345-
346- if (addr)
347- addr->s_addr = htonl (val);
348-
349- return (1);
350+ struct addrinfo hints;
351+ struct addrinfo *res;
352+ struct protoent *ptrp;
353+ char port_str[6];
354+ int result;
355+
356+ memset (&hints, 0, sizeof (hints));
357+ hints.ai_family = PF_UNSPEC;
358+ hints.ai_protocol = proto;
359+
360+ snprintf(port_str, sizeof(port_str), "%d", port);
361+ /* nice clean AF-independent code doesn't matter if passed hostname or IP address */
362+ result = getaddrinfo (host_name, port_str, &hints, &res);
363+
364+ if (result != 0)
365+ {
366+ printf ("%s\n", gai_strerror (result));
367+ return STATE_UNKNOWN;
368+ }
369+ else
370+ {
371+ while (res)
372+ {
373+ /* attempt to create a socket */
374+ *sd = socket (res->ai_family, (proto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM, res->ai_protocol);
375+
376+ if (*sd < 0) {
377+ printf ("Socket creation failed\n");
378+ freeaddrinfo (res);
379+ return STATE_UNKNOWN;
380+ }
381+
382+ /* attempt to open a connection */
383+ result = connect (*sd, res->ai_addr, res->ai_addrlen);
384+
385+ if (result == 0)
386+ break;
387+
388+ close(*sd);
389+ res = res->ai_next;
390+ }
391+ freeaddrinfo (res);
392+ }
393+
394+ if (result == 0)
395+ return STATE_OK;
396+ else
397+ {
398+ printf ("%s\n", strerror(errno));
399+ return STATE_CRITICAL;
400+ }
401 }
402Index: netutils.h.in
403===================================================================
404RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/netutils.h.in,v
405retrieving revision 1.1.1.1
406diff -u -r1.1.1.1 netutils.h.in
407--- netutils.h.in 28 Feb 2002 06:42:59 -0000 1.1.1.1
408+++ netutils.h.in 11 Dec 2002 02:38:43 -0000
409@@ -42,19 +42,17 @@
410 void socket_timeout_alarm_handler (int);
411
412 int process_tcp_request2 (char *address, int port, char *sbuffer,
413- char *rbuffer, int rsize);
414+ char *rbuffer, int rsize);
415 int process_tcp_request (char *address, int port, char *sbuffer,
416- char *rbuffer, int rsize);
417+ char *rbuffer, int rsize);
418 int process_udp_request (char *address, int port, char *sbuffer,
419- char *rbuffer, int rsize);
420-int process_request (char *address, int port, char *proto, char *sbuffer,
421- char *rbuffer, int rsize);
422+ char *rbuffer, int rsize);
423+int process_request (char *address, int port, int proto, char *sbuffer,
424+ char *rbuffer, int rsize);
425
426 int my_tcp_connect (char *address, int port, int *sd);
427 int my_udp_connect (char *address, int port, int *sd);
428-int my_connect (char *address, int port, int *sd, char *proto);
429-
430-int my_inet_aton (register const char *cp, struct in_addr *addr);
431+int my_connect (char *address, int port, int *sd, int proto);
432
433 #ifndef DEFAULT_SOCKET_TIMEOUT
434 #include "config.h"