aboutsummaryrefslogtreecommitdiffstats
path: root/packages/freenas/diffs/netatalk-2.0.3-afpd-zeroconf.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/freenas/diffs/netatalk-2.0.3-afpd-zeroconf.patch')
-rw-r--r--packages/freenas/diffs/netatalk-2.0.3-afpd-zeroconf.patch1386
1 files changed, 0 insertions, 1386 deletions
diff --git a/packages/freenas/diffs/netatalk-2.0.3-afpd-zeroconf.patch b/packages/freenas/diffs/netatalk-2.0.3-afpd-zeroconf.patch
deleted file mode 100644
index 74ee8795..00000000
--- a/packages/freenas/diffs/netatalk-2.0.3-afpd-zeroconf.patch
+++ /dev/null
@@ -1,1386 +0,0 @@
-? etc/afpd/afp_avahi.c
-? etc/afpd/afp_avahi.c.org
-? etc/afpd/afp_avahi.h
-? etc/afpd/afp_avahi.h.org
-? etc/afpd/afp_bonjour.c
-? etc/afpd/afp_bonjour.c.org
-? etc/afpd/afp_bonjour.h
-? etc/afpd/afp_bonjour.h.org
-? etc/afpd/afp_howl.c
-? etc/afpd/afp_howl.c.org
-? etc/afpd/afp_howl.h
-? etc/afpd/afp_howl.h.org
-? etc/afpd/afp_zeroconf.c
-? etc/afpd/afp_zeroconf.c.org
-? etc/afpd/afp_zeroconf.h
-? etc/afpd/afp_zeroconf.h.org
-? macros/zeroconf.m4
-? macros/zeroconf.m4.org
-Index: configure.in
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/configure.in,v
-retrieving revision 1.203
-diff -u -r1.203 configure.in
---- configure.in 28 Apr 2005 20:49:17 -0000 1.203
-+++ configure.in 5 May 2006 10:46:30 -0000
-@@ -398,6 +398,9 @@
- dnl Check for optional server location protocol support (used by MacOS X)
- NETATALK_SRVLOC
-
-+dnl Check for optional Zeroconf support
-+NETATALK_ZEROCONF
-+
- dnl Check for PAM libs
- netatalk_cv_use_pam=no
- AC_PATH_PAM([
-Index: config/afpd.conf.tmpl
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/config/afpd.conf.tmpl,v
-retrieving revision 1.16
-diff -u -r1.16 afpd.conf.tmpl
---- config/afpd.conf.tmpl 28 Apr 2005 20:49:20 -0000 1.16
-+++ config/afpd.conf.tmpl 5 May 2006 10:46:31 -0000
-@@ -51,6 +51,8 @@
- # empty string.
- # -noslp Don't register this server with the Service
- # Location Protocol.
-+# -nozeroconf Don't register this server with the Multicats
-+# DNS Protocol.
- #
- #
- # Authentication Methods:
-Index: contrib/a2boot/Makefile.am
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/contrib/a2boot/Makefile.am,v
-retrieving revision 1.5
-diff -u -r1.5 Makefile.am
---- contrib/a2boot/Makefile.am 28 Apr 2005 20:49:21 -0000 1.5
-+++ contrib/a2boot/Makefile.am 5 May 2006 10:46:32 -0000
-@@ -10,7 +10,7 @@
- EXTRA_DIST = COPYRIGHT VERSION
-
- CFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/sys \
-- @CFLAGS@ @SLP_CFLAGS@ \
-+ @CFLAGS@ @SLP_CFLAGS@ @ZEROCONF_CFLAGS@ \
- -D_PATH_A_GS_BLOCKS=\"$(PKGCONFDIR)/a2boot/ProDOS16\ Boot\ Blocks\" \
- -D_PATH_A_2E_BLOCKS=\"$(PKGCONFDIR)/a2boot/Apple\ :2f:2fe\ Boot\ Blocks\" \
- -D_PATH_P16_IMAGE=\"$(PKGCONFDIR)/a2boot/ProDOS16\ Image\"
-Index: etc/afpd/Makefile.am
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/etc/afpd/Makefile.am,v
-retrieving revision 1.38
-diff -u -r1.38 Makefile.am
---- etc/afpd/Makefile.am 30 Apr 2005 21:33:41 -0000 1.38
-+++ etc/afpd/Makefile.am 5 May 2006 10:46:33 -0000
-@@ -8,19 +8,21 @@
- file.c enumerate.c desktop.c filedir.c fork.c appl.c gettok.c \
- mangle.c status.c afp_options.c afp_asp.c afp_dsi.c messages.c \
- afp_config.c nfsquota.c quota.c uam.c afs.c uid.c afp_util.c \
-- catsearch.c afprun.c
-+ catsearch.c afprun.c \
-+ afp_zeroconf.c afp_avahi.c afp_bonjour.c afp_howl.c
-
- afpd_LDADD = $(top_builddir)/libatalk/cnid/libcnid.la $(top_builddir)/libatalk/libatalk.la
- afpd_LDFLAGS = -export-dynamic
-
- noinst_HEADERS = auth.h afp_config.h desktop.h directory.h file.h \
- filedir.h fork.h globals.h icon.h mangle.h misc.h status.h switch.h \
-- uam_auth.h uid.h unix.h volume.h
-+ uam_auth.h uid.h unix.h volume.h \
-+ afp_zeroconf.h afp_avahi.h afp_bonjour.h afp_howl.h
-
--LIBS = @LIBS@ @PAM_LIBS@ @QUOTA_LIBS@ @SLP_LIBS@ @WRAP_LIBS@
-+LIBS = @LIBS@ @PAM_LIBS@ @QUOTA_LIBS@ @SLP_LIBS@ @ZEROCONF_LIBS@ @WRAP_LIBS@
-
- CFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/sys \
-- @CFLAGS@ @SLP_CFLAGS@ \
-+ @CFLAGS@ @SLP_CFLAGS@ @ZEROCONF_CFLAGS@ \
- -D_PATH_AFPDDEFVOL=\"$(pkgconfdir)/AppleVolumes.default\" \
- -D_PATH_AFPDSYSVOL=\"$(pkgconfdir)/AppleVolumes.system\" \
- -D_PATH_AFPDPWFILE=\"$(pkgconfdir)/afppasswd\" \
-Index: etc/afpd/afp_config.c
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/etc/afpd/afp_config.c,v
-retrieving revision 1.23
-diff -u -r1.23 afp_config.c
---- etc/afpd/afp_config.c 28 Apr 2005 20:49:39 -0000 1.23
-+++ etc/afpd/afp_config.c 5 May 2006 10:46:35 -0000
-@@ -50,6 +50,9 @@
- #ifdef USE_SRVLOC
- #include <slp.h>
- #endif /* USE_SRVLOC */
-+#ifdef USE_ZEROCONF
-+#include "afp_zeroconf.h"
-+#endif /* USE_ZEROCONF */
-
- #include "globals.h"
- #include "afp_config.h"
-@@ -154,9 +157,9 @@
- }
- #endif /* USE_SRVLOC */
-
--#ifdef USE_SRVLOC
- static void dsi_cleanup(const AFPConfig *config)
- {
-+#ifdef USE_SRVLOC
- SLPError err;
- SLPError callbackerr;
- SLPHandle hslp;
-@@ -189,8 +192,16 @@
- srvloc_dereg_err:
- dsi->srvloc_url[0] = '\0';
- SLPClose(hslp);
--}
-+#elif defined (USE_ZEROCONF)
-+ DSI *dsi = (DSI *)config->obj.handle;
-+
-+ /* Do nothing if we didn't register. */
-+ if (!dsi || dsi->zeroconf_registered == 0)
-+ return;
-+
-+ zeroconf_deregister();
- #endif /* USE_SRVLOC */
-+}
-
- #ifndef NO_DDP
- static void asp_cleanup(const AFPConfig *config)
-@@ -355,6 +366,10 @@
- struct servent *afpovertcp;
- int afp_port = 548;
- char *srvloc_hostname, *hostname;
-+#elif defined (USE_ZEROCONF)
-+ struct servent *afpovertcp;
-+ int afp_port = 548;
-+ char *hostname = NULL;
- #endif /* USE_SRVLOC */
-
- if ((config = (AFPConfig *) calloc(1, sizeof(AFPConfig))) == NULL) {
-@@ -449,6 +464,36 @@
- }
- #endif /* USE_SRVLOC */
-
-+#ifdef USE_ZEROCONF
-+ dsi->zeroconf_registered = 0; /* Mark that we haven't registered. */
-+
-+ if (!(options->flags & OPTION_NOZEROCONF)) {
-+ /* XXX We don't want to tack on the port number if we don't have to.
-+ * Why?
-+ * Well, this seems to break MacOS < 10. If the user _really_ wants to
-+ * use a non-default port, they can, but be aware, this server might
-+ * not show up int the Network Browser.
-+ */
-+ afpovertcp = getservbyname("afpovertcp", "tcp");
-+ if (afpovertcp != NULL) {
-+ afp_port = ntohs(afpovertcp->s_port);
-+ }
-+
-+ /* If specified use the FQDN to register with srvloc, otherwise use IP. */
-+ p = NULL;
-+ if (options->fqdn) {
-+ hostname = options->fqdn;
-+ p = strchr(hostname, ':');
-+ }
-+ else
-+ hostname = inet_ntoa(dsi->server.sin_addr);
-+
-+ if (!(options->flags & OPTION_NOSLP)) {
-+ zeroconf_register(afp_port, hostname);
-+ dsi->zeroconf_registered = 1; /* Mark that we have registered. */
-+ }
-+ }
-+#endif /* USE_ZEROCONF */
-
- config->fd = dsi->serversock;
- config->obj.handle = dsi;
-@@ -469,6 +514,9 @@
- #ifdef USE_SRVLOC
- config->server_cleanup = dsi_cleanup;
- #endif
-+#ifdef USE_ZEROCONF
-+ config->server_cleanup = dsi_cleanup;
-+#endif
- return config;
- }
-
-Index: etc/afpd/afp_options.c
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/etc/afpd/afp_options.c,v
-retrieving revision 1.35
-diff -u -r1.35 afp_options.c
---- etc/afpd/afp_options.c 28 Apr 2005 20:49:39 -0000 1.35
-+++ etc/afpd/afp_options.c 5 May 2006 10:46:39 -0000
-@@ -202,10 +202,15 @@
- /* parse toggles */
- if (strstr(buf, " -nodebug"))
- options->flags &= ~OPTION_DEBUG;
-+
- #ifdef USE_SRVLOC
- if (strstr(buf, " -noslp"))
- options->flags |= OPTION_NOSLP;
- #endif /* USE_SRVLOC */
-+#ifdef USE_ZEROCONF
-+ if (strstr(buf, " -nozeroconf"))
-+ options->flags |= OPTION_NOZEROCONF;
-+#endif
-
- if (strstr(buf, " -nouservolfirst"))
- options->flags &= ~OPTION_USERVOLFIRST;
-@@ -578,6 +583,12 @@
- puts( "No" );
- #endif
-
-+#ifdef USE_ZEROCONF
-+ puts( "Yes" );
-+#else
-+ puts( "No" );
-+#endif
-+
- printf( " TCP wrappers support:\t" );
- #ifdef TCPWRAP
- puts( "Yes" );
-Index: etc/afpd/globals.h
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/etc/afpd/globals.h,v
-retrieving revision 1.21
-diff -u -r1.21 globals.h
---- etc/afpd/globals.h 28 Apr 2005 20:49:43 -0000 1.21
-+++ etc/afpd/globals.h 5 May 2006 10:46:39 -0000
-@@ -40,6 +40,7 @@
- #define OPTION_CUSTOMICON (1 << 4)
- #define OPTION_NOSLP (1 << 5)
- #define OPTION_ANNOUNCESSH (1 << 6)
-+#define OPTION_NOZEROCONF (1 << 7)
-
- #ifdef FORCE_UIDGID
- /* set up a structure for this */
-Index: include/atalk/dsi.h
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/include/atalk/dsi.h,v
-retrieving revision 1.6
-diff -u -r1.6 dsi.h
---- include/atalk/dsi.h 3 May 2005 14:55:12 -0000 1.6
-+++ include/atalk/dsi.h 5 May 2006 10:46:41 -0000
-@@ -85,6 +85,10 @@
- char srvloc_url[512];
- #endif
-
-+#ifdef USE_ZEROCONF
-+ int zeroconf_registered;
-+#endif
-+
- /* buffer for OSX deadlock */
- int noblocking;
- char *buffer;
-Index: macros/summary.m4
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/macros/summary.m4,v
-retrieving revision 1.2
-diff -u -r1.2 summary.m4
---- macros/summary.m4 28 Apr 2005 20:50:05 -0000 1.2
-+++ macros/summary.m4 5 May 2006 10:46:46 -0000
-@@ -44,6 +44,7 @@
- AC_MSG_RESULT([ Options:])
- AC_MSG_RESULT([ CUPS support: $netatalk_cv_use_cups])
- AC_MSG_RESULT([ SLP support: $netatalk_cv_srvloc])
-+ AC_MSG_RESULT([ Zeroconf support: $netatalk_cv_zeroconf])
- AC_MSG_RESULT([ tcp wrapper support: $netatalk_cv_tcpwrap])
- dnl if test x"$netatalk_cv_linux_sendfile" != x; then
- dnl AC_MSG_RESULT([ Linux sendfile support: $netatalk_cv_linux_sendfile])
-Index: man/man5/afpd.conf.5.tmpl
-===================================================================
-RCS file: /cvsroot/netatalk/netatalk/man/man5/afpd.conf.5.tmpl,v
-retrieving revision 1.4
-diff -u -r1.4 afpd.conf.5.tmpl
---- man/man5/afpd.conf.5.tmpl 28 Apr 2005 20:50:06 -0000 1.4
-+++ man/man5/afpd.conf.5.tmpl 5 May 2006 10:46:48 -0000
-@@ -210,6 +210,9 @@
- Protocol (if SLP support was compiled in). This is useful if you are
- running multiple servers and want one to be hidden, perhaps because
- it is advertised elsewhere, ie. by a SLP Directory Agent.
-+\-noslp
-+Do not register this server using the Multicast DNS
-+Protocol (if Zeroconf support was compiled in).
- .SH "MISCELLANEOUS OPTIONS"
- .TP
- \-admingroup \fI[group]\fR
---- etc/afpd/afp_avahi.c.org 2006-04-21 10:29:22.000000000 +0200
-+++ etc/afpd/afp_avahi.c 2006-04-22 08:34:34.000000000 +0200
-@@ -0,0 +1,500 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Avahi based Zeroconf support
-+ * Docs: http://avahi.org/download/doxygen/
-+ *
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#ifdef HAVE_AVAHI
-+
-+#include "afp_avahi.h"
-+
-+static void publish_reply(AvahiEntryGroup *g,
-+ AvahiEntryGroupState state,
-+ void *userdata);
-+
-+/*
-+ * This function tries to register the AFP DNS
-+ * SRV service type.
-+ */
-+static void register_stuff(struct context *ctx) {
-+ char r[128];
-+ int ret;
-+
-+ assert(ctx->client);
-+
-+ if (!ctx->group) {
-+
-+ if (!(ctx->group = avahi_entry_group_new(ctx->client,
-+ publish_reply,
-+ ctx))) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to create entry group: %s\n",
-+ avahi_strerror(avahi_client_errno(ctx->client)));
-+ goto fail;
-+ }
-+
-+ }
-+
-+ LOG(log_info, logtype_afpd, "Adding service '%s'\n", ctx->name);
-+
-+ if (avahi_entry_group_is_empty(ctx->group)) {
-+ /* Register our service */
-+
-+ if (avahi_entry_group_add_service(ctx->group,
-+ AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ 0,
-+ ctx->name,
-+ AFP_DNS_SERVICE_TYPE,
-+ NULL,
-+ NULL,
-+ ctx->port,
-+ NULL) < 0) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to add service: %s\n",
-+ avahi_strerror(avahi_client_errno(ctx->client)));
-+ goto fail;
-+ }
-+
-+ if (avahi_entry_group_commit(ctx->group) < 0) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to commit entry group: %s\n",
-+ avahi_strerror(avahi_client_errno(ctx->client)));
-+ goto fail;
-+ }
-+ }
-+
-+ return;
-+
-+ fail:
-+ avahi_client_free (ctx->client);
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ avahi_simple_poll_quit(ctx->simple_poll);
-+#else
-+ avahi_threaded_poll_quit(ctx->threaded_poll);
-+#endif
-+}
-+
-+/* Called when publishing of service data completes */
-+static void publish_reply(AvahiEntryGroup *g,
-+ AvahiEntryGroupState state,
-+ AVAHI_GCC_UNUSED void *userdata)
-+{
-+ struct context *ctx = userdata;
-+
-+ assert(g == ctx->group);
-+
-+ switch (state) {
-+
-+ case AVAHI_ENTRY_GROUP_ESTABLISHED :
-+ /* The entry group has been established successfully */
-+ break;
-+
-+ case AVAHI_ENTRY_GROUP_COLLISION: {
-+ char *n;
-+
-+ /* Pick a new name for our service */
-+
-+ n = avahi_alternative_service_name(ctx->name);
-+ assert(n);
-+
-+ avahi_free(ctx->name);
-+ ctx->name = n;
-+
-+ register_stuff(ctx);
-+ break;
-+ }
-+
-+ case AVAHI_ENTRY_GROUP_FAILURE: {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to register service: %s\n",
-+ avahi_strerror(avahi_client_errno(ctx->client)));
-+ avahi_client_free (avahi_entry_group_get_client(g));
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ avahi_simple_poll_quit(ctx->simple_poll);
-+#else
-+ avahi_threaded_poll_quit(ctx->threaded_poll);
-+#endif
-+ break;
-+ }
-+
-+ case AVAHI_ENTRY_GROUP_UNCOMMITED:
-+ case AVAHI_ENTRY_GROUP_REGISTERING:
-+ ;
-+ }
-+}
-+
-+static void client_callback(AvahiClient *client,
-+ AvahiClientState state,
-+ void *userdata)
-+{
-+ struct context *ctx = userdata;
-+
-+ ctx->client = client;
-+
-+ switch (state) {
-+
-+ case AVAHI_CLIENT_S_RUNNING:
-+
-+ /* The server has startup successfully and registered its host
-+ * name on the network, so it's time to create our services */
-+ if (!ctx->group)
-+ register_stuff(ctx);
-+ break;
-+
-+ case AVAHI_CLIENT_S_COLLISION:
-+
-+ if (ctx->group)
-+ avahi_entry_group_reset(ctx->group);
-+ break;
-+
-+ case AVAHI_CLIENT_FAILURE: {
-+
-+ if (avahi_client_errno(client) == AVAHI_ERR_DISCONNECTED) {
-+ int error;
-+
-+ avahi_client_free(ctx->client);
-+ ctx->client = NULL;
-+ ctx->group = NULL;
-+
-+ /* Reconnect to the server */
-+
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ if (!(ctx->client = avahi_client_new(avahi_simple_poll_get(ctx->simple_poll),
-+#else
-+ if (!(ctx->client = avahi_client_new(avahi_threaded_poll_get(ctx->threaded_poll),
-+#endif
-+ AVAHI_CLIENT_NO_FAIL,
-+ client_callback,
-+ ctx,
-+ &error))) {
-+
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to contact server: %s\n",
-+ avahi_strerror(error));
-+
-+ avahi_client_free (ctx->client);
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ avahi_simple_poll_quit(ctx->simple_poll);
-+#else
-+ avahi_threaded_poll_quit(ctx->threaded_poll);
-+#endif
-+ }
-+
-+ } else {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Client failure: %s\n",
-+ avahi_strerror(avahi_client_errno(client)));
-+
-+ avahi_client_free (ctx->client);
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ avahi_simple_poll_quit(ctx->simple_poll);
-+#else
-+ avahi_threaded_poll_quit(ctx->threaded_poll);
-+#endif
-+ }
-+
-+ break;
-+ }
-+
-+ case AVAHI_CLIENT_S_REGISTERING:
-+ case AVAHI_CLIENT_CONNECTING:
-+ ;
-+ }
-+}
-+
-+static void* thread(void *userdata) {
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ struct context *ctx = userdata;
-+ sigset_t mask;
-+ int r;
-+
-+ /* Make sure that signals are delivered to the main thread */
-+ sigfillset(&mask);
-+ pthread_sigmask(SIG_BLOCK, &mask, NULL);
-+
-+ pthread_mutex_lock(&ctx->mutex);
-+
-+ /* Run the main loop */
-+ LOG(log_info, logtype_afpd, "Starting avahi loop...");
-+ r = avahi_simple_poll_loop(ctx->simple_poll);
-+
-+ /* Cleanup some stuff */
-+ if (ctx->client)
-+ avahi_client_free(ctx->client);
-+ ctx->client = NULL;
-+ ctx->group = NULL;
-+
-+ pthread_mutex_unlock(&ctx->mutex);
-+#endif
-+ return NULL;
-+}
-+
-+static int poll_func(struct pollfd *ufds,
-+ unsigned int nfds,
-+ int timeout,
-+ void *userdata) {
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ pthread_mutex_t *mutex = userdata;
-+ int r;
-+
-+ /* Before entering poll() we unlock the mutex, so that
-+ * avahi_simple_poll_quit() can succeed from another thread. */
-+
-+ pthread_mutex_unlock(mutex);
-+ r = poll(ufds, nfds, timeout);
-+ pthread_mutex_lock(mutex);
-+
-+ return r;
-+#else
-+ return 0;
-+#endif
-+}
-+
-+/*
-+ * Tries to setup the Zeroconf thread and any
-+ * neccessary config setting.
-+ */
-+void* av_zeroconf_setup(unsigned long port, const char *name) {
-+ struct context *ctx = NULL;
-+
-+ /* default service name, if there's none in
-+ * the config file.
-+ */
-+ char service[256] = "AFP Server on ";
-+ int error, ret;
-+
-+ /* initialize the struct that holds our
-+ * config settings.
-+ */
-+ ctx = malloc(sizeof(struct context));
-+ assert(ctx);
-+ ctx->client = NULL;
-+ ctx->group = NULL;
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ ctx->simple_poll = NULL;
-+ pthread_mutex_init(&ctx->mutex, NULL);
-+#else
-+ ctx->threaded_poll = NULL;
-+#endif
-+ ctx->thread_running = 0;
-+
-+ LOG(log_info,
-+ logtype_afpd,
-+ "Setting port for Zeroconf service to: %i.\n",
-+ port);
-+ ctx->port = port;
-+
-+ /* Prepare service name */
-+ if (!name) {
-+ LOG(log_info,
-+ logtype_afpd,
-+ "Assigning default service name.\n");
-+ gethostname(service+14, sizeof(service)-15);
-+ service[sizeof(service)-1] = 0;
-+
-+ ctx->name = strdup(service);
-+ }
-+ else {
-+ ctx->name = strdup(name);
-+ }
-+
-+ assert(ctx->name);
-+
-+/* first of all we need to initialize our threading env */
-+#ifdef HAVE_AVAHI_THREADED_POLL
-+ if (!(ctx->threaded_poll = avahi_threaded_poll_new())) {
-+ goto fail;
-+ }
-+#else
-+ if (!(ctx->simple_poll = avahi_simple_poll_new())) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to create event loop object.\n");
-+ goto fail;
-+ }
-+
-+ avahi_simple_poll_set_func(ctx->simple_poll, poll_func, &ctx->mutex);
-+#endif
-+
-+/* now we need to acquire a client */
-+#ifdef HAVE_AVAHI_THREADED_POLL
-+ if (!(ctx->client = avahi_client_new(avahi_threaded_poll_get(ctx->threaded_poll),
-+ AVAHI_CLIENT_NO_FAIL,
-+ client_callback,
-+ ctx,
-+ &error))) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to create client object: %s\n",
-+ avahi_strerror(avahi_client_errno(ctx->client)));
-+ goto fail;
-+ }
-+#else
-+ if (!(ctx->client = avahi_client_new(avahi_simple_poll_get(ctx->simple_poll),
-+ AVAHI_CLIENT_NO_FAIL,
-+ client_callback,
-+ ctx,
-+ &error))) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to create client object: %s\n",
-+ avahi_strerror(avahi_client_errno(ctx->client)));
-+ goto fail;
-+ }
-+#endif
-+
-+ return ctx;
-+
-+fail:
-+
-+ if (ctx)
-+ av_zeroconf_unregister(ctx);
-+
-+ return NULL;
-+}
-+
-+/*
-+ * This function finally runs the loop impl.
-+ */
-+int av_zeroconf_run(void *u) {
-+ struct context *ctx = u;
-+ int ret;
-+
-+#ifdef HAVE_AVAHI_THREADED_POLL
-+ /* Finally, start the event loop thread */
-+ if (avahi_threaded_poll_start(ctx->threaded_poll) < 0) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to create thread: %s\n",
-+ avahi_strerror(avahi_client_errno(ctx->client)));
-+ goto fail;
-+ } else {
-+ LOG(log_info, logtype_afpd, "Successfully started avahi loop.\n");
-+ }
-+#else
-+ /* Create the mDNS event handler */
-+ if ((ret = pthread_create(&ctx->thread_id, NULL, thread, ctx)) < 0) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Failed to create thread: %s\n", strerror(ret));
-+ goto fail;
-+ } else {
-+ LOG(log_info, logtype_afpd, "Successfully started avahi loop.\n");
-+ }
-+#endif
-+
-+ ctx->thread_running = 1;
-+
-+ return 0;
-+
-+fail:
-+
-+ if (ctx)
-+ av_zeroconf_unregister(ctx);
-+
-+ return -1;
-+}
-+
-+/*
-+ * Used to lock access to the loop.
-+ * Currently unused.
-+ */
-+void av_zeroconf_lock(void *u) {
-+#ifdef HAVE_AVAHI_THREADED_POLL
-+ struct context *ctx = u;
-+
-+ avahi_threaded_poll_lock(ctx->threaded_poll);
-+#endif
-+}
-+
-+/*
-+ * Used to unlock access to the loop.
-+ * Currently unused.
-+ */
-+void av_zeroconf_unlock(void *u) {
-+#ifdef HAVE_AVAHI_THREADED_POLL
-+ struct context *ctx = u;
-+
-+ avahi_threaded_poll_unlock(ctx->threaded_poll);
-+#endif
-+}
-+
-+/*
-+ * Tries to shutdown this loop impl.
-+ * Call this function from outside this thread.
-+ */
-+void av_zeroconf_shutdown(void *u) {
-+ struct context *ctx = u;
-+
-+ /* Call this when the app shuts down */
-+#ifdef HAVE_AVAHI_THREADED_POLL
-+ avahi_threaded_poll_stop(ctx->threaded_poll);
-+ avahi_free(ctx->name);
-+ avahi_client_free(ctx->client);
-+ avahi_threaded_poll_free(ctx->threaded_poll);
-+#else
-+ av_zeroconf_unregister(ctx);
-+#endif
-+}
-+
-+/*
-+ * Tries to shutdown this loop impl.
-+ * Call this function from inside this thread.
-+ */
-+int av_zeroconf_unregister(void *u) {
-+ struct context *ctx = u;
-+
-+ if (ctx->thread_running) {
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ pthread_mutex_lock(&ctx->mutex);
-+ avahi_simple_poll_quit(ctx->simple_poll);
-+ pthread_mutex_unlock(&ctx->mutex);
-+
-+ pthread_join(ctx->thread_id, NULL);
-+#else
-+ /* First, block the event loop */
-+ avahi_threaded_poll_lock(ctx->threaded_poll);
-+
-+ /* Than, do your stuff */
-+ avahi_threaded_poll_quit(ctx->threaded_poll);
-+
-+ /* Finally, unblock the event loop */
-+ avahi_threaded_poll_unlock(ctx->threaded_poll);
-+#endif
-+ ctx->thread_running = 0;
-+ }
-+
-+ avahi_free(ctx->name);
-+
-+ if (ctx->client)
-+ avahi_client_free(ctx->client);
-+
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ if (ctx->simple_poll)
-+ avahi_simple_poll_free(ctx->simple_poll);
-+
-+ pthread_mutex_destroy(&ctx->mutex);
-+#else
-+ if (ctx->threaded_poll)
-+ avahi_threaded_poll_free(ctx->threaded_poll);
-+#endif
-+
-+ free(ctx);
-+
-+ return 0;
-+}
-+
-+#endif /* USE_AVAHI */
---- etc/afpd/afp_avahi.h.org 2006-04-21 10:29:23.000000000 +0200
-+++ etc/afpd/afp_avahi.h 2006-04-22 07:40:05.000000000 +0200
-@@ -0,0 +1,58 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Avahi based Zeroconf support
-+ * Docs: http://avahi.org/download/doxygen/
-+ *
-+ */
-+
-+#ifndef AFPD_AVAHI_H
-+#define AFPD_AVAHI_H
-+
-+#include <stdlib.h>
-+#include <assert.h>
-+#include <string.h>
-+
-+#include <avahi-client/client.h>
-+#include <avahi-client/publish.h>
-+
-+#include <avahi-common/alternative.h>
-+
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+#include <avahi-common/simple-watch.h>
-+#include <signal.h> /* SIG_BLOCK */
-+#else
-+#include <avahi-common/thread-watch.h>
-+#endif
-+
-+#include <avahi-common/malloc.h>
-+#include <avahi-common/error.h>
-+
-+#include <atalk/logger.h>
-+
-+#define AFP_DNS_SERVICE_TYPE "_afpovertcp._tcp"
-+
-+struct context {
-+ int thread_running;
-+ pthread_t thread_id;
-+ pthread_mutex_t mutex;
-+ char *name;
-+#ifndef HAVE_AVAHI_THREADED_POLL
-+ AvahiSimplePoll *simple_poll;
-+#else
-+ AvahiThreadedPoll *threaded_poll;
-+#endif
-+ AvahiClient *client;
-+ AvahiEntryGroup *group;
-+ unsigned long port;
-+};
-+
-+/* prototype definitions */
-+void* av_zeroconf_setup(unsigned long, const char *);
-+int av_zeroconf_run(void*);
-+int av_zeroconf_unregister(void*);
-+void av_zeroconf_shutdown(void*);
-+void av_zeroconf_lock(void *);
-+void av_zeroconf_unlock(void *);
-+
-+#endif /* AFPD_AVAHI_H */
---- etc/afpd/afp_bonjour.h.org 2006-04-21 10:29:30.000000000 +0200
-+++ etc/afpd/afp_bonjour.h 2006-04-21 07:37:05.000000000 +0200
-@@ -0,0 +1,27 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Bonjour based Zeroconf support
-+ * Docs: http://developer.apple.com/documentation/Networking/Reference/DNSServiceDiscovery_CRef/dns_sd/
-+ *
-+ */
-+
-+#ifndef AFPD_BONJOUR_H
-+#define AFPD_BONJOUR_H
-+
-+#include <stdlib.h>
-+#include <assert.h>
-+#include <string.h>
-+
-+#include <dns_sd.h> /* DNSServiceRegister(), DNSServiceDiscoveryDeallocate() */
-+
-+#include <atalk/logger.h>
-+
-+#define AFP_DNS_SERVICE_TYPE "_afpovertcp._tcp"
-+
-+/* prototype definitions */
-+void* bo_zeroconf_setup(unsigned long, const char *);
-+int bo_zeroconf_unregister(void);
-+int bo_zeroconf_run(void);
-+
-+#endif /* AFPD_BONJOUR_H */
---- etc/afpd/afp_bonjour.c.org 2006-04-21 10:29:28.000000000 +0200
-+++ etc/afpd/afp_bonjour.c 2006-04-21 09:45:13.000000000 +0200
-@@ -0,0 +1,112 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Bonjour based Zeroconf support
-+ * Docs: http://developer.apple.com/documentation/Networking/Reference/DNSServiceDiscovery_CRef/dns_sd/
-+ *
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#ifdef HAVE_BONJOUR
-+
-+#include "afp_bonjour.h"
-+
-+DNSServiceRef publish_session = NULL;
-+
-+static void DNSSD_API
-+publish_reply(DNSServiceRef,
-+ const DNSServiceFlags,
-+ DNSServiceErrorType,
-+ const char *,
-+ const char *,
-+ const char *,
-+ void *);
-+
-+static void DNSSD_API
-+publish_reply (DNSServiceRef sdRef,
-+ const DNSServiceFlags flags,
-+ DNSServiceErrorType errorCode,
-+ const char *name,
-+ const char *regtype,
-+ const char *domain,
-+ void *context)
-+{
-+}
-+
-+void* bo_zeroconf_setup(unsigned long port, const char *name) {
-+ DNSServiceErrorType err;
-+ char service[256] = "AFP Server on ";
-+
-+ /* Prepare service name */
-+ if (!name) {
-+ LOG(log_info, logtype_afpd,, "Assigning default service name.\n");
-+ gethostname(service+14, sizeof(service)-15);
-+ service[sizeof(service)-1] = 0;
-+
-+ name = strdup(service);
-+ }
-+
-+ assert(name);
-+ assert(port);
-+
-+ err = DNSServiceRegister (&publish_session,
-+ 0, /* flags */
-+ 0, /* interface; 0 for all */
-+ name, /* name */
-+ AFP_DNS_SERVICE_TYPE, /* type */
-+ NULL, /* domain */
-+ NULL, /* hostname */
-+ htons (port), /* port in network byte order */
-+ 0, /* text record length */
-+ NULL, /* text record */
-+ publish_reply, /* callback */
-+ NULL); /* context */
-+
-+ if (err == kDNSServiceErr_NoError) {
-+ LOG(log_info, logtype_afpd, "Adding service '%s'\n", name);
-+ } else {
-+ LOG(log_error, logtype_afpd, "Adding service '%s' failed\n", name);
-+ bo_zeroconf_unregister();
-+ }
-+}
-+
-+int bo_zeroconf_run(void) {
-+ fd_set set;
-+ int fd;
-+ struct timeval timeout;
-+
-+ /* Initialize the file descriptor set. */
-+ FD_ZERO (&set);
-+ FD_SET (fd, &set);
-+
-+ /* Initialize the timeout data structure. */
-+ /* TODO: Should the value for sec be configurable? */
-+ timeout.tv_sec = 10;
-+ timeout.tv_usec = 0;
-+
-+ if (publish_session != NULL) {
-+ fd = DNSServiceRefSockFD(publish_session);
-+
-+ if (select(FD_SETSIZE,
-+ &set, NULL, NULL,
-+ &timeout) > 0) {
-+ DNSServiceProcessResult(publish_session);
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+int bo_zeroconf_unregister(void) {
-+ if (publish_session != NULL) {
-+ DNSServiceRefDeallocate(publish_session);
-+ publish_session = NULL;
-+ }
-+
-+ return 0;
-+}
-+
-+#endif /* HAVE_BONJOUR */
---- etc/afpd/afp_howl.c.org 2006-04-21 10:29:34.000000000 +0200
-+++ etc/afpd/afp_howl.c 2006-04-21 09:46:11.000000000 +0200
-@@ -0,0 +1,92 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Howl based Zeroconf support
-+ * Doc: http://www.porchdogsoft.com/products/howl/docs/
-+ *
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#ifdef HAVE_HOWL
-+
-+#include "afp_howl.h"
-+
-+sw_discovery discovery = NULL;
-+
-+static sw_result HOWL_API publish_reply(sw_discovery,
-+ sw_discovery_oid,
-+ sw_discovery_publish_status,
-+ sw_opaque);
-+
-+static sw_result HOWL_API publish_reply(sw_discovery discovery,
-+ sw_discovery_oid oid,
-+ sw_discovery_publish_status status,
-+ sw_opaque extra) {
-+ static sw_string
-+ status_text[] =
-+ {
-+ "Started",
-+ "Stopped",
-+ "Name Collision",
-+ "Invalid"
-+ };
-+
-+ LOG(log_info, logtype_afpd, "publish reply: %s\n", status_text[status]);
-+ return SW_OKAY;
-+}
-+
-+void* ho_zeroconf_setup(unsigned long port, const char *name) {
-+ sw_result result;
-+ sw_discovery_publish_id id;
-+ char service[256] = "AFP Server on ";
-+
-+ if (sw_discovery_init (&discovery) != SW_OKAY) {
-+ LOG(log_error,
-+ logtype_afpd,
-+ "AFPD could not be started. \nTry running mDNSResponder.");
-+ return;
-+ }
-+
-+ /* Prepare service name */
-+ if (!name) {
-+ LOG(log_info, logtype_afpd, "Assigning default service name.\n");
-+ gethostname(service+14, sizeof(service)-15);
-+ service[sizeof(service)-1] = 0;
-+
-+ name = strdup(service);
-+ }
-+
-+ assert(name);
-+
-+ if (!(result = sw_discovery_publish (discovery,
-+ 0,
-+ name,
-+ AFP_DNS_SERVICE_TYPE,
-+ NULL,
-+ NULL,
-+ port,
-+ NULL,
-+ 0,
-+ publish_reply,
-+ NULL,
-+ &id)) != SW_OKAY) {
-+ LOG(log_info, logtype_afpd, "Adding service '%s'\n", name);
-+ } else {
-+ LOG(log_error, logtype_afpd, "Adding service '%s' failed\n", name);
-+ ho_zeroconf_unregister();
-+ }
-+}
-+
-+void* ho_zeroconf_run(void) {
-+ sw_discovery_run(discovery);
-+}
-+
-+void* ho_zeroconf_unregister(void) {
-+ sw_discovery_stop_run(discovery);
-+ sw_discovery_fina(discovery);
-+}
-+
-+#endif /* USE_HOWL */
---- etc/afpd/afp_howl.h.org 2006-04-21 10:29:33.000000000 +0200
-+++ etc/afpd/afp_howl.h 2006-04-21 07:37:11.000000000 +0200
-@@ -0,0 +1,27 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Howl based Zeroconf support
-+ * Doc: http://www.porchdogsoft.com/products/howl/docs/
-+ *
-+ */
-+
-+#ifndef AFPD_HOWL_H
-+#define AFPD_HOWL_H
-+
-+#include <stdlib.h>
-+#include <assert.h>
-+#include <string.h>
-+
-+#include <howl.h>
-+
-+#include <atalk/logger.h>
-+
-+#define NTP_DNS_SERVICE_TYPE "_afpovertcp._tcp"
-+
-+/* prototype definitions */
-+void* ho_zeroconf_setup(unsigned long, const char *);
-+void* ho_zeroconf_unregister(void);
-+void* ho_zeroconf_run(void);
-+
-+#endif /* AFPD_HOWL_H */
---- etc/afpd/afp_zeroconf.h.org 2006-04-21 10:29:39.000000000 +0200
-+++ etc/afpd/afp_zeroconf.h 2006-04-21 11:39:20.000000000 +0200
-@@ -0,0 +1,40 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Zeroconf facade, that abstracts access to a
-+ * particular Zeroconf implementation
-+ * Doc: http://www.dns-sd.org/
-+ *
-+ */
-+
-+#ifndef AFPD_ZEROCONF_H
-+#define AFPD_ZEROCONF_H
-+
-+#include <netinet/in.h> /* htons() */
-+#include <atalk/logger.h>
-+
-+# ifdef HAVE_BONJOUR
-+# include "afp_bonjour.h"
-+# elif defined (HAVE_HOWL)
-+# include "afp_howl.h"
-+# elif defined (HAVE_AVAHI)
-+# include "afp_avahi.h"
-+# endif
-+
-+#define AFP_PORT 548
-+
-+/*
-+ * Prototype Definitions
-+ */
-+
-+/*
-+ * registers the ntpd service with a particular Zerconf implemenation.
-+ */
-+void zeroconf_register(int port, char *hostname);
-+
-+/*
-+ * de-registers the ntpd service with a particular Zerconf implemenation.
-+ */
-+void zeroconf_deregister(void);
-+
-+#endif AFPD_ZEROCONF_H
---- etc/afpd/afp_zeroconf.c.org 2006-04-21 10:29:38.000000000 +0200
-+++ etc/afpd/afp_zeroconf.c 2006-04-21 13:12:38.000000000 +0200
-@@ -0,0 +1,97 @@
-+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
-+/*
-+ * Author: Daniel S. Haischt <me@daniel.stefan.haischt.name>
-+ * Purpose: Zeroconf facade, that abstracts access to a
-+ * particular Zeroconf implementation
-+ * Doc: http://www.dns-sd.org/
-+ *
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#include "afp_zeroconf.h"
-+
-+/*
-+ * Global Definitions
-+ */
-+#ifdef HAVE_AVAHI
-+struct context *ctx = NULL;
-+#endif
-+
-+/*
-+ * Functions (actually they are just facades)
-+ */
-+void zeroconf_register(int port, char *hostname)
-+{
-+#ifdef HAVE_BONJOUR
-+ LOG(log_info,
-+ logtype_afpd,
-+ "Attempting to register with mDNS using Apple's Bonjour\n");
-+ if (hostname && strlen(hostname) > 0 && port)
-+ {
-+ bo_zeroconf_setup(port, hostname);
-+ }
-+ else if (hostname && strlen(hostname) > 0)
-+ {
-+ bo_zeroconf_setup(AFP_PORT, hostname);
-+ }
-+ else
-+ {
-+ bo_zeroconf_setup(AFP_PORT, NULL);
-+ }
-+ bo_zeroconf_run();
-+#elif defined (HAVE_HOWL)
-+ LOG(log_info,
-+ logtype_afpd,
-+ "Attempting to register with mDNS using Porchdog's Howl\n");
-+ if (hostname && strlen(hostname) > 0 && port)
-+ {
-+ ho_zeroconf_setup(port, hostname);
-+ }
-+ else if (hostname && strlen(hostname) > 0)
-+ {
-+ ho_zeroconf_setup(AFP_PORT, hostname);
-+ }
-+ else
-+ {
-+ ho_zeroconf_setup(AFP_PORT, NULL);
-+ }
-+ bo_zeroconf_run();
-+#elif defined (HAVE_AVAHI)
-+ LOG(log_info, logtype_afpd, "Attempting to register with mDNS using Avahi\n");
-+ if (hostname && strlen(hostname) > 0 && port)
-+ {
-+ ctx = av_zeroconf_setup(port, hostname);
-+ }
-+ else if (hostname && strlen(hostname) > 0)
-+ {
-+ ctx = av_zeroconf_setup(AFP_PORT, hostname);
-+ }
-+ else
-+ {
-+ ctx = av_zeroconf_setup(AFP_PORT, NULL);
-+ }
-+ av_zeroconf_run(ctx);
-+#endif
-+}
-+
-+void zeroconf_deregister(void)
-+{
-+#ifdef HAVE_BONJOUR
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Attempting to de-register mDNS using Apple's Bonjour\n");
-+ bo_zeroconf_unregister();
-+#elif defined (HAVE_HOWL)
-+ LOG(log_error,
-+ logtype_afpd,
-+ "Attempting to de-register mDNS using Porchdog's Howl\n");
-+ ho_zeroconf_unregister();
-+#elif defined (HAVE_AVAHI)
-+ LOG(log_error, logtype_afpd, "Attempting to de-register mDNS using Avahi\n");
-+ if (ctx)
-+ av_zeroconf_shutdown(ctx);
-+#endif
-+}
---- macros/zeroconf.m4.org 2006-04-21 10:29:51.000000000 +0200
-+++ macros/zeroconf.m4 2006-04-22 07:26:56.000000000 +0200
-@@ -0,0 +1,101 @@
-+dnl Check for optional Zeroconf support
-+
-+dnl $Id$
-+
-+AC_DEFUN([NETATALK_ZEROCONF], [
-+
-+ ZEROCONF_LIBS=""
-+ ZEROCONF_CFLAGS=""
-+ found_zeroconf=no
-+ zeroconf_dir=""
-+
-+ AC_ARG_ENABLE(zeroconf,
-+ [ --enable-zeroconf[[=DIR]] enable Zeroconf support [[auto]]],
-+ [zeroconf=$enableval],
-+ [zeroconf=try]
-+ )
-+
-+ dnl make sure atalk_libname is defined beforehand
-+ [[ -n "$atalk_libname" ]] || AC_MSG_ERROR([internal error, atalk_libname undefined])
-+
-+ if test "x$zeroconf" != "xno"; then
-+
-+ savedcppflags="$CPPFLAGS"
-+ savedldflags="$LDFLAGS"
-+
-+ if test "x$zeroconf" = "xyes" -o "x$zeroconf" = "xtry"; then
-+ zeroconf_dir="/usr"
-+ else
-+ zeroconf_dir="$zeroconf"
-+ fi
-+
-+ # mDNS support using Apple's Bonjour
-+ AC_CHECK_HEADER(dns_sd.h,
-+ [AC_CHECK_LIB(dns_sd,
-+ DNSServiceRegister,
-+ [AC_DEFINE(USE_ZEROCONF, 1,
-+ [Use DNS-SD registration])])])
-+ case "$ac_cv_lib_dns_sd_DNSServiceRegister" in
-+ yes)
-+ ZEROCONF_LIBS="-L$zeroconf_dir/lib -ldns_sd"
-+ ZEROCONF_LIBS="-I$zeroconf_dir/include"
-+ AC_DEFINE(HAVE_BONJOUR, 1, [Use Bonjour/DNS-SD registration])
-+ found_zeroconf=yes
-+ ;;
-+ esac
-+ # mDNS support using Porchdog's Howl
-+ AC_CHECK_HEADER(howl.h,
-+ [AC_CHECK_LIB(howl,
-+ sw_discovery_publish,
-+ [AC_DEFINE(USE_ZEROCONF, 1,
-+ [Use DNS-SD registration])])])
-+ case "$ac_cv_lib_howl_sw_discovery_publish" in
-+ yes)
-+ PKG_CHECK_MODULES(HOWL, [ howl >= 1.0.0 ])
-+ ZEROCONF_LIBS="$HOWL_LIBS"
-+ ZEROCONF_CFLAGS="$HOWL_CFLAGS"
-+ AC_DEFINE(HAVE_HOWL, 1, [Use Howl/DNS-SD registration])
-+ found_zeroconf=yes
-+ ;;
-+ esac
-+ # mDNS support using Avahi
-+ AC_CHECK_HEADER(avahi-client/client.h,
-+ [AC_CHECK_LIB(avahi-client,
-+ avahi_client_new,
-+ [AC_DEFINE(USE_ZEROCONF, 1,
-+ [Use DNS-SD registration])])])
-+ case "$ac_cv_lib_avahi_client_avahi_client_new" in
-+ yes)
-+ PKG_CHECK_MODULES(AVAHI, [ avahi-client >= 0.6 ])
-+ PKG_CHECK_MODULES(AVAHI_TPOLL, [ avahi-client >= 0.6.4 ],
-+ [AC_DEFINE(HAVE_AVAHI_THREADED_POLL, 1, [Uses Avahis threaded poll implementation])],
-+ [AC_MSG_WARN(This Avahi implementation is not supporting threaded poll objects. Maybe this is not what you want.)])
-+ ZEROCONF_LIBS="$AVAHI_LIBS"
-+ ZEROCONF_CFLAGS="$AVAHI_CFLAGS"
-+ AC_DEFINE(HAVE_AVAHI, 1, [Use Avahi/DNS-SD registration])
-+ found_zeroconf=yes
-+ ;;
-+ esac
-+
-+ CPPFLAGS="$savedcppflags"
-+ LDFLAGS="$savedldflags"
-+ fi
-+
-+ netatalk_cv_zeroconf=no
-+ AC_MSG_CHECKING([whether to enable Zerconf support])
-+ if test "x$found_zeroconf" = "xyes"; then
-+ AC_MSG_RESULT([yes])
-+ AC_DEFINE(USE_ZEROCONF, 1, [Define to enable Zeroconf support])
-+ netatalk_cv_zeroconf=yes
-+ else
-+ AC_MSG_RESULT([no])
-+ if test "x$zeroconf" != "xno" -a "x$zeroconf" != "xtry"; then
-+ AC_MSG_ERROR([Zeroconf installation not found])
-+ fi
-+ fi
-+
-+ LIB_REMOVE_USR_LIB(ZEROCONF_LIBS)
-+ CFLAGS_REMOVE_USR_INCLUDE(ZEROCONF_CFLAGS)
-+ AC_SUBST(ZEROCONF_LIBS)
-+ AC_SUBST(ZEROCONF_CFLAGS)
-+])