diff --git a/build/rpm/GNUmakefile b/build/rpm/GNUmakefile index 0dcaf49..522b6a0 100644 --- a/build/rpm/GNUmakefile +++ b/build/rpm/GNUmakefile @@ -64,7 +64,7 @@ pcp.spec: pcp.spec.in -e's|@pmda_infiniband@|$(PMDA_INFINIBAND)|g' \ -e's|@enable_secure@|$(ENABLE_SECURE)|g' \ -e's|@enable_probes@|$(ENABLE_PROBES)|g' \ - -e's|@enable_dns_sd@|$(ENABLE_DNS_SD)|g' \ + -e's|@enable_avahi@|$(ENABLE_AVAHI)|g' \ -e"s|@build_root@|$${DIST_ROOT}|g" \ -e's|@pcp_sysconf_dir@|$(PCP_SYSCONF_DIR)|g' \ -e's|@pcp_log_dir@|$(PCP_LOG_DIR)|g' \ diff --git a/build/rpm/pcp.spec.in b/build/rpm/pcp.spec.in index e8e6183..3c5b0b6 100644 --- a/build/rpm/pcp.spec.in +++ b/build/rpm/pcp.spec.in @@ -13,7 +13,7 @@ BuildRequires: python-devel BuildRequires: ncurses-devel BuildRequires: readline-devel BuildRequires: perl(ExtUtils::MakeMaker) -%if "@enable_dns_sd@" == "true" +%if "@enable_avahi@" == "true" BuildRequires: avahi-devel %endif %if "@enable_secure@" == "true" diff --git a/configure b/configure index 8664890..0dc1bb2 100755 --- a/configure +++ b/configure @@ -774,7 +774,7 @@ PACKAGE_MINOR PACKAGE_MAJOR pcp_platform_paths enable_avahi -enable_dns_sd +enable_discovery lib_for_avahi avahi_LIBS avahi_CFLAGS @@ -859,7 +859,7 @@ with_static_probes with_infiniband with_user with_group -with_dns_sd +with_discovery enable_ssp enable_pie enable_shared @@ -1528,8 +1528,7 @@ Optional Packages: --with-user user account under which daemons run (default is pcp) --with-group user group under which daemons run (default is pcp) - --with-dns-sd enable support for DNS Service Discovery (default is - on) + --with-discovery enable support for service discovery (default is on) --with-configdir configuration directory [LOCALSTATEDIR/pcp/config] --with-perl_installdirs perl installdirs [vendor] --with-perl_install_base @@ -2481,11 +2480,11 @@ fi -# Check whether --with-dns-sd was given. -if test "${with_dns_sd+set}" = set; then : - withval=$with_dns_sd; do_dns_sd=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-dns-sd=$withval" +# Check whether --with-discovery was given. +if test "${with_discovery+set}" = set; then : + withval=$with_discovery; do_discovery=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-discovery=$withval" else - do_dns_sd=check + do_discovery=check fi @@ -4190,7 +4189,7 @@ $as_echo "no" >&6; } PKG_CONFIG="" fi fi -if test "x$do_dns_sd" != "xno"; then : +if test "x$do_discovery" != "xno"; then : # on Mac OS X, dns_sd.h @@ -4364,13 +4363,18 @@ done $as_echo "#define HAVE_AVAHI 1" >>confdefs.h - enable_dns_sd=true + enable_discovery=true fi - if test "$do_dns_sd" != "check" -a "$enable_dns_sd" != "true" + if test "$do_discovery" != "check" -a "$enable_discovery" != "true" then as_fn_error $? "cannot enable DNS-SD - no platform support" "$LINENO" 5 fi + if test "$enable_discovery" = "true" + then + $as_echo "#define HAVE_SERVICE_DISCOVERY 1" >>confdefs.h + + fi fi diff --git a/configure.in b/configure.in index 847d69a..7759220 100644 --- a/configure.in +++ b/configure.in @@ -78,11 +78,11 @@ AC_ARG_WITH( [pcp_group=pcp]) AC_SUBST(pcp_group) -AC_ARG_WITH([dns-sd], - [AC_HELP_STRING([--with-dns-sd], - [enable support for DNS Service Discovery (default is on)])], - [do_dns_sd=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-dns-sd=$withval"], - [do_dns_sd=check]) +AC_ARG_WITH([discovery], + [AC_HELP_STRING([--with-discovery], + [enable support for service discovery (default is on)])], + [do_discovery=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-discovery=$withval"], + [do_discovery=check]) # # Note: the following environment variables may be @@ -248,8 +248,8 @@ then AC_SUBST(DTRACE) fi -dnl Check for DNS-SD (Service Discovery) -AS_IF([test "x$do_dns_sd" != "xno"], [ +dnl Check for service discovery mechanisms (DNS-SD, Avahi) +AS_IF([test "x$do_discovery" != "xno"], [ # on Mac OS X, dns_sd.h # on Linux, aloha Avahi @@ -267,15 +267,19 @@ AS_IF([test "x$do_dns_sd" != "xno"], [ AC_SUBST(lib_for_avahi) AC_SUBST(avahi_CFLAGS) AC_DEFINE(HAVE_AVAHI) - enable_dns_sd=true + enable_discovery=true fi - if test "$do_dns_sd" != "check" -a "$enable_dns_sd" != "true" + if test "$do_discovery" != "check" -a "$enable_discovery" != "true" then - AC_MSG_ERROR(cannot enable DNS-SD - no platform support) + AC_MSG_ERROR(cannot enable service discovery - no supported mechanisms) + fi + if test "$enable_discovery" = "true" + then + AC_DEFINE(HAVE_SERVICE_DISCOVERY) fi ]) -AC_SUBST(enable_dns_sd) +AC_SUBST(enable_discovery) AC_SUBST(enable_avahi) # setup additional platform-specific binary search PATH components diff --git a/src/include/builddefs.in b/src/include/builddefs.in index e720112..b5a3c8a 100644 --- a/src/include/builddefs.in +++ b/src/include/builddefs.in @@ -191,7 +191,6 @@ RDYNAMIC_FLAG = @rdynamic_flag@ ENABLE_SHARED = @enable_shared@ ENABLE_SECURE = @enable_secure@ ENABLE_PROBES = @enable_probes@ -ENABLE_DNS_SD = @enable_dns_sd@ ENABLE_AVAHI = @enable_avahi@ # additional libraries needed for particular functions diff --git a/src/include/pcp/config.h.in b/src/include/pcp/config.h.in index d0b3e79..9f69ff5 100644 --- a/src/include/pcp/config.h.in +++ b/src/include/pcp/config.h.in @@ -193,8 +193,9 @@ extern "C" { /* define which libraries are available */ #undef HAVE_SECURE_SOCKETS -#undef HAVE_AVAHI #undef HAVE_STATIC_PROBES +#undef HAVE_SERVICE_DISCOVERY +#undef HAVE_AVAHI #undef HAVE_LIBREGEX #undef HAVE_READLINE diff --git a/src/include/pcp/impl.h b/src/include/pcp/impl.h index f7aa1cc..714e873 100644 --- a/src/include/pcp/impl.h +++ b/src/include/pcp/impl.h @@ -644,11 +644,10 @@ typedef enum { PM_SERVER_FEATURE_AUTH, PM_SERVER_FEATURE_CREDS_REQD, PM_SERVER_FEATURE_UNIX_DOMAIN, + PM_SERVER_FEATURE_DISCOVERY, PM_SERVER_FEATURES } __pmServerFeature; -typedef struct __pmServerPresence __pmServerPresence; - extern int __pmServerHasFeature(__pmServerFeature); extern int __pmServerSetFeature(__pmServerFeature); extern int __pmServerAddPorts(const char *); @@ -663,6 +662,8 @@ extern int __pmServerOpenRequestPorts(__pmFdSet *, int); extern void __pmServerCloseRequestPorts(void); extern void __pmServerDumpRequestPorts(FILE *); extern char *__pmServerRequestPortString(int, char *, size_t); + +typedef struct __pmServerPresence __pmServerPresence; extern __pmServerPresence *__pmServerAdvertisePresence(const char *, int); extern void __pmServerUnadvertisePresence(__pmServerPresence *); diff --git a/src/libpcp/src/auxserver.c b/src/libpcp/src/auxserver.c index 556cb2b..c7f9635 100644 --- a/src/libpcp/src/auxserver.c +++ b/src/libpcp/src/auxserver.c @@ -697,6 +697,22 @@ __pmSecureServerHandshake(int fd, int flags, __pmHashCtl *attrs) return -EOPNOTSUPP; } +int +__pmSecureServerHasFeature(__pmServerFeature query) +{ + (void)query; + return 0; +} + +int +__pmSecureServerSetFeature(__pmServerFeature wanted) +{ + (void)wanted; + return 0; +} + +#endif /* !HAVE_SECURE_SOCKETS */ + static unsigned int server_features; int @@ -707,7 +723,7 @@ __pmServerSetFeature(__pmServerFeature wanted) server_features |= (1 << wanted); return 1; } - return 0; + return __pmSecureServerSetFeature(wanted); } int @@ -719,28 +735,26 @@ __pmServerHasFeature(__pmServerFeature query) case PM_SERVER_FEATURE_IPV6: sts = (strcmp(__pmGetAPIConfig("ipv6"), "true") == 0); break; + case PM_SERVER_FEATURE_DISCOVERY: case PM_SERVER_FEATURE_CREDS_REQD: case PM_SERVER_FEATURE_UNIX_DOMAIN: if (server_features & (1 << query)) sts = 1; break; default: + sts = __pmSecureServerHasFeature(query); break; } return sts; } -#endif /* !HAVE_SECURE_SOCKETS */ - -/* XXX TODO: HAVE_SERVICE_DISCOVERY not defined yet. Waiting on Nathan. - * For now, enable this code if we have Avahi. */ -#if HAVE_AVAHI /* defined(HAVE_SERVICE_DISCOVERY) */ +#if defined(HAVE_SERVICE_DISCOVERY) __pmServerPresence * __pmServerAdvertisePresence(const char *serviceSpec, int port) { - /* Allocate the server presence data structure. */ __pmServerPresence *s; + if ((s = malloc(sizeof(*s))) == NULL) { __pmNoMem("__pmServerAdvertisePresence: can't allocate __pmServerPresence", sizeof(*s), PM_FATAL_ERR); @@ -749,24 +763,20 @@ __pmServerAdvertisePresence(const char *serviceSpec, int port) /* Now advertise our presence using all available means. If a particular * method is not available or not configured, then the respective call * will have no effect. - * Currently, only avahi is supported. */ - s->avahi = __pmServerAvahiAdvertisePresence(serviceSpec, port); - + __pmServerAvahiAdvertisePresence(s, serviceSpec, port); + server_features |= PM_SERVER_FEATURE_DISCOVERY; return s; } void -__pmServerUnadvertisePresence(__pmServerPresence *s) { +__pmServerUnadvertisePresence(__pmServerPresence *s) +{ /* Unadvertise our presence for all available means. If a particular * method is not active, then the respective call will have no effect. - * Currently, only avahi is supported. */ - if (s->avahi != NULL) { - __pmServerAvahiUnadvertisePresence(s->avahi); - free(s->avahi); - s->avahi = NULL; - } + __pmServerAvahiUnadvertisePresence(s); + free(s); } #else /* !HAVE_SERVICE_DISCOVERY */ diff --git a/src/libpcp/src/avahi.c b/src/libpcp/src/avahi.c index d14a577..ce3620a 100644 --- a/src/libpcp/src/avahi.c +++ b/src/libpcp/src/avahi.c @@ -16,16 +16,17 @@ #include "pmapi.h" #include "impl.h" +#include "internal.h" #include "avahi.h" -typedef struct __pmServerAvahiPresence { +struct __pmServerAvahiPresence { char *avahi_service_name; const char *avahi_service_tag; int port; AvahiThreadedPoll *avahi_threaded_poll; AvahiClient *avahi_client; AvahiEntryGroup *avahi_group; -} __pmServerAvahiPresence; +}; static void entryGroupCallback( AvahiEntryGroup *g, @@ -301,13 +302,12 @@ publishService(const char *serviceName, const char *serviceTag, int port) return NULL; } -__pmServerAvahiPresence * -__pmServerAvahiAdvertisePresence(const char *serviceSpec, int port) +void +__pmServerAvahiAdvertisePresence(__pmServerPresence *s, const char *serviceSpec, int port) { size_t size; char *serviceName; char *serviceTag; - __pmServerAvahiPresence *p; /* The service spec is simply the name of the server. Use it to * construct the avahi service name and service tag. @@ -327,15 +327,19 @@ __pmServerAvahiAdvertisePresence(const char *serviceSpec, int port) sprintf(serviceTag, "_%s._tcp", serviceSpec); /* Now publish the avahi service. */ - p = publishService (serviceName, serviceTag, port); + s->avahi = publishService(serviceName, serviceTag, port); /* Clean up. */ free(serviceName); free(serviceTag); - return p; } void -__pmServerAvahiUnadvertisePresence(__pmServerAvahiPresence *s) { - cleanup(s); +__pmServerAvahiUnadvertisePresence(__pmServerPresence *s) +{ + if (s->avahi != NULL) { + cleanup(s->avahi); + free(s->avahi); + s->avahi = NULL; + } } diff --git a/src/libpcp/src/avahi.h b/src/libpcp/src/avahi.h index bb548b4..78d4372 100644 --- a/src/libpcp/src/avahi.h +++ b/src/libpcp/src/avahi.h @@ -19,9 +19,7 @@ #include #include -typedef struct __pmServerAvahiPresence __pmServerAvahiPresence; - -__pmServerAvahiPresence *__pmServerAvahiAdvertisePresence(const char *, int); -void __pmServerAvahiUnadvertisePresence(__pmServerAvahiPresence *); +void __pmServerAvahiAdvertisePresence(__pmServerPresence *, const char *, int); +void __pmServerAvahiUnadvertisePresence(__pmServerPresence *); #endif /* AVAHI_H */ diff --git a/src/libpcp/src/check-statics b/src/libpcp/src/check-statics index f8030a3..35f3f24 100755 --- a/src/libpcp/src/check-statics +++ b/src/libpcp/src/check-statics @@ -99,7 +99,7 @@ auxserver.o b localSocketPath # single-threaded server scope b serviceSpec # single-threaded server scope d localSocketFd # single-threaded server scope - b ?server_features # single-threaded server scope + b server_features # single-threaded server scope ?avahi.o checksum.o config.o diff --git a/src/libpcp/src/config.c b/src/libpcp/src/config.c index a2b5e3d..34d78b8 100644 --- a/src/libpcp/src/config.c +++ b/src/libpcp/src/config.c @@ -323,6 +323,11 @@ ipv6_enabled(void) #else #define STATIC_PROBES_ENABLED disabled #endif +#if defined(HAVE_SERVICE_DISCOVERY) +#define SERVICE_DISCOVERY_ENABLED enabled +#else +#define SERVICE_DISCOVERY_ENABLED disabled +#endif typedef const char *(*feature_detector)(void); static struct { @@ -343,6 +348,7 @@ static struct { { "authentication", AUTHENTICATION_ENABLED }, /* from pcp-3.8.x */ { "unix_domain_sockets",UNIX_DOMAIN_SOCKETS_ENABLED }, /* from pcp-3.8.2 */ { "static_probes", STATIC_PROBES_ENABLED }, /* from pcp-3.8.3 */ + { "service_discovery", SERVICE_DISCOVERY_ENABLED }, /* from pcp-3.8.6 */ }; void diff --git a/src/libpcp/src/internal.h b/src/libpcp/src/internal.h index ab76145..d0392b8 100644 --- a/src/libpcp/src/internal.h +++ b/src/libpcp/src/internal.h @@ -120,6 +120,8 @@ extern int __pmConnectCheckError(int); extern void *__pmGetSecureSocket(int); extern void *__pmGetUserAuthData(int); extern int __pmSecureServerIPCFlags(int, int); +extern int __pmSecureServerHasFeature(__pmServerFeature); +extern int __pmSecureServerSetFeature(__pmServerFeature); #define SECURE_SERVER_SASL_SERVICE "PCP Collector" #define LIMIT_AUTH_PDU 2048 /* maximum size of a SASL transfer (in bytes) */ @@ -152,9 +154,9 @@ extern int __pmGetUserIdentity(const char *, __pmUserID *, __pmGroupID *, int); */ typedef struct __pmServerAvahiPresence __pmServerAvahiPresence; -typedef struct __pmServerPresence { +struct __pmServerPresence { __pmServerAvahiPresence *avahi; -} __pmServerPresence; +}; #ifdef __cplusplus } diff --git a/src/libpcp/src/secureserver.c b/src/libpcp/src/secureserver.c index c336341..223f68a 100644 --- a/src/libpcp/src/secureserver.c +++ b/src/libpcp/src/secureserver.c @@ -37,58 +37,28 @@ static struct { /* status flags (bitfields) */ unsigned int certificate_verified : 1; /* NSS */ unsigned int ssl_session_cache_setup : 1; /* NSS */ - unsigned int credentials_required : 1; /* SASL/AF_UNIX */ - unsigned int unix_domain_socket : 1; /* AF_UNIX */ } secure_server; int -__pmServerSetFeature(__pmServerFeature wanted) +__pmSecureServerSetFeature(__pmServerFeature wanted) { - switch (wanted) { - case PM_SERVER_FEATURE_CREDS_REQD: - PM_INIT_LOCKS(); - PM_LOCK(__pmLock_libpcp); - secure_server.credentials_required = 1; - PM_UNLOCK(__pmLock_libpcp); - return 1; - case PM_SERVER_FEATURE_UNIX_DOMAIN: - PM_INIT_LOCKS(); - PM_LOCK(__pmLock_libpcp); - secure_server.unix_domain_socket = 1; - PM_UNLOCK(__pmLock_libpcp); - return 1; - default: - break; - } - return 0; + (void)wanted; + return 0; /* nothing dynamically enabled at this stage */ } int -__pmServerHasFeature(__pmServerFeature query) +__pmSecureServerHasFeature(__pmServerFeature query) { int sts = 0; switch (query) { - case PM_SERVER_FEATURE_UNIX_DOMAIN: - case PM_SERVER_FEATURE_CREDS_REQD: case PM_SERVER_FEATURE_SECURE: - PM_INIT_LOCKS(); - PM_LOCK(__pmLock_libpcp); - if (query == PM_SERVER_FEATURE_SECURE) - sts = secure_server.certificate_verified; - if (query == PM_SERVER_FEATURE_CREDS_REQD) - sts = secure_server.credentials_required; - if (query == PM_SERVER_FEATURE_UNIX_DOMAIN) - sts = secure_server.unix_domain_socket; - PM_UNLOCK(__pmLock_libpcp); + sts = secure_server.certificate_verified; break; case PM_SERVER_FEATURE_COMPRESS: case PM_SERVER_FEATURE_AUTH: sts = 1; break; - case PM_SERVER_FEATURE_IPV6: - sts = (strcmp(__pmGetAPIConfig("ipv6"), "true") == 0); - break; default: break; }