X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fafp_avahi.c;h=5218d51758aebb0554298465c34c63436c67d541;hb=4021b76ce3f3e51756e9d59b4a5a045ad6398dc8;hp=dbd0cf2e75fd266f8e328b6df485ad4986a7ff29;hpb=b0bcb8f6b0571592a50ce039882c9319e012a270;p=netatalk.git diff --git a/etc/afpd/afp_avahi.c b/etc/afpd/afp_avahi.c index dbd0cf2e..5218d517 100644 --- a/etc/afpd/afp_avahi.c +++ b/etc/afpd/afp_avahi.c @@ -12,6 +12,7 @@ #ifdef HAVE_AVAHI #include +#include #include @@ -19,10 +20,10 @@ #include #include #include +#include +#include "afp_zeroconf.h" #include "afp_avahi.h" -#include "afp_config.h" -#include "volume.h" /***************************************************************** * Global variables @@ -43,7 +44,6 @@ static void publish_reply(AvahiEntryGroup *g, */ static void register_stuff(void) { uint port; - const AFPConfig *config; const struct vol *volume; DSI *dsi; char name[MAXINSTANCENAMELEN+1]; @@ -70,7 +70,7 @@ static void register_stuff(void) { for (volume = getvolumes(); volume; volume = volume->v_next) { - if (convert_string(CH_UCS2, CH_UTF8_MAC, volume->v_name, -1, tmpname, 255) <= 0) { + if (convert_string(CH_UCS2, CH_UTF8_MAC, volume->v_u8mname, -1, tmpname, 255) <= 0) { LOG ( log_error, logtype_afpd, "Could not set Zeroconf volume name for TimeMachine"); goto fail; } @@ -91,20 +91,18 @@ static void register_stuff(void) { } /* AFP server */ - for (config = ctx->configs; config; config = config->next) { - - dsi = (DSI *)config->obj.handle; + for (dsi = ctx->obj->dsi; dsi; dsi = dsi->next) { port = getip_port((struct sockaddr *)&dsi->server); - if (convert_string(config->obj.options.unixcharset, + LOG(log_info, logtype_afpd, "hostname: %s", ctx->obj->options.hostname); + + if (convert_string(ctx->obj->options.unixcharset, CH_UTF8, - config->obj.options.server ? - config->obj.options.server : - config->obj.options.hostname, + ctx->obj->options.hostname, -1, name, MAXINSTANCENAMELEN) <= 0) { - LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name"); + LOG(log_error, logtype_afpd, "Could not set Zeroconf instance name: %s", ctx->obj->options.hostname); goto fail; } if ((dsi->bonjourname = strdup(name)) == NULL) { @@ -112,7 +110,7 @@ static void register_stuff(void) { goto fail; } - LOG(log_info, logtype_afpd, "Registering server '%s' with with Bonjour", + LOG(log_info, logtype_afpd, "Registering server '%s' with Bonjour", dsi->bonjourname); if (avahi_entry_group_add_service(ctx->group, @@ -145,8 +143,8 @@ static void register_stuff(void) { goto fail; } /* if */ - if (config->obj.options.mimicmodel) { - strlist2 = avahi_string_list_add_printf(strlist2, "model=%s", config->obj.options.mimicmodel); + 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, @@ -176,8 +174,8 @@ static void register_stuff(void) { return; fail: - avahi_client_free (ctx->client); - avahi_threaded_poll_quit(ctx->threaded_poll); + time(NULL); +// avahi_threaded_poll_quit(ctx->threaded_poll); } /* Called when publishing of service data completes */ @@ -198,14 +196,12 @@ static void publish_reply(AvahiEntryGroup *g, /* With multiple names there's no way to know which one collided */ LOG(log_error, logtype_afpd, "publish_reply: AVAHI_ENTRY_GROUP_COLLISION", avahi_strerror(avahi_client_errno(ctx->client))); - avahi_client_free(avahi_entry_group_get_client(g)); avahi_threaded_poll_quit(ctx->threaded_poll); break; case AVAHI_ENTRY_GROUP_FAILURE: LOG(log_error, logtype_afpd, "Failed to register service: %s", avahi_strerror(avahi_client_errno(ctx->client))); - avahi_client_free(avahi_entry_group_get_client(g)); avahi_threaded_poll_quit(ctx->threaded_poll); break; @@ -253,14 +249,12 @@ static void client_callback(AvahiClient *client, LOG(log_error, logtype_afpd, "Failed to contact server: %s", avahi_strerror(error)); - avahi_client_free (ctx->client); avahi_threaded_poll_quit(ctx->threaded_poll); } } else { LOG(log_error, logtype_afpd, "Client failure: %s", avahi_strerror(avahi_client_errno(client))); - avahi_client_free (ctx->client); avahi_threaded_poll_quit(ctx->threaded_poll); } break; @@ -281,7 +275,7 @@ static void client_callback(AvahiClient *client, * Tries to setup the Zeroconf thread and any * neccessary config setting. */ -void av_zeroconf_setup(const AFPConfig *configs) { +void av_zeroconf_register(const AFPObj *obj) { int error; /* initialize the struct that holds our config settings. */ @@ -290,7 +284,7 @@ void av_zeroconf_setup(const AFPConfig *configs) { avahi_entry_group_reset(ctx->group); } else { ctx = calloc(1, sizeof(struct context)); - ctx->configs = configs; + ctx->obj = obj; assert(ctx); } @@ -306,24 +300,10 @@ void av_zeroconf_setup(const AFPConfig *configs) { NULL, &error))) { LOG(log_error, logtype_afpd, "Failed to create client object: %s", - avahi_strerror(avahi_client_errno(ctx->client))); + avahi_strerror(error)); goto fail; } - return; - -fail: - if (ctx) - av_zeroconf_unregister(); - - return; -} - -/* - * This function finally runs the loop impl. - */ -int av_zeroconf_run(void) { - /* 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", avahi_strerror(avahi_client_errno(ctx->client))); @@ -333,26 +313,12 @@ int av_zeroconf_run(void) { } ctx->thread_running = 1; - return 0; + return; fail: - if (ctx) - av_zeroconf_unregister(); + av_zeroconf_unregister(); - return -1; -} - -/* - * Tries to shutdown this loop impl. - * Call this function from outside this thread. - */ -void av_zeroconf_shutdown() { - /* Call this when the app shuts down */ - avahi_threaded_poll_stop(ctx->threaded_poll); - avahi_client_free(ctx->client); - avahi_threaded_poll_free(ctx->threaded_poll); - free(ctx); - ctx = NULL; + return; } /* @@ -360,27 +326,21 @@ void av_zeroconf_shutdown() { * Call this function from inside this thread. */ int av_zeroconf_unregister() { - if (ctx->thread_running) { - /* First, block the event loop */ - avahi_threaded_poll_lock(ctx->threaded_poll); - - /* Than, do your stuff */ - avahi_threaded_poll_quit(ctx->threaded_poll); + LOG(log_error, logtype_afpd, "av_zeroconf_unregister"); - /* Finally, unblock the event loop */ - avahi_threaded_poll_unlock(ctx->threaded_poll); - ctx->thread_running = 0; + if (ctx) { + LOG(log_error, logtype_afpd, "av_zeroconf_unregister: avahi_threaded_poll_stop"); + if (ctx->threaded_poll) + avahi_threaded_poll_stop(ctx->threaded_poll); + LOG(log_error, logtype_afpd, "av_zeroconf_unregister: avahi_client_free"); + if (ctx->client) + avahi_client_free(ctx->client); + LOG(log_error, logtype_afpd, "av_zeroconf_unregister: avahi_threaded_poll_free"); + if (ctx->threaded_poll) + avahi_threaded_poll_free(ctx->threaded_poll); + free(ctx); + ctx = NULL; } - - if (ctx->client) - avahi_client_free(ctx->client); - - if (ctx->threaded_poll) - avahi_threaded_poll_free(ctx->threaded_poll); - - free(ctx); - ctx = NULL; - return 0; }