diff options
Diffstat (limited to 'mdns-publish.c')
-rw-r--r-- | mdns-publish.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/mdns-publish.c b/mdns-publish.c index a0e3cc4..81944f7 100644 --- a/mdns-publish.c +++ b/mdns-publish.c @@ -65,27 +65,29 @@ static char *client_state_name[] = { [ AVAHI_CLIENT_CONNECTING ] = "connecting", }; +static void update_services(AvahiClient *c, struct mdns_pub *mdns); + static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, void *userdata) { struct mdns_pub_entry *entry = userdata; + char *n; mdns_log_printf(entry->mdns, LOG_DEBUG, "%s: %s: state %d [%s]\n", __FUNCTION__, entry->name, state, group_state_name[state]); switch (state) { case AVAHI_ENTRY_GROUP_COLLISION: -#if 0 - n = avahi_alternative_service_name(name); - mdns_log_printf(mdns, LOG_NOTICE, + n = avahi_alternative_service_name(entry->name); + mdns_log_printf(entry->mdns, LOG_NOTICE, "service name collision, renaming '%s' to '%s'\n", - name, n); - avahi_free(name); - name = n; - create_services(avahi_entry_group_get_client(g)); + entry->name, n); + avahi_free(entry->name); + entry->name = n; + avahi_entry_group_reset(entry->group); + update_services(avahi_entry_group_get_client(g), entry->mdns); break; -#endif case AVAHI_ENTRY_GROUP_FAILURE: mdns_pub_appquit++; break; @@ -236,7 +238,7 @@ struct mdns_pub *mdns_pub_init(int debug) memset(mdns, 0, sizeof(*mdns)); INIT_LIST_HEAD(&mdns->entries); mdns->debug = debug; - mdns->have_tty = 1; + mdns->have_tty = isatty(2); openlog(mdns_pub_appname, 0, LOG_LOCAL0); mdns->have_syslog = 1; @@ -286,20 +288,33 @@ void mdns_pub_fini(struct mdns_pub *mdns) /* --------------------------------------------------------------------- */ struct mdns_pub_entry *mdns_pub_add(struct mdns_pub *mdns, - char *name, char *service, int port) + char *name, char *service, int port, + ...) { struct mdns_pub_entry *entry; + va_list args; + char *txt; + int i; entry = avahi_malloc(sizeof(*entry)); if (NULL == entry) return NULL; memset(entry, 0, sizeof(*entry)); - entry->name = name; + entry->name = avahi_strdup(name); entry->service = service; entry->port = port; entry->mdns = mdns; + va_start(args, port); + for (i = 0; i < sizeof(entry->txt)/sizeof(entry->txt[0]); i++) { + txt = va_arg(args,char*); + if (NULL == txt) + break; + entry->txt[i] = txt; + } + va_end(args); + list_add_tail(&entry->next, &mdns->entries); if (mdns->client) update_services(mdns->client, mdns); @@ -316,6 +331,7 @@ void mdns_pub_del(struct mdns_pub_entry *entry) avahi_entry_group_free(entry->group); entry->group = NULL; } + avahi_free(entry->name); list_del(&entry->next); avahi_free(entry); } |