From 11b35b92e3195d230bef359f6a0679ae4414716b Mon Sep 17 00:00:00 2001 From: "Jeremy T. Bouse" Date: Sat, 15 Mar 2003 01:25:35 +0000 Subject: [PATCH] Spent the day working on backwards compatability using getaddrinfo() Moved getaddrinfo.? and gethostbyname.? from lib/ to plugins/ due to problems with compiling into the libnagiosplug.a as it required linking against socket libraries which are unneeded except for network based plugins. This code should hopefully happily work for all systems and has been tested prior to commit on Debian GNU/Linux, SPARC Solaris 7 and SPARC Solaris 9. git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@424 f882894a-f735-0410-b71e-b25c423dba1c --- configure.in | 7 +-- lib/Makefile.am | 6 +-- plugins/Makefile.am | 53 +++++++++++--------- {lib => plugins}/getaddrinfo.c | 27 ++++------- {lib => plugins}/getaddrinfo.h | 1 + {lib => plugins}/gethostbyname.c | 0 {lib => plugins}/gethostbyname.h | 0 plugins/netutils.c | 83 ++++++++++++++++++++++++++------ plugins/netutils.h | 13 ++++- plugins/utils.c | 81 ------------------------------- plugins/utils.h | 8 --- 11 files changed, 123 insertions(+), 156 deletions(-) rename {lib => plugins}/getaddrinfo.c (93%) rename {lib => plugins}/getaddrinfo.h (98%) rename {lib => plugins}/gethostbyname.c (100%) rename {lib => plugins}/gethostbyname.h (100%) diff --git a/configure.in b/configure.in index ec3606e..eea01da 100644 --- a/configure.in +++ b/configure.in @@ -386,7 +386,7 @@ else if test x$enable_emulate_getaddrinfo != xyes ; then AC_MSG_ERROR([getaddrinfo not found: try --with-lwres or --enable-emulate-getaddrinfo]) fi - LIBOBJS="$LIBOBJS getaddrinfo.o" + EXTRA_NETOBJS="$EXTRA_NETOBJS getaddrinfo.o" fi if test x"$enable_emulate_getaddrinfo" != xno ; then @@ -414,7 +414,8 @@ if test x"$enable_emulate_getaddrinfo" != xno ; then AC_SEARCH_LIBS(gethostbyname, resolv bind nsl, , [AC_MSG_ERROR([cannot find gethostbyname])]) fi - LIBOBJS="$LIBOBJS gethostbyname.o" + EXTRA_NETOBJS="$EXTRA_NETOBJS gethostbyname.o" + AC_DEFINE(EMULATE_GETADDRINFO,1,[Define if emulating getaddrinfo]) fi @@ -1451,7 +1452,7 @@ AC_TRY_COMPILE([#ifdef __STDC__ [NEED_VA_LIST=-DNEED_VA_LIST AC_SUBST(NEED_VA_LIST) AC_MSG_RESULT(no)]) AC_SUBST(EXTRAS) -AC_SUBST(LIBOBJS) +AC_SUBST(EXTRA_NETOBJS) AC_SUBST(DEPLIBS) AC_DEFINE_UNQUOTED(PACKAGE_VERSION,"${VERSION}",[package version]) diff --git a/lib/Makefile.am b/lib/Makefile.am index b24bc40..9a26e41 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -2,12 +2,8 @@ noinst_LIBRARIES = libnagiosplug.a -noinst_HEADERS = getopt.h getaddrinfo.h gethostbyname.h +noinst_HEADERS = getopt.h libnagiosplug_a_SOURCES = getopt.c getopt1.c getloadavg.c snprintf.c -libnagiosplug_a_DEPENDENCIES = @LIBOBJS@ - INCLUDES = -I$(srcdir) - -EXTRA_DIST = getaddrinfo.c gethostbyname.c diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 2524e1a..a884b45 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -14,14 +14,15 @@ EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \ check_swap check_fping check_ldap check_game check_dig \ check_nagios check_by_ssh check_dns check_nt -check_tcp_programs = check_ftp check_imap check_nntp check_pop +check_tcp_programs = check_ftp check_imap check_nntp check_pop check_udp2 -EXTRA_DIST = t utils.c netutils.c popen.c utils.h netutils.h popen.h common.h +EXTRA_DIST = t utils.c netutils.c popen.c utils.h netutils.h popen.h common.h \ + getaddrinfo.c getaddrinfo.h gethostbyname.c gethostbyname.h PLUGINHDRS = common.h config.h BASEOBJS = utils.o ../lib/libnagiosplug.a -NETOBJS = netutils.o $(BASEOBJS) +NETOBJS = netutils.o $(BASEOBJS) $(EXTRA_NETOBJS) NETLIBS = $(NETOBJS) $(SOCKETLIBS) TESTS_ENVIRONMENT = perl -I $(top_builddir) -I $(top_srcdir) @@ -36,27 +37,27 @@ AM_INSTALL_PROGRAM_FLAGS = @INSTALL_OPTS@ ############################################################################## # the actual targets -check_dig_LDADD = $(BASEOBJS) popen.o +check_dig_LDADD = $(NETLIBS) popen.o check_disk_LDADD = $(BASEOBJS) popen.o -check_dns_LDADD = $(BASEOBJS) popen.o +check_dns_LDADD = $(NETLIBS) popen.o check_dummy_LDADD = $(BASEOBJS) -check_fping_LDADD = $(BASEOBJS) popen.o +check_fping_LDADD = $(NETLIBS) popen.o check_game_LDADD = $(BASEOBJS) check_http_LDADD = $(NETLIBS) $(SSLLIBS) -check_hpjd_LDADD = $(BASEOBJS) popen.o +check_hpjd_LDADD = $(NETLIBS) popen.o check_ldap_LDADD = $(NETLIBS) $(LDAPLIBS) check_load_LDADD = $(BASEOBJS) popen.o check_mrtg_LDADD = $(BASEOBJS) check_mrtgtraf_LDADD = $(BASEOBJS) -check_mysql_LDADD = $(BASEOBJS) $(MYSQLLIBS) +check_mysql_LDADD = $(NETLIBS) $(MYSQLLIBS) check_nagios_LDADD = $(BASEOBJS) popen.o check_nt_LDADD = $(NETLIBS) check_nwstat_LDADD = $(NETLIBS) check_overcr_LDADD = $(NETLIBS) -check_pgsql_LDADD = $(BASEOBJS) $(PGLIBS) -check_ping_LDADD = $(BASEOBJS) popen.o +check_pgsql_LDADD = $(NETLIBS) $(PGLIBS) +check_ping_LDADD = $(NETLIBS) popen.o check_procs_LDADD = $(BASEOBJS) popen.o -check_radius_LDADD = $(BASEOBJS) $(RADIUSLIBS) +check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS) check_real_LDADD = $(NETLIBS) check_snmp_LDADD = $(BASEOBJS) popen.o check_smtp_LDADD = $(NETLIBS) @@ -68,31 +69,31 @@ check_udp_LDADD = $(NETLIBS) check_ups_LDADD = $(NETLIBS) check_users_LDADD = $(BASEOBJS) popen.o check_vsz_LDADD = $(BASEOBJS) popen.o -check_by_ssh_LDADD = $(BASEOBJS) popen.o +check_by_ssh_LDADD = $(NETLIBS) popen.o negate_LDADD = $(BASEOBJS) popen.o urlize_LDADD = $(BASEOBJS) popen.o -check_dig_DEPENDENCIES = check_dig.c $(BASEOBJS) popen.o $(DEPLIBS) +check_dig_DEPENDENCIES = check_dig.c $(NETOBJS) popen.o $(DEPLIBS) check_disk_DEPENDENCIES = check_disk.c $(BASEOBJS) popen.o $(DEPLIBS) -check_dns_DEPENDENCIES = check_dns.c $(BASEOBJS) popen.o $(DEPLIBS) -check_dummy_DEPENDENCIES = check_dummy.c $(DEPLIBS) -check_fping_DEPENDENCIES = check_fping.c $(BASEOBJS) popen.o $(DEPLIBS) +check_dns_DEPENDENCIES = check_dns.c $(NETOBJS) popen.o $(DEPLIBS) +check_dummy_DEPENDENCIES = check_dummy.c $(DEPLIBS) +check_fping_DEPENDENCIES = check_fping.c $(NETOBJS) popen.o $(DEPLIBS) check_game_DEPENDENCIES = check_game.c $(DEPLIBS) check_http_DEPENDENCIES = check_http.c $(NETOBJS) $(DEPLIBS) -check_hpjd_DEPENDENCIES = check_hpjd.c $(BASEOBJS) popen.o $(DEPLIBS) +check_hpjd_DEPENDENCIES = check_hpjd.c $(NETOBJS) popen.o $(DEPLIBS) check_ldap_DEPENDENCIES = check_ldap.c $(NETOBJS) $(DEPLIBS) check_load_DEPENDENCIES = check_load.c $(BASEOBJS) popen.o $(DEPLIBS) -check_mrtg_DEPENDENCIES = check_mrtg.c $(DEPLIBS) -check_mrtgtraf_DEPENDENCIES = check_mrtgtraf.c $(DEPLIBS) -check_mysql_DEPENDENCIES = check_mysql.c $(DEPLIBS) +check_mrtg_DEPENDENCIES = check_mrtg.c $(DEPLIBS) +check_mrtgtraf_DEPENDENCIES = check_mrtgtraf.c $(DEPLIBS) +check_mysql_DEPENDENCIES = check_mysql.c $(NETOBJS) $(DEPLIBS) check_nagios_DEPENDENCIES = check_nagios.c $(BASEOBJS) popen.o $(DEPLIBS) check_nt_DEPENDENCIES = check_nt.c $(NETOBJS) $(DEPLIBS) check_nwstat_DEPENDENCIES = check_nwstat.c $(NETOBJS) $(DEPLIBS) check_overcr_DEPENDENCIES = check_overcr.c $(NETOBJS) $(DEPLIBS) -check_pgsql_DEPENDENCIES = check_pgsql.c $(DEPLIBS) -check_ping_DEPENDENCIES = check_ping.c $(BASEOBJS) popen.o $(DEPLIBS) +check_pgsql_DEPENDENCIES = check_pgsql.c $(NETOBJS) $(DEPLIBS) +check_ping_DEPENDENCIES = check_ping.c $(NETOBJS) popen.o $(DEPLIBS) check_procs_DEPENDENCIES = check_procs.c $(BASEOBJS) popen.o $(DEPLIBS) -check_radius_DEPENDENCIES = check_radius.c $(DEPLIBS) +check_radius_DEPENDENCIES = check_radius.c $(NETOBJS) $(DEPLIBS) check_real_DEPENDENCIES = check_real.c $(NETOBJS) $(DEPLIBS) check_snmp_DEPENDENCIES = check_snmp.c $(BASEOBJS) popen.o $(DEPLIBS) check_smtp_DEPENDENCIES = check_smtp.c $(NETOBJS) $(DEPLIBS) @@ -104,7 +105,7 @@ check_udp_DEPENDENCIES = check_udp.c $(NETOBJS) $(DEPLIBS) check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS) check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS) check_vsz_DEPENDENCIES = check_vsz.c $(BASEOBJS) popen.o $(DEPLIBS) -check_by_ssh_DEPENDENCIES = check_by_ssh.c $(BASEOBJS) popen.o $(DEPLIBS) +check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) popen.o $(DEPLIBS) negate_DEPENDENCIES = negate.c $(BASEOBJS) popen.o $(DEPLIBS) urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS) @@ -117,6 +118,10 @@ utils.o: utils.c utils.h $(PLUGINHDRS) netutils.o: netutils.c netutils.h $(PLUGINHDRS) +getaddrinfo.o: getaddrinfo.h $(PLUGINHDRS) + +gethostbyname.o: gethostbyname.h $(PLUGINHDRS) + all-local: $(check_tcp_programs) $(check_tcp_programs): check_tcp diff --git a/lib/getaddrinfo.c b/plugins/getaddrinfo.c similarity index 93% rename from lib/getaddrinfo.c rename to plugins/getaddrinfo.c index c958da6..12ac67d 100644 --- a/lib/getaddrinfo.c +++ b/plugins/getaddrinfo.c @@ -2,6 +2,7 @@ * This file is part of libESMTP, a library for submission of RFC 2822 * formatted electronic mail messages using the SMTP protocol described * in RFC 2821. + * Modified by Jeremy T. Bouse for use in Nagios plugins * * Copyright (C) 2001,2002 Brian Stafford * @@ -89,26 +90,17 @@ getaddrinfo (const char *nodename, const char *servname, hints = &hint; } - /* servname must not be NULL in this implementation */ - if (servname == NULL) - return EAI_NONAME; - - /* check for tcp or udp sockets only */ - if (hints->ai_socktype == SOCK_STREAM) - socktype = "tcp"; - else if (hints->ai_socktype == SOCK_DGRAM) - socktype = "udp"; - else - return EAI_SERVICE; result.ai_socktype = hints->ai_socktype; /* Note: maintain port in host byte order to make debugging easier */ - if (isdigit (*servname)) - port = strtol (servname, NULL, 10); - else if ((servent = getservbyname (servname, socktype)) != NULL) - port = ntohs (servent->s_port); - else - return EAI_NONAME; + if (servname != NULL) { + if (isdigit (*servname)) + port = strtol (servname, NULL, 10); + else if ((servent = getservbyname (servname, socktype)) != NULL) + port = ntohs (servent->s_port); + else + return EAI_NONAME; + } /* if nodename == NULL refer to the local host for a client or any for a server */ @@ -309,4 +301,3 @@ gai_strerror (int ecode) return "unknown error"; return eai_descr[ecode]; } - diff --git a/lib/getaddrinfo.h b/plugins/getaddrinfo.h similarity index 98% rename from lib/getaddrinfo.h rename to plugins/getaddrinfo.h index c474d3b..5bcc884 100644 --- a/lib/getaddrinfo.h +++ b/plugins/getaddrinfo.h @@ -4,6 +4,7 @@ * This file is part of libESMTP, a library for submission of RFC 2822 * formatted electronic mail messages using the SMTP protocol described * in RFC 2821. + * Modified by Jeremy T. Bouse for use in Nagios plugins * * Copyright (C) 2001,2002 Brian Stafford * diff --git a/lib/gethostbyname.c b/plugins/gethostbyname.c similarity index 100% rename from lib/gethostbyname.c rename to plugins/gethostbyname.c diff --git a/lib/gethostbyname.h b/plugins/gethostbyname.h similarity index 100% rename from lib/gethostbyname.h rename to plugins/gethostbyname.h diff --git a/plugins/netutils.c b/plugins/netutils.c index c0e82da..4234c43 100644 --- a/plugins/netutils.c +++ b/plugins/netutils.c @@ -29,22 +29,9 @@ * ****************************************************************************/ -#include "config.h" -#include "common.h" -#include -#include +#include "netutils.h" -extern int socket_timeout; -RETSIGTYPE socket_timeout_alarm_handler (int); - -int process_tcp_request2 (char *, int, char *, char *, int); -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); +int socket_timeout = DEFAULT_SOCKET_TIMEOUT; /* handles socket timeouts */ void @@ -304,3 +291,69 @@ my_connect (char *host_name, int port, int *sd, int proto) return STATE_CRITICAL; } } + +int +is_host (char *address) +{ + if (is_addr (address) || is_hostname (address)) + return (TRUE); + + return (FALSE); +} + +int +is_addr (char *address) +{ +#ifdef USE_IPV6 + if (is_inet_addr (address) || is_inet6_addr (address)) +#else + if (is_inet_addr (address)) +#endif + 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); +} + +#ifdef USE_IPV6 +int +is_inet6_addr (char *address) +{ + return resolve_host_or_addr (address, AF_INET6); +} +#endif + +int +is_hostname (char *s1) +{ +#ifdef USE_IPV6 + return resolve_host_or_addr (s1, AF_UNSPEC); +#else + return resolve_host_or_addr (s1, AF_INET); +#endif +} + diff --git a/plugins/netutils.h b/plugins/netutils.h index 3ea5166..6c8eed3 100644 --- a/plugins/netutils.h +++ b/plugins/netutils.h @@ -43,11 +43,20 @@ 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, +int process_request (char *address, int port, int 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; +int is_host (char *); +int is_addr (char *); +int resolve_host_or_addr (char *, int); +int is_inet_addr (char *); +#ifdef USE_IPV6 +int is_inet6_addr (char *); +#endif +int is_hostname (char *); + +extern int socket_timeout; diff --git a/plugins/utils.c b/plugins/utils.c index 7361323..e204e23 100644 --- a/plugins/utils.c +++ b/plugins/utils.c @@ -27,15 +27,6 @@ void print_revision (const char *, const char *); void terminate (int, const char *fmt, ...); RETSIGTYPE timeout_alarm_handler (int); -int is_host (char *); -int is_addr (char *); -int resolve_host_or_addr (char *, int); -int is_inet_addr (char *); -#ifdef USE_IPV6 -int is_inet6_addr (char *); -#endif -int is_hostname (char *); - int is_integer (char *); int is_intpos (char *); int is_intneg (char *); @@ -170,78 +161,6 @@ timeout_alarm_handler (int signo) } } -int -is_host (char *address) -{ - if (is_addr (address) || is_hostname (address)) - return (TRUE); - - return (FALSE); -} - -int -is_addr (char *address) -{ -#ifdef USE_IPV6 - if (is_inet_addr (address) || is_inet6_addr (address)) -#else - if (is_inet_addr (address)) -#endif - 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); -} - -#ifdef USE_IPV6 -int -is_inet6_addr (char *address) -{ - return resolve_host_or_addr (address, AF_INET6); -} -#endif - -/* from RFC-1035 - * - * The labels must follow the rules for ARPANET host names. They must - * start with a letter, end with a letter or digit, and have as interior - * characters only letters, digits, and hyphen. There are also some - * restrictions on the length. Labels must be 63 characters or less. */ - -int -is_hostname (char *s1) -{ -#ifdef USE_IPV6 - return resolve_host_or_addr (s1, AF_UNSPEC); -#else - return resolve_host_or_addr (s1, AF_INET); -#endif -} - int is_numeric (char *number) { diff --git a/plugins/utils.h b/plugins/utils.h index 89ada6f..43b612c 100644 --- a/plugins/utils.h +++ b/plugins/utils.h @@ -27,14 +27,6 @@ int timeout_interval = DEFAULT_SOCKET_TIMEOUT; /* Test input types */ -int is_host (char *); -int is_addr (char *); -int is_inet_addr (char *); -#ifdef USE_IPV6 -int is_inet6_addr (char *); -#endif -int is_hostname (char *); - int is_integer (char *); int is_intpos (char *); int is_intneg (char *); -- 2.30.2