فهرست منبع

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

Jeremy T. Bouse 23 سال پیش
والد
کامیت
11b35b92e3
11فایلهای تغییر یافته به همراه123 افزوده شده و 156 حذف شده
  1. 4 3
      configure.in
  2. 1 5
      lib/Makefile.am
  3. 29 24
      plugins/Makefile.am
  4. 9 18
      plugins/getaddrinfo.c
  5. 1 0
      plugins/getaddrinfo.h
  6. 0 0
      plugins/gethostbyname.c
  7. 0 0
      plugins/gethostbyname.h
  8. 68 15
      plugins/netutils.c
  9. 11 2
      plugins/netutils.h
  10. 0 81
      plugins/utils.c
  11. 0 8
      plugins/utils.h

+ 4 - 3
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])

+ 1 - 5
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

+ 29 - 24
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

+ 9 - 18
lib/getaddrinfo.c → 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  <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];
 }
-

+ 1 - 0
lib/getaddrinfo.h → 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  <brian@stafford.uklinux.net>
  *

+ 0 - 0
lib/gethostbyname.c → plugins/gethostbyname.c


+ 0 - 0
lib/gethostbyname.h → plugins/gethostbyname.h


+ 68 - 15
plugins/netutils.c

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

+ 11 - 2
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;

+ 0 - 81
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)
 {

+ 0 - 8
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 *);