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
This commit is contained in:
Jeremy T. Bouse 2003-03-15 01:25:35 +00:00
parent 6cf5fc3c74
commit 11b35b92e3
11 changed files with 123 additions and 156 deletions

View file

@ -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])

View file

@ -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

View file

@ -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

View file

@ -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 <brian@stafford.uklinux.net>
*
@ -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];
}

View file

@ -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 <brian@stafford.uklinux.net>
*

View file

@ -29,22 +29,9 @@
*
****************************************************************************/
#include "config.h"
#include "common.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#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
}

View file

@ -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;

View file

@ -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)
{

View file

@ -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 *);