[Nagiosplug-checkins] CVS: nagiosplug/plugins netutils.c,1.2,1.3 netutils.h.in,1.2,1.3 utils.c,1.16,1.17 utils.h.in,1.8,1.9
Jeremy T. Bouse
undrgrid at users.sourceforge.net
Fri Mar 7 18:43:03 CET 2003
Update of /cvsroot/nagiosplug/nagiosplug/plugins
In directory sc8-pr-cvs1:/tmp/cvs-serv8585/plugins
Modified Files:
netutils.c netutils.h.in utils.c utils.h.in
Log Message:
AF indepedent routines introduced.
Modifed process_request() & my_connect() parameters to make 'proto' type
'int' rather than 'char *' and use IPPROTO_* POSIX values.
Removed is_dotted_quad() & my_inet_aton() functions
Added is_addr(), is_inet_addr(), is_inet6_addr() and resolve_host_or_addr()
functions to check whether it is a valid IP address
Modified is_host() to call is_addr() and is_hostname()
Index: netutils.c
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/netutils.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** netutils.c 7 Mar 2003 22:11:25 -0000 1.2
--- netutils.c 8 Mar 2003 02:26:22 -0000 1.3
***************
*** 41,51 ****
int process_tcp_request (char *, int, char *, char *, int);
int process_udp_request (char *, int, char *, char *, int);
! int process_request (char *, int, char *, char *, char *, int);
int my_tcp_connect (char *, int, int *);
int my_udp_connect (char *, int, int *);
! int my_connect (char *, int, int *, char *);
!
! int my_inet_aton (register const char *, struct in_addr *);
/* handles socket timeouts */
--- 41,49 ----
int process_tcp_request (char *, int, char *, char *, int);
int process_udp_request (char *, int, char *, char *, int);
! int process_request (char *, int, int, char *, char *, int);
int my_tcp_connect (char *, int, int *);
int my_udp_connect (char *, int, int *);
! int my_connect (char *, int, int *, int);
/* handles socket timeouts */
***************
*** 54,58 ****
{
! printf ("Socket timeout after %d seconds\n", socket_timeout);
exit (STATE_CRITICAL);
--- 52,56 ----
{
! printf ("CRITICAL - Socket timeout after %d seconds\n", socket_timeout);
exit (STATE_CRITICAL);
***************
*** 63,76 ****
and gets a response */
int
! process_tcp_request (char *server_address,
! int server_port,
! char *send_buffer, char *recv_buffer, int recv_size)
{
int result;
- char proto[4] = "tcp";
! result = process_request (server_address,
! server_port,
! proto, send_buffer, recv_buffer, recv_size);
return result;
--- 61,71 ----
and gets a response */
int
! process_tcp_request (char *server_address, int server_port,
! char *send_buffer, char *recv_buffer, int recv_size)
{
int result;
! result = process_request (server_address, server_port,
! IPPROTO_TCP, send_buffer, recv_buffer, recv_size);
return result;
***************
*** 81,94 ****
response */
int
! process_udp_request (char *server_address,
! int server_port,
! char *send_buffer, char *recv_buffer, int recv_size)
{
int result;
- char proto[4] = "udp";
! result = process_request (server_address,
! server_port,
! proto, send_buffer, recv_buffer, recv_size);
return result;
--- 76,86 ----
response */
int
! process_udp_request (char *server_address, int server_port,
! char *send_buffer, char *recv_buffer, int recv_size)
{
int result;
! result = process_request (server_address, server_port,
! IPPROTO_UDP, send_buffer, recv_buffer, recv_size);
return result;
***************
*** 101,107 ****
multi-packet answer */
int
! process_tcp_request2 (char *server_address,
! int server_port,
! char *send_buffer, char *recv_buffer, int recv_size)
{
--- 93,98 ----
multi-packet answer */
int
! process_tcp_request2 (char *server_address, int server_port,
! char *send_buffer, char *recv_buffer, int recv_size)
{
***************
*** 114,118 ****
int recv_length = 0;
! result = my_connect (server_address, server_port, &sd, "tcp");
if (result != STATE_OK)
return STATE_CRITICAL;
--- 105,109 ----
int recv_length = 0;
! result = my_connect (server_address, server_port, &sd, IPPROTO_TCP);
if (result != STATE_OK)
return STATE_CRITICAL;
***************
*** 147,157 ****
else { /* it has */
recv_result =
! recv (sd, recv_buffer + recv_length, recv_size - recv_length - 1, 0);
! if (recv_result == -1) { /* recv failed, bail out */
strcpy (recv_buffer + recv_length, "");
result = STATE_WARNING;
break;
}
! else if (recv_result == 0) { /* end of file ? */
recv_buffer[recv_length] = 0;
break;
--- 138,151 ----
else { /* it has */
recv_result =
! recv (sd, recv_buffer + recv_length,
! recv_size - recv_length - 1, 0);
! if (recv_result == -1) {
! /* recv failed, bail out */
strcpy (recv_buffer + recv_length, "");
result = STATE_WARNING;
break;
}
! else if (recv_result == 0) {
! /* end of file ? */
recv_buffer[recv_length] = 0;
break;
***************
*** 159,169 ****
else { /* we got data! */
recv_length += recv_result;
! if (recv_length >= recv_size - 1) { /* buffer full, we're done */
recv_buffer[recv_size - 1] = 0;
break;
}
}
! } /* end if(!FD_ISSET(sd,&readfds)) */
! } /* end while(1) */
close (sd);
--- 153,166 ----
else { /* we got data! */
recv_length += recv_result;
! if (recv_length >= recv_size - 1) {
! /* buffer full, we're done */
recv_buffer[recv_size - 1] = 0;
break;
}
}
! }
! /* end if(!FD_ISSET(sd,&readfds)) */
! }
! /* end while(1) */
close (sd);
***************
*** 174,181 ****
response */
int
! process_request (char *server_address,
! int server_port,
! char *proto,
! char *send_buffer, char *recv_buffer, int recv_size)
{
int result;
--- 171,176 ----
response */
int
! process_request (char *server_address, int server_port, int proto,
! char *send_buffer, char *recv_buffer, int recv_size)
{
int result;
***************
*** 217,221 ****
if (recv_result == -1) {
strcpy (recv_buffer, "");
! if (!strcmp (proto, "tcp"))
printf ("recv() failed\n");
result = STATE_WARNING;
--- 212,216 ----
if (recv_result == -1) {
strcpy (recv_buffer, "");
! if (proto != IPPROTO_TCP)
printf ("recv() failed\n");
result = STATE_WARNING;
***************
*** 239,245 ****
{
int result;
- char proto[4] = "tcp";
! result = my_connect (host_name, port, sd, proto);
return result;
--- 234,239 ----
{
int result;
! result = my_connect (host_name, port, sd, IPPROTO_TCP);
return result;
***************
*** 252,258 ****
{
int result;
- char proto[4] = "udp";
! result = my_connect (host_name, port, sd, proto);
return result;
--- 246,251 ----
{
int result;
! result = my_connect (host_name, port, sd, IPPROTO_UDP);
return result;
***************
*** 262,429 ****
/* opens a tcp or udp connection to a remote host */
int
! my_connect (char *host_name, int port, int *sd, char *proto)
{
! struct sockaddr_in servaddr;
! struct hostent *hp;
! struct protoent *ptrp;
int result;
! bzero ((char *) &servaddr, sizeof (servaddr));
! servaddr.sin_family = AF_INET;
! servaddr.sin_port = htons (port);
!
! /* try to bypass using a DNS lookup if this is just an IP address */
! if (!my_inet_aton (host_name, &servaddr.sin_addr)) {
!
! /* else do a DNS lookup */
! hp = gethostbyname ((const char *) host_name);
! if (hp == NULL) {
! printf ("Invalid host name '%s'\n", host_name);
! return STATE_UNKNOWN;
! }
! memcpy (&servaddr.sin_addr, hp->h_addr, hp->h_length);
! }
! /* map transport protocol name to protocol number */
! if ((ptrp = getprotobyname (proto)) == NULL) {
! printf ("Cannot map \"%s\" to protocol number\n", proto);
return STATE_UNKNOWN;
}
! /* create a socket */
! *sd =
! socket (PF_INET, (!strcmp (proto, "udp")) ? SOCK_DGRAM : SOCK_STREAM,
! ptrp->p_proto);
! if (*sd < 0) {
! printf ("Socket creation failed\n");
! return STATE_UNKNOWN;
! }
!
! /* open a connection */
! result = connect (*sd, (struct sockaddr *) &servaddr, sizeof (servaddr));
! if (result < 0) {
! switch (errno) {
! case ECONNREFUSED:
! printf ("Connection refused by host\n");
! break;
! case ETIMEDOUT:
! printf ("Timeout while attempting connection\n");
! break;
! case ENETUNREACH:
! printf ("Network is unreachable\n");
! break;
! default:
! printf ("Connection refused or timed out\n");
! }
!
! return STATE_CRITICAL;
! }
!
! return STATE_OK;
! }
!
!
! /* This code was taken from Fyodor's nmap utility, which was originally
! taken from the GLIBC 2.0.6 libraries because Solaris doesn't contain
! the inet_aton() funtion. */
! int
! my_inet_aton (register const char *cp, struct in_addr *addr)
! {
! register unsigned int val; /* changed from u_long --david */
! register int base, n;
! register char c;
! u_int parts[4];
! register u_int *pp = parts;
!
! c = *cp;
!
! for (;;) {
!
! /*
! * Collect number up to ``.''.
! * Values are specified as for C:
! * 0x=hex, 0=octal, isdigit=decimal.
! */
! if (!isdigit ((int) c))
! return (0);
! val = 0;
! base = 10;
!
! if (c == '0') {
! c = *++cp;
! if (c == 'x' || c == 'X')
! base = 16, c = *++cp;
! else
! base = 8;
! }
!
! for (;;) {
! if (isascii ((int) c) && isdigit ((int) c)) {
! val = (val * base) + (c - '0');
! c = *++cp;
! }
! else if (base == 16 && isascii ((int) c) && isxdigit ((int) c)) {
! val = (val << 4) | (c + 10 - (islower ((int) c) ? 'a' : 'A'));
! c = *++cp;
! }
! else
break;
- }
-
- if (c == '.') {
! /*
! * Internet format:
! * a.b.c.d
! * a.b.c (with c treated as 16 bits)
! * a.b (with b treated as 24 bits)
! */
! if (pp >= parts + 3)
! return (0);
! *pp++ = val;
! c = *++cp;
}
! else
! break;
}
! /* Check for trailing characters */
! if (c != '\0' && (!isascii ((int) c) || !isspace ((int) c)))
! return (0);
!
! /* Concoct the address according to the number of parts specified */
! n = pp - parts + 1;
! switch (n) {
!
! case 0:
! return (0); /* initial nondigit */
!
! case 1: /* a -- 32 bits */
! break;
!
! case 2: /* a.b -- 8.24 bits */
! if (val > 0xffffff)
! return (0);
! val |= parts[0] << 24;
! break;
!
! case 3: /* a.b.c -- 8.8.16 bits */
! if (val > 0xffff)
! return (0);
! val |= (parts[0] << 24) | (parts[1] << 16);
! break;
!
! case 4: /* a.b.c.d -- 8.8.8.8 bits */
! if (val > 0xff)
! return (0);
! val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
! break;
}
-
- if (addr)
- addr->s_addr = htonl (val);
-
- return (1);
}
--- 255,306 ----
/* opens a tcp or udp connection to a remote host */
int
! my_connect (char *host_name, int port, int *sd, int proto)
{
! struct addrinfo hints;
! struct addrinfo *res;
! struct addrinfo *ptrp;
! char port_str[6];
int result;
! memset (&hints, 0, sizeof (hints));
! hints.ai_family = PF_UNSPEC;
! hints.ai_protocol = proto;
! snprintf (port_str, sizeof (port_str), "%d", port);
! result = getaddrinfo (host_name, port_str, &hints, &res);
! if (result != 0) {
! printf ("%s\n", gai_strerror (result));
return STATE_UNKNOWN;
}
+ else {
+ while (res) {
+ /* attempt to create a socket */
+ *sd = socket (res->ai_family, (proto == IPPROTO_UDP) ?
+ SOCK_DGRAM : SOCK_STREAM, res->ai_protocol);
+
+ if (*sd < 0) {
+ printf ("Socket creation failed\n");
+ freeaddrinfo (res);
+ return STATE_UNKNOWN;
+ }
! /* attempt to open a connection */
! result = connect (*sd, res->ai_addr, res->ai_addrlen);
! if (result == 0)
break;
! close (*sd);
! res = res->ai_next;
}
! freeaddrinfo (res);
}
! if (result == 0)
! return STATE_OK;
! else {
! printf ("%s\n", strerror(errno));
! return STATE_CRITICAL;
}
}
Index: netutils.h.in
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/netutils.h.in,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** netutils.h.in 7 Mar 2003 22:11:25 -0000 1.2
--- netutils.h.in 8 Mar 2003 02:26:22 -0000 1.3
***************
*** 35,38 ****
--- 35,39 ----
#undef HAVE_STRING_H
+ #include "config.h"
#include "common.h"
#include <netinet/in.h>
***************
*** 42,62 ****
int process_tcp_request2 (char *address, int port, char *sbuffer,
! char *rbuffer, int rsize);
int process_tcp_request (char *address, int port, char *sbuffer,
! char *rbuffer, int rsize);
int process_udp_request (char *address, int port, char *sbuffer,
! char *rbuffer, int rsize);
int process_request (char *address, int port, char *proto, char *sbuffer,
! char *rbuffer, int rsize);
int my_tcp_connect (char *address, int port, int *sd);
int my_udp_connect (char *address, int port, int *sd);
! int my_connect (char *address, int port, int *sd, char *proto);
!
! int my_inet_aton (register const char *cp, struct in_addr *addr);
- #ifndef DEFAULT_SOCKET_TIMEOUT
- #include "config.h"
- #include "common.h"
- #endif
int socket_timeout = DEFAULT_SOCKET_TIMEOUT;
--- 43,57 ----
int process_tcp_request2 (char *address, int port, char *sbuffer,
! char *rbuffer, int rsize);
int process_tcp_request (char *address, int port, char *sbuffer,
! char *rbuffer, int rsize);
int process_udp_request (char *address, int port, char *sbuffer,
! char *rbuffer, int rsize);
int process_request (char *address, int port, char *proto, char *sbuffer,
! char *rbuffer, int rsize);
int my_tcp_connect (char *address, int port, int *sd);
int my_udp_connect (char *address, int port, int *sd);
! int my_connect (char *address, int port, int *sd, int proto);
int socket_timeout = DEFAULT_SOCKET_TIMEOUT;
Index: utils.c
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/utils.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -r1.16 -r1.17
*** utils.c 16 Jan 2003 05:21:18 -0000 1.16
--- utils.c 8 Mar 2003 02:26:22 -0000 1.17
***************
*** 18,21 ****
--- 18,23 ----
#include <limits.h>
+ #include <arpa/inet.h>
+
extern int timeout_interval;
extern const char *progname;
***************
*** 28,32 ****
int is_host (char *);
! int is_dotted_quad (char *);
int is_hostname (char *);
--- 30,37 ----
int is_host (char *);
! int is_addr (char *);
! int resolve_host_or_addr (char *, int);
! int is_inet_addr (char *);
! int is_inet6_addr (char *);
int is_hostname (char *);
***************
*** 59,63 ****
/* **************************************************************************
! * max_state(STATE_x, STATE_y)
* compares STATE_x to STATE_y and returns result based on the following
* STATE_UNKNOWN < STATE_OK < STATE_WARNING < STATE_CRITICAL
--- 64,68 ----
/* **************************************************************************
! /* max_state(STATE_x, STATE_y)
* compares STATE_x to STATE_y and returns result based on the following
* STATE_UNKNOWN < STATE_OK < STATE_WARNING < STATE_CRITICAL
***************
*** 168,193 ****
is_host (char *address)
{
! if (is_dotted_quad (address) || is_hostname (address))
return (TRUE);
return (FALSE);
}
int
! is_dotted_quad (char *address)
{
! int o1, o2, o3, o4;
! char c[1];
! if (!address)
! return FALSE;
! if (sscanf (address, "%d.%d.%d.%d%c", &o1, &o2, &o3, &o4, c) != 4)
! return FALSE;
! else if (o1 > 255 || o2 > 255 || o3 > 255 || o4 > 255)
! return FALSE;
! else if (o1 < 0 || o2 < 0 || o3 < 0 || o4 < 0)
return FALSE;
! else
return TRUE;
}
--- 173,220 ----
is_host (char *address)
{
! if (is_addr (address) || is_hostname (address))
return (TRUE);
+
return (FALSE);
}
int
! is_addr (char *address)
{
! if (is_inet_addr (address) || is_inet6_addr (address))
! return (TRUE);
! return (FALSE);
! }
! int
! resolve_host_or_addr (char *address, int family)
! {
! struct addrinfo hints;
! struct addrinfo *res;
! int retval;
!
! memset (&hints, 0, sizeof (hints));
! hints.ai_family = family;
! retval = getaddrinfo (address, NULL, &hints, &res);
!
! if (retval != 0)
return FALSE;
! else {
! freeaddrinfo (res);
return TRUE;
+ }
+ }
+
+ int
+ is_inet_addr (char *address)
+ {
+ return resolve_host_or_addr (address, AF_INET);
+ }
+
+ int
+ is_inet6_addr (char *address)
+ {
+ return resolve_host_or_addr (address, AF_INET6);
}
***************
*** 202,221 ****
is_hostname (char *s1)
{
! if (!s1 || strlen (s1) > 63) {
! return FALSE;
! }
! if (strcspn (s1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUWVXYZ0123456789-.") != 0) {
! return FALSE;
! }
! if (strspn (s1, "0123456789-.") == 1) {
! return FALSE;
! }
! while ((s1 = index (s1, '.'))) {
! s1++;
! if (strspn (s1, "0123456789-.") == 1) {
! return FALSE;
! }
! }
! return TRUE;
}
--- 229,233 ----
is_hostname (char *s1)
{
! return resolve_host_or_addr (s1, AF_UNSPEC);
}
Index: utils.h.in
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/utils.h.in,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -r1.8 -r1.9
*** utils.h.in 13 Jan 2003 12:15:16 -0000 1.8
--- utils.h.in 8 Mar 2003 02:26:22 -0000 1.9
***************
*** 29,33 ****
int is_host (char *);
! int is_dotted_quad (char *);
int is_hostname (char *);
--- 29,35 ----
int is_host (char *);
! int is_addr (char *);
! int is_inet_addr (char *);
! int is_inet6_addr (char *);
int is_hostname (char *);
More information about the Commits
mailing list