aboutsummaryrefslogtreecommitdiffstats
path: root/mdns-publish.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdns-publish.c')
-rw-r--r--mdns-publish.c38
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);
}