diff --git a/build/rpm/pcp.spec.in b/build/rpm/pcp.spec.in index 99c8644..e8e6183 100644 --- a/build/rpm/pcp.spec.in +++ b/build/rpm/pcp.spec.in @@ -13,6 +13,9 @@ BuildRequires: python-devel BuildRequires: ncurses-devel BuildRequires: readline-devel BuildRequires: perl(ExtUtils::MakeMaker) +%if "@enable_dns_sd@" == "true" +BuildRequires: avahi-devel +%endif %if "@enable_secure@" == "true" BuildRequires: nss-devel BuildRequires: cyrus-sasl-devel diff --git a/configure.in b/configure.in index ebecdbf..f88b5fa 100644 --- a/configure.in +++ b/configure.in @@ -78,6 +78,12 @@ AC_ARG_WITH( [pcp_group=pcp]) AC_SUBST(pcp_group) +AC_ARG_WITH([dns-sd], + [AC_HELP_STRING([--with-dns-sd], + [enable support for pmcd dns-sd announcements (default is on)])] + [do_dns_sd=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-dns-sd=$withval"], + [do_dns_sd=no]) + # # Note: the following environment variables may be # set to override the defaults. @@ -242,6 +248,28 @@ then AC_SUBST(DTRACE) fi +dnl Check for DNS-SD +AS_IF([test "x$do_dns_sd" != "xno"], [ + # on linux, avahi + PKG_CHECK_MODULES([avahi], [avahi-client], + [enable_dns_sd=true + AC_CHECK_LIB(avahi-client, avahi_client_new, + [lib_for_avahi="-lavahi-common -lavahi-client"], + [enable_dns_sd=false]) + AC_DEFINE([HAVE_AVAHI],[1],[Define to 1 if you have the avahi libraries.]) + ], + [enable_dns_sd=false]) + AC_CHECK_HEADERS([avahi-client/publish.h], [], [enable_dns_sd=false]) + AC_CHECK_HEADERS([avahi-common/alternative.h], [], [enable_dns_sd=false]) + if test "$enable_dns_sd" != "true" + then + AC_MSG_ERROR(cannot enable DNS-SD. Avahi not found) + fi +]) +AC_SUBST(enable_dns_sd) +AC_SUBST(lib_for_avahi) +AC_SUBST(avahi_CFLAGS) + # setup additional platform-specific binary search PATH components pcp_platform_paths="" case $target_os diff --git a/src/include/builddefs.in b/src/include/builddefs.in index 61047ee..30a7c7c 100644 --- a/src/include/builddefs.in +++ b/src/include/builddefs.in @@ -125,6 +125,7 @@ PIELDFLAGS = @PIELDFLAGS@ NSSCFLAGS = @NSSCFLAGS@ NSPRCFLAGS = @NSPRCFLAGS@ SASLCFLAGS = @SASLCFLAGS@ +AVAHICFLAGS = @avahi_CFLAGS@ LDFLAGS += $(CFLAGS_ABI) $(PLDFLAGS) $(WARN_OFF) $(PCP_LIBS) $(LLDFLAGS) @@ -213,6 +214,7 @@ LIB_FOR_NSS = @lib_for_nss@ LIB_FOR_NSPR = @lib_for_nspr@ LIB_FOR_SASL = @lib_for_sasl@ LIB_FOR_SSL = @lib_for_ssl@ +LIB_FOR_AVAHI = @lib_for_avahi@ HAVE_LIBMICROHTTPD = @HAVE_LIBMICROHTTPD@ diff --git a/src/include/pcp/config.h.in b/src/include/pcp/config.h.in index c65dd7c..d0b3e79 100644 --- a/src/include/pcp/config.h.in +++ b/src/include/pcp/config.h.in @@ -193,6 +193,7 @@ extern "C" { /* define which libraries are available */ #undef HAVE_SECURE_SOCKETS +#undef HAVE_AVAHI #undef HAVE_STATIC_PROBES #undef HAVE_LIBREGEX #undef HAVE_READLINE diff --git a/src/include/pcp/impl.h b/src/include/pcp/impl.h index aa2c992..bc3a33d 100644 --- a/src/include/pcp/impl.h +++ b/src/include/pcp/impl.h @@ -80,6 +80,8 @@ extern int __pmGetInternalState(void); * environment */ #define SERVER_PORT 44321 +#define SERVER_SERVICE_NAME "PCP PMCD daemon" +#define SERVER_SERVICE_TAG "_pmcd._tcp" /* * port that clients connect to pmproxy(1) on by default, over-ride with @@ -645,6 +647,8 @@ typedef enum { PM_SERVER_FEATURES } __pmServerFeature; +typedef struct __pmServerPresence __pmServerPresence; + extern int __pmServerHasFeature(__pmServerFeature); extern int __pmServerSetFeature(__pmServerFeature); extern int __pmServerAddPorts(const char *); @@ -658,6 +662,8 @@ extern int __pmServerOpenRequestPorts(__pmFdSet *, int); extern void __pmServerCloseRequestPorts(void); extern void __pmServerDumpRequestPorts(FILE *); extern char *__pmServerRequestPortString(int, char *, size_t); +extern __pmServerPresence *__pmServerAdvertisePresence(const char *, const char *, int); +extern void __pmServerUnadvertisePresence(__pmServerPresence *); /* * Per-context controls for archives and logs diff --git a/src/libpcp/src/GNUmakefile b/src/libpcp/src/GNUmakefile index f6dc1a4..547e2ca 100644 --- a/src/libpcp/src/GNUmakefile +++ b/src/libpcp/src/GNUmakefile @@ -27,15 +27,15 @@ CFILES = connect.c context.c desc.c err.c fetch.c freeresult.c \ stuffvalue.c endian.c config.c auxconnect.c auxserver.c \ p_lcontrol.c p_lrequest.c p_lstatus.c logconnect.c logcontrol.c \ connectlocal.c derive.c derive_fetch.c events.c lock.c hash.c \ - fault.c access.c + fault.c access.c avahi.c HFILES = derive.h internal.h LSRCFILES = check-statics ifeq "$(ENABLE_SECURE)" "true" -LLDLIBS += $(LIB_FOR_SSL) $(LIB_FOR_NSS) $(LIB_FOR_NSPR) $(LIB_FOR_SASL) -LCFLAGS += $(NSSCFLAGS) $(NSPRCFLAGS) $(SASLCFLAGS) +LLDLIBS += $(LIB_FOR_SSL) $(LIB_FOR_NSS) $(LIB_FOR_NSPR) $(LIB_FOR_SASL) $(LIB_FOR_AVAHI) +LCFLAGS += $(NSSCFLAGS) $(NSPRCFLAGS) $(SASLCFLAGS) $(AVAHICFLAGS) CFILES += secureserver.c secureconnect.c else LSRCFILES += secureserver.c secureconnect.c diff --git a/src/libpcp/src/check-statics b/src/libpcp/src/check-statics index 5ed1567..6a7e6c6 100755 --- a/src/libpcp/src/check-statics +++ b/src/libpcp/src/check-statics @@ -99,6 +99,7 @@ auxserver.o b localSocketPath # single-threaded server scope d localSocketFd # single-threaded server scope b ?server_features # single-threaded server scope +avahi.o checksum.o config.o [SDR] ?__pmNativeConfig # const diff --git a/src/pmcd/src/pmcd.c b/src/pmcd/src/pmcd.c index 686cafc..2386181 100644 --- a/src/pmcd/src/pmcd.c +++ b/src/pmcd/src/pmcd.c @@ -49,6 +49,7 @@ static pid_t killer_pid; static uid_t killer_uid; #endif static int killer_sig; +static __pmServerPresence *serverPresence; static void DontStart(void) @@ -413,6 +414,9 @@ Shutdown(void) { int i; + /* No longer advertise our presence on the network. */ + __pmServerUnadvertisePresence(serverPresence); + for (i = 0; i < nAgents; i++) { AgentInfo *ap = &agent[i]; if (!ap->status.connected) @@ -961,6 +965,11 @@ main(int argc, char *argv[]) __pmServerDumpRequestPorts(stderr); fflush(stderr); + /* Advertise our presence on the network. */ + serverPresence = __pmServerAdvertisePresence(SERVER_SERVICE_NAME, + SERVER_SERVICE_TAG, + SERVER_PORT); + /* all the work is done here */ ClientLoop();