[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