X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fbrowse.c;h=5885cb4fb2152161969e8f7ddab5724abda1c012;hb=88a99a094e561b6c87404f4999e61e7b9ed754f6;hp=c9598311a9cd2311ae25bde2ac5fe1dec25845ec;hpb=4247c03f559776793fcc4f28706d3bf0bced57b9;p=catta diff --git a/avahi-core/browse.c b/avahi-core/browse.c index c959831..5885cb4 100644 --- a/avahi-core/browse.c +++ b/avahi-core/browse.c @@ -25,40 +25,43 @@ #include "browse.h" #include "util.h" +#include "log.h" struct AvahiRecordBrowser { gboolean dead; AvahiServer *server; AvahiKey *key; - gint interface; - guchar protocol; - gint n_query; + AvahiIfIndex interface; + AvahiProtocol protocol; guint sec_delay; AvahiTimeEvent *time_event; AvahiRecordBrowserCallback callback; gpointer userdata; + guint scan_idle_source; - AVAHI_LLIST_FIELDS(AvahiRecordBrowser, resolver); + AVAHI_LLIST_FIELDS(AvahiRecordBrowser, browser); AVAHI_LLIST_FIELDS(AvahiRecordBrowser, by_key); }; static void elapse(AvahiTimeEvent *e, void *userdata) { AvahiRecordBrowser *s = userdata; GTimeVal tv; -/* gchar *t; */ +/* gchar *t; */ g_assert(s); avahi_server_post_query(s->server, s->interface, s->protocol, s->key); - if (s->n_query++ <= 8) - s->sec_delay *= 2; - -/* g_message("%i. Continuous querying for %s", s->n_query, t = avahi_key_to_string(s->key)); */ -/* g_free(t); */ + s->sec_delay *= 2; + + if (s->sec_delay >= 60*60) /* 1h */ + s->sec_delay = 60*60; + +/* avahi_log_debug("Continuous querying for %s (%i)", t = avahi_key_to_string(s->key), s->sec_delay); */ +/* g_free(t); */ avahi_elapse_time(&tv, s->sec_delay*1000, 0); avahi_time_event_queue_update(s->server->time_event_queue, s->time_event, &tv); @@ -102,7 +105,18 @@ static void scan_interface_callback(AvahiInterfaceMonitor *m, AvahiInterface *i, avahi_cache_walk(i->cache, s->key, scan_cache_callback, &cbdata); } -AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, gint interface, guchar protocol, AvahiKey *key, AvahiRecordBrowserCallback callback, gpointer userdata) { +static gboolean scan_idle_callback(gpointer data) { + AvahiRecordBrowser *b = data; + g_assert(b); + + /* Scan the caches */ + avahi_interface_monitor_walk(b->server->monitor, b->interface, b->protocol, scan_interface_callback, b); + b->scan_idle_source = (guint) -1; + + return FALSE; +} + +AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, AvahiIfIndex interface, AvahiProtocol protocol, AvahiKey *key, AvahiRecordBrowserCallback callback, gpointer userdata) { AvahiRecordBrowser *b, *t; GTimeVal tv; @@ -110,7 +124,15 @@ AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, gint interface g_assert(key); g_assert(callback); - g_assert(!avahi_key_is_pattern(key)); + if (avahi_key_is_pattern(key)) { + avahi_server_set_errno(server, AVAHI_ERR_IS_PATTERN); + return NULL; + } + + if (!avahi_key_valid(key)) { + avahi_server_set_errno(server, AVAHI_ERR_INVALID_KEY); + return NULL; + } b = g_new(AvahiRecordBrowser, 1); b->dead = FALSE; @@ -120,7 +142,6 @@ AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, gint interface b->protocol = protocol; b->callback = callback; b->userdata = userdata; - b->n_query = 1; b->sec_delay = 1; avahi_server_post_query(b->server, b->interface, b->protocol, b->key); @@ -128,16 +149,15 @@ AvahiRecordBrowser *avahi_record_browser_new(AvahiServer *server, gint interface avahi_elapse_time(&tv, b->sec_delay*1000, 0); b->time_event = avahi_time_event_queue_add(server->time_event_queue, &tv, elapse, b); - AVAHI_LLIST_PREPEND(AvahiRecordBrowser, resolver, server->record_browsers, b); + AVAHI_LLIST_PREPEND(AvahiRecordBrowser, browser, server->record_browsers, b); /* Add the new entry to the record_browser hash table */ t = g_hash_table_lookup(server->record_browser_hashtable, key); AVAHI_LLIST_PREPEND(AvahiRecordBrowser, by_key, t, b); g_hash_table_replace(server->record_browser_hashtable, key, t); - /* Scan the caches */ - avahi_interface_monitor_walk(b->server->monitor, b->interface, b->protocol, scan_interface_callback, b); - + /* The currenlty cached entries are scanned a bit later */ + b->scan_idle_source = g_idle_add_full(G_PRIORITY_HIGH, scan_idle_callback, b, NULL); return b; } @@ -151,6 +171,12 @@ void avahi_record_browser_free(AvahiRecordBrowser *b) { if (b->time_event) { avahi_time_event_queue_remove(b->server->time_event_queue, b->time_event); b->time_event = NULL; + + if (b->scan_idle_source != (guint) -1) { + g_source_remove(b->scan_idle_source); + b->scan_idle_source = (guint) -1; + } + } } @@ -159,7 +185,7 @@ void avahi_record_browser_destroy(AvahiRecordBrowser *b) { g_assert(b); - AVAHI_LLIST_REMOVE(AvahiRecordBrowser, resolver, b->server->record_browsers, b); + AVAHI_LLIST_REMOVE(AvahiRecordBrowser, browser, b->server->record_browsers, b); t = g_hash_table_lookup(b->server->record_browser_hashtable, b->key); AVAHI_LLIST_REMOVE(AvahiRecordBrowser, by_key, t, b); @@ -171,6 +197,9 @@ void avahi_record_browser_destroy(AvahiRecordBrowser *b) { if (b->time_event) avahi_time_event_queue_remove(b->server->time_event_queue, b->time_event); avahi_key_unref(b->key); + + if (b->scan_idle_source != (guint) -1) + g_source_remove(b->scan_idle_source); g_free(b); } @@ -182,7 +211,7 @@ void avahi_browser_cleanup(AvahiServer *server) { g_assert(server); for (b = server->record_browsers; b; b = n) { - n = b->resolver_next; + n = b->browser_next; if (b->dead) avahi_record_browser_destroy(b); @@ -213,3 +242,14 @@ gboolean avahi_is_subscribed(AvahiServer *server, AvahiInterface *i, AvahiKey *k return FALSE; } + +void avahi_browser_new_interface(AvahiServer*s, AvahiInterface *i) { + AvahiRecordBrowser *b; + + g_assert(s); + g_assert(i); + + for (b = s->record_browsers; b; b = b->browser_next) + if (avahi_interface_match(i, b->interface, b->protocol)) + avahi_interface_post_query(i, b->key, FALSE); +}