From 431ddfdd7799818ff071909be72b8cabb4459705 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Fri, 8 Aug 2014 15:25:37 +0200 Subject: [PATCH] afpd: move mDNS service registration to netatalk process Signed-off-by: Ralph Boehme --- etc/afpd/Makefile.am | 9 +- etc/afpd/afp_config.c | 10 -- etc/afpd/main.c | 1 - etc/netatalk/Makefile.am | 6 +- etc/{afpd => netatalk}/afp_avahi.c | 122 +++++++++--------- etc/{afpd => netatalk}/afp_avahi.h | 2 - etc/{afpd => netatalk}/afp_mdns.c | 172 +++++++++++++------------- etc/{afpd => netatalk}/afp_mdns.h | 2 - etc/{afpd => netatalk}/afp_zeroconf.c | 1 - etc/{afpd => netatalk}/afp_zeroconf.h | 2 +- etc/netatalk/netatalk.c | 7 ++ 11 files changed, 155 insertions(+), 179 deletions(-) rename etc/{afpd => netatalk}/afp_avahi.c (71%) rename etc/{afpd => netatalk}/afp_avahi.h (97%) rename etc/{afpd => netatalk}/afp_mdns.c (61%) rename etc/{afpd => netatalk}/afp_mdns.h (94%) rename etc/{afpd => netatalk}/afp_zeroconf.c (97%) rename etc/{afpd => netatalk}/afp_zeroconf.h (96%) diff --git a/etc/afpd/Makefile.am b/etc/afpd/Makefile.am index 724cb52f..7d7405c3 100644 --- a/etc/afpd/Makefile.am +++ b/etc/afpd/Makefile.am @@ -9,13 +9,10 @@ DISTCLEANFILES = sbin_PROGRAMS = afpd afpd_SOURCES = \ - afp_avahi.c \ afp_config.c \ afp_dsi.c \ - afp_mdns.c \ afp_options.c \ afp_util.c \ - afp_zeroconf.c \ afprun.c \ afs.c \ appl.c \ @@ -49,12 +46,12 @@ afpd_SOURCES = \ afpd_LDADD = \ $(top_builddir)/libatalk/libatalk.la \ - @LIBGCRYPT_LIBS@ @QUOTA_LIBS@ @WRAP_LIBS@ @LIBADD_DL@ @ACL_LIBS@ @ZEROCONF_LIBS@ @PTHREAD_LIBS@ @GSSAPI_LIBS@ @KRB5_LIBS@ @MYSQL_LIBS@ + @LIBGCRYPT_LIBS@ @QUOTA_LIBS@ @WRAP_LIBS@ @LIBADD_DL@ @ACL_LIBS@ @PTHREAD_LIBS@ @GSSAPI_LIBS@ @KRB5_LIBS@ @MYSQL_LIBS@ afpd_LDFLAGS = -export-dynamic afpd_CFLAGS = \ - @ZEROCONF_CFLAGS@ @GSSAPI_CFLAGS@ @KRB5_CFLAGS@ @PTHREAD_CFLAGS@\ + @GSSAPI_CFLAGS@ @KRB5_CFLAGS@ @PTHREAD_CFLAGS@\ -DAPPLCNAME \ -DSERVERTEXT=\"$(SERVERTEXT)/\" \ -D_PATH_AFPDPWFILE=\"$(pkgconfdir)/afppasswd\" \ @@ -101,4 +98,4 @@ endif noinst_HEADERS = auth.h afp_config.h desktop.h directory.h fce_api_internal.h file.h \ filedir.h fork.h icon.h mangle.h misc.h status.h switch.h \ uam_auth.h uid.h unix.h volume.h hash.h acls.h acl_mappings.h extattrs.h \ - dircache.h afp_zeroconf.h afp_avahi.h afp_mdns.h afpstats.h afpstats_obj.h + dircache.h afpstats_obj.h diff --git a/etc/afpd/afp_config.c b/etc/afpd/afp_config.c index ba5b232b..2082a318 100644 --- a/etc/afpd/afp_config.c +++ b/etc/afpd/afp_config.c @@ -40,7 +40,6 @@ #include "uam_auth.h" #include "status.h" #include "volume.h" -#include "afp_zeroconf.h" /*! * Free and cleanup config and DSI @@ -55,9 +54,6 @@ void configfree(AFPObj *obj, DSI *dsi) if (!dsi) { /* Master afpd reloading config */ auth_unload(); - if (! (obj->options.flags & OPTION_NOZEROCONF)) { - zeroconf_deregister(); - } } unload_volumes(obj); @@ -207,12 +203,6 @@ int configinit(AFPObj *obj) acl_ldap_readconfig(obj->iniconfig); #endif /* HAVE_LDAP */ - /* Now register with zeroconf, we also need the volumes for that */ - if (! (obj->options.flags & OPTION_NOZEROCONF)) { - load_volumes(obj, lv_all); - zeroconf_register(obj); - } - if ((r = atalk_iniparser_getstring(obj->iniconfig, INISEC_GLOBAL, "fce listener", NULL))) { LOG(log_note, logtype_afpd, "Adding FCE listener: %s", r); fce_add_udp_socket(r); diff --git a/etc/afpd/main.c b/etc/afpd/main.c index e612a01c..32ed6834 100644 --- a/etc/afpd/main.c +++ b/etc/afpd/main.c @@ -37,7 +37,6 @@ #include "status.h" #include "fork.h" #include "uam_auth.h" -#include "afp_zeroconf.h" #include "afpstats.h" #define ASEV_THRESHHOLD 10 diff --git a/etc/netatalk/Makefile.am b/etc/netatalk/Makefile.am index ca3e163f..5392b9dd 100644 --- a/etc/netatalk/Makefile.am +++ b/etc/netatalk/Makefile.am @@ -4,8 +4,9 @@ pkgconfdir = @PKGCONFDIR@ sbin_PROGRAMS = netatalk -netatalk_SOURCES = netatalk.c +netatalk_SOURCES = netatalk.c afp_avahi.c afp_mdns.c afp_zeroconf.c netatalk_CFLAGS = \ + @ZEROCONF_CFLAGS@ \ -D_PATH_CONFDIR=\"$(pkgconfdir)/\" \ -D_PATH_STATEDIR='"$(localstatedir)/netatalk/"' \ -D_PATH_AFPD=\"$(sbindir)/afpd\" \ @@ -13,6 +14,7 @@ netatalk_CFLAGS = \ netatalk_LDADD = \ @MYSQL_LIBS@ \ + @ZEROCONF_LIBS@ \ $(top_builddir)/libatalk/libatalk.la netatalk_LDFLAGS = @@ -28,3 +30,5 @@ else netatalk_CFLAGS += @LIBEVENT_CFLAGS@ netatalk_LDFLAGS += @LIBEVENT_LDFLAGS@ -levent endif + +noinst_HEADERS = afp_zeroconf.h afp_avahi.h afp_mdns.h diff --git a/etc/afpd/afp_avahi.c b/etc/netatalk/afp_avahi.c similarity index 71% rename from etc/afpd/afp_avahi.c rename to etc/netatalk/afp_avahi.c index 5218d517..63bc9500 100644 --- a/etc/afpd/afp_avahi.c +++ b/etc/netatalk/afp_avahi.c @@ -45,7 +45,6 @@ static void publish_reply(AvahiEntryGroup *g, static void register_stuff(void) { uint port; const struct vol *volume; - DSI *dsi; char name[MAXINSTANCENAMELEN+1]; AvahiStringList *strlist = NULL; AvahiStringList *strlist2 = NULL; @@ -90,78 +89,69 @@ static void register_stuff(void) { } } - /* AFP server */ - for (dsi = ctx->obj->dsi; dsi; dsi = dsi->next) { - port = getip_port((struct sockaddr *)&dsi->server); + port = atoi(ctx->obj->options.port); - LOG(log_info, logtype_afpd, "hostname: %s", ctx->obj->options.hostname); + LOG(log_info, logtype_afpd, "hostname: %s", ctx->obj->options.hostname); - if (convert_string(ctx->obj->options.unixcharset, - CH_UTF8, - ctx->obj->options.hostname, - -1, - name, - MAXINSTANCENAMELEN) <= 0) { - LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name: %s", ctx->obj->options.hostname); - goto fail; - } - if ((dsi->bonjourname = strdup(name)) == NULL) { - LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name"); - goto fail; + if (convert_string(ctx->obj->options.unixcharset, + CH_UTF8, + ctx->obj->options.hostname, + -1, + name, + MAXINSTANCENAMELEN) <= 0) { + LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name: %s", ctx->obj->options.hostname); + goto fail; + } - } - LOG(log_info, logtype_afpd, "Registering server '%s' with Bonjour", - dsi->bonjourname); - - if (avahi_entry_group_add_service(ctx->group, - AVAHI_IF_UNSPEC, - AVAHI_PROTO_UNSPEC, - 0, - dsi->bonjourname, - AFP_DNS_SERVICE_TYPE, - NULL, - NULL, - port, - NULL) < 0) { - LOG(log_error, logtype_afpd, "Failed to add service: %s", - avahi_strerror(avahi_client_errno(ctx->client))); - goto fail; - } + LOG(log_info, logtype_afpd, "Registering server '%s' with Bonjour", name); + + if (avahi_entry_group_add_service(ctx->group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, + name, + AFP_DNS_SERVICE_TYPE, + NULL, + NULL, + port, + NULL) < 0) { + LOG(log_error, logtype_afpd, "Failed to add service: %s", + avahi_strerror(avahi_client_errno(ctx->client))); + goto fail; + } - if (i && avahi_entry_group_add_service_strlst(ctx->group, - AVAHI_IF_UNSPEC, - AVAHI_PROTO_UNSPEC, - 0, - dsi->bonjourname, - ADISK_SERVICE_TYPE, - NULL, - NULL, - 9, /* discard */ - strlist) < 0) { + if (i && avahi_entry_group_add_service_strlst(ctx->group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, + name, + ADISK_SERVICE_TYPE, + NULL, + NULL, + 9, /* discard */ + strlist) < 0) { + LOG(log_error, logtype_afpd, "Failed to add service: %s", + avahi_strerror(avahi_client_errno(ctx->client))); + goto fail; + } /* if */ + + if (ctx->obj->options.mimicmodel) { + strlist2 = avahi_string_list_add_printf(strlist2, "model=%s", ctx->obj->options.mimicmodel); + if (avahi_entry_group_add_service_strlst(ctx->group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, + name, + DEV_INFO_SERVICE_TYPE, + NULL, + NULL, + 0, + strlist2) < 0) { LOG(log_error, logtype_afpd, "Failed to add service: %s", avahi_strerror(avahi_client_errno(ctx->client))); goto fail; - } /* if */ - - if (ctx->obj->options.mimicmodel) { - strlist2 = avahi_string_list_add_printf(strlist2, "model=%s", ctx->obj->options.mimicmodel); - if (avahi_entry_group_add_service_strlst(ctx->group, - AVAHI_IF_UNSPEC, - AVAHI_PROTO_UNSPEC, - 0, - dsi->bonjourname, - DEV_INFO_SERVICE_TYPE, - NULL, - NULL, - 0, - strlist2) < 0) { - LOG(log_error, logtype_afpd, "Failed to add service: %s", - avahi_strerror(avahi_client_errno(ctx->client))); - goto fail; - } - } /* if (config->obj.options.mimicmodel) */ - - } /* for config*/ + } + } /* if (config->obj.options.mimicmodel) */ if (avahi_entry_group_commit(ctx->group) < 0) { LOG(log_error, logtype_afpd, "Failed to commit entry group: %s", diff --git a/etc/afpd/afp_avahi.h b/etc/netatalk/afp_avahi.h similarity index 97% rename from etc/afpd/afp_avahi.h rename to etc/netatalk/afp_avahi.h index ae3366db..588a6881 100644 --- a/etc/afpd/afp_avahi.h +++ b/etc/netatalk/afp_avahi.h @@ -22,8 +22,6 @@ #include -#include "afp_config.h" - struct context { /* Avahi stuff */ int thread_running; diff --git a/etc/afpd/afp_mdns.c b/etc/netatalk/afp_mdns.c similarity index 61% rename from etc/afpd/afp_mdns.c rename to etc/netatalk/afp_mdns.c index d3e6cd84..65ea55a3 100644 --- a/etc/afpd/afp_mdns.c +++ b/etc/netatalk/afp_mdns.c @@ -207,12 +207,15 @@ static void register_stuff(const AFPObj *obj) { } } - // Now we can count the configs so we know how many service - // records to allocate - for (dsi = obj->dsi; dsi; dsi = dsi->next) { - svc_ref_count++; // AFP_DNS_SERVICE_TYPE - if (i) svc_ref_count++; // ADISK_SERVICE_TYPE - if (obj->options.mimicmodel) svc_ref_count++; // DEV_INFO_SERVICE_TYPE + /* AFP_DNS_SERVICE_TYPE */ + svc_ref_count = 1; + if (i) { + /* ADISK_SERVICE_TYPE */ + svc_ref_count++; + } + if (obj->options.mimicmodel) { + /* DEV_INFO_SERVICE_TYPE */ + svc_ref_count++; } // Allocate the memory to store our service refs @@ -220,107 +223,98 @@ static void register_stuff(const AFPObj *obj) { assert(svc_refs); svc_ref_count = 0; - /* AFP server */ - for (dsi = obj->dsi; dsi; dsi = dsi->next) { + port = atoi(obj->options.port); - port = getip_port((struct sockaddr *)&dsi->server); + if (convert_string(obj->options.unixcharset, + CH_UTF8, + obj->options.hostname, + -1, + name, + MAXINSTANCENAMELEN) <= 0) { + LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name"); + goto fail; + } + LOG(log_info, logtype_afpd, "Registering server '%s' with Bonjour", + dsi->bonjourname); + + error = DNSServiceRegister(&svc_refs[svc_ref_count++], + 0, // no flags + 0, // all network interfaces + name, + AFP_DNS_SERVICE_TYPE, + "", // default domains + NULL, // default host name + htons(port), + 0, // length of TXT + NULL, // no TXT + RegisterReply, // callback + NULL); // no context + if (error != kDNSServiceErr_NoError) { + LOG(log_error, logtype_afpd, "Failed to add service: %s, error=%d", + AFP_DNS_SERVICE_TYPE, error); + goto fail; + } - if (convert_string(obj->options.unixcharset, - CH_UTF8, - obj->options.hostname, - -1, - name, - MAXINSTANCENAMELEN) <= 0) { - LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name"); + if (i) { + error = DNSServiceRegister(&svc_refs[svc_ref_count++], + 0, // no flags + 0, // all network interfaces + name, + ADISK_SERVICE_TYPE, + "", // default domains + NULL, // default host name + htons(port), + TXTRecordGetLength(&txt_adisk), + TXTRecordGetBytesPtr(&txt_adisk), + RegisterReply, // callback + NULL); // no context + if (error != kDNSServiceErr_NoError) { + LOG(log_error, logtype_afpd, "Failed to add service: %s, error=%d", + ADISK_SERVICE_TYPE, error); goto fail; } - if ((dsi->bonjourname = strdup(name)) == NULL) { - LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name"); - goto fail; + } + if (obj->options.mimicmodel) { + LOG(log_info, logtype_afpd, "Registering server '%s' with model '%s'", + dsi->bonjourname, obj->options.mimicmodel); + TXTRecordCreate(&txt_devinfo, 0, NULL); + if ( 0 > TXTRecordPrintf(&txt_devinfo, "model", obj->options.mimicmodel) ) { + LOG ( log_error, logtype_afpd, "Could not create Zeroconf TXTRecord for model"); + goto fail; } - LOG(log_info, logtype_afpd, "Registering server '%s' with Bonjour", - dsi->bonjourname); error = DNSServiceRegister(&svc_refs[svc_ref_count++], 0, // no flags 0, // all network interfaces - dsi->bonjourname, - AFP_DNS_SERVICE_TYPE, + name, + DEV_INFO_SERVICE_TYPE, "", // default domains NULL, // default host name - htons(port), - 0, // length of TXT - NULL, // no TXT + /* + * We would probably use port 0 zero, but we can't, from man DNSServiceRegister: + * "A value of 0 for a port is passed to register placeholder services. + * Place holder services are not found when browsing, but other + * clients cannot register with the same name as the placeholder service." + * We therefor use port 9 which is used by the adisk service type. + */ + htons(9), + TXTRecordGetLength(&txt_devinfo), + TXTRecordGetBytesPtr(&txt_devinfo), RegisterReply, // callback NULL); // no context - if(error != kDNSServiceErr_NoError) { + TXTRecordDeallocate(&txt_devinfo); + if (error != kDNSServiceErr_NoError) { LOG(log_error, logtype_afpd, "Failed to add service: %s, error=%d", - AFP_DNS_SERVICE_TYPE, error); + DEV_INFO_SERVICE_TYPE, error); goto fail; } + } /* if (config->obj.options.mimicmodel) */ - if(i) { - error = DNSServiceRegister(&svc_refs[svc_ref_count++], - 0, // no flags - 0, // all network interfaces - dsi->bonjourname, - ADISK_SERVICE_TYPE, - "", // default domains - NULL, // default host name - htons(port), - TXTRecordGetLength(&txt_adisk), - TXTRecordGetBytesPtr(&txt_adisk), - RegisterReply, // callback - NULL); // no context - if(error != kDNSServiceErr_NoError) { - LOG(log_error, logtype_afpd, "Failed to add service: %s, error=%d", - ADISK_SERVICE_TYPE, error); - goto fail; - } - } - - if (obj->options.mimicmodel) { - LOG(log_info, logtype_afpd, "Registering server '%s' with model '%s'", - dsi->bonjourname, obj->options.mimicmodel); - TXTRecordCreate(&txt_devinfo, 0, NULL); - if( 0 > TXTRecordPrintf(&txt_devinfo, "model", obj->options.mimicmodel) ) { - LOG ( log_error, logtype_afpd, "Could not create Zeroconf TXTRecord for model"); - goto fail; - } - - error = DNSServiceRegister(&svc_refs[svc_ref_count++], - 0, // no flags - 0, // all network interfaces - dsi->bonjourname, - DEV_INFO_SERVICE_TYPE, - "", // default domains - NULL, // default host name - /* - * We would probably use port 0 zero, but we can't, from man DNSServiceRegister: - * "A value of 0 for a port is passed to register placeholder services. - * Place holder services are not found when browsing, but other - * clients cannot register with the same name as the placeholder service." - * We therefor use port 9 which is used by the adisk service type. - */ - htons(9), - TXTRecordGetLength(&txt_devinfo), - TXTRecordGetBytesPtr(&txt_devinfo), - RegisterReply, // callback - NULL); // no context - TXTRecordDeallocate(&txt_devinfo); - if(error != kDNSServiceErr_NoError) { - LOG(log_error, logtype_afpd, "Failed to add service: %s, error=%d", - DEV_INFO_SERVICE_TYPE, error); - goto fail; - } - } /* if (config->obj.options.mimicmodel) */ - } /* for config*/ - - /* - * Now we can create the thread that will poll for the results - * and handle the calling of the callbacks - */ + /* + * Now we can create the thread that will poll for the results + * and handle the calling of the callbacks + */ if(pthread_create(&poller, NULL, polling_thread, NULL) != 0) { LOG(log_error, logtype_afpd, "Unable to start mDNS polling thread"); goto fail; diff --git a/etc/afpd/afp_mdns.h b/etc/netatalk/afp_mdns.h similarity index 94% rename from etc/afpd/afp_mdns.h rename to etc/netatalk/afp_mdns.h index 5008ae4f..7e876c20 100644 --- a/etc/afpd/afp_mdns.h +++ b/etc/netatalk/afp_mdns.h @@ -15,8 +15,6 @@ #include -#include "afp_config.h" - /* prototype definitions */ void md_zeroconf_register(const AFPObj *obj); int md_zeroconf_unregister(void); diff --git a/etc/afpd/afp_zeroconf.c b/etc/netatalk/afp_zeroconf.c similarity index 97% rename from etc/afpd/afp_zeroconf.c rename to etc/netatalk/afp_zeroconf.c index cf370fc3..c5359ca7 100644 --- a/etc/afpd/afp_zeroconf.c +++ b/etc/netatalk/afp_zeroconf.c @@ -12,7 +12,6 @@ #endif #include "afp_zeroconf.h" -#include "afp_config.h" #ifdef HAVE_MDNS #include "afp_mdns.h" diff --git a/etc/afpd/afp_zeroconf.h b/etc/netatalk/afp_zeroconf.h similarity index 96% rename from etc/afpd/afp_zeroconf.h rename to etc/netatalk/afp_zeroconf.h index 89fc3ca9..88bb6e79 100644 --- a/etc/afpd/afp_zeroconf.h +++ b/etc/netatalk/afp_zeroconf.h @@ -10,7 +10,7 @@ #ifndef AFPD_ZEROCONF_H #define AFPD_ZEROCONF_H -#include "afp_config.h" +#include #define AFP_DNS_SERVICE_TYPE "_afpovertcp._tcp" #define ADISK_SERVICE_TYPE "_adisk._tcp" diff --git a/etc/netatalk/netatalk.c b/etc/netatalk/netatalk.c index b8987b7e..bf7e1589 100644 --- a/etc/netatalk/netatalk.c +++ b/etc/netatalk/netatalk.c @@ -42,6 +42,7 @@ #include #include #include +#include "afp_zeroconf.h" #include @@ -439,6 +440,12 @@ int main(int argc, char **argv) } #endif + /* Now register with zeroconf, we also need the volumes for that */ + if (! (obj.options.flags & OPTION_NOZEROCONF)) { + LOG(log_note, logtype_default, "Registering with Zeroconf"); + zeroconf_register(&obj); + LOG(log_note, logtype_default, "done"); + } /* run the event loop */ ret = event_base_dispatch(base); -- 2.39.2