static void defer_callback(AVAHI_GCC_UNUSED AvahiTimeEvent *e, void *userdata) { AvahiSRecordBrowser *b = userdata; int n = 0; assert(b); assert(!b->dead); /* Remove the defer timeout */ if (b->defer_time_event) { avahi_time_event_free(b->defer_time_event); b->defer_time_event = NULL; } /* Create initial query */ assert(!b->root_lookup); b->root_lookup = lookup_add(b, b->interface, b->protocol, b->flags, b->key); assert(b->root_lookup); n = lookup_go(b->root_lookup); if (b->dead) return; if (n < 0) { /* sending of the initial query failed */ avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE); b->callback( b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL, b->flags & AVAHI_LOOKUP_USE_WIDE_AREA ? AVAHI_LOOKUP_RESULT_WIDE_AREA : (b->flags & AVAHI_LOOKUP_RESULT_MULTICAST ? AVAHI_LOOKUP_RESULT_MULTICAST : AVAHI_LOOKUP_RESULT_LLMNR), b->userdata); browser_cancel(b); return; } /* Tell the client that we're done with the cache */ b->callback( b, b->interface, b->protocol, AVAHI_BROWSER_CACHE_EXHAUSTED, NULL, b->flags & AVAHI_LOOKUP_USE_WIDE_AREA ? AVAHI_LOOKUP_RESULT_WIDE_AREA : (b->flags & AVAHI_LOOKUP_RESULT_MULTICAST ? AVAHI_LOOKUP_RESULT_MULTICAST : AVAHI_LOOKUP_RESULT_LLMNR), b->userdata); if (!b->dead && b->root_lookup && (b->root_lookup->flags & AVAHI_LOOKUP_USE_WIDE_AREA) && n > 0 ) { /* If we do wide area lookups and the the cache contained * entries, we assume that it is complete, and tell the user * so by firing ALL_FOR_NOW. */ b->callback(b, b->interface, b->protocol, AVAHI_BROWSER_ALL_FOR_NOW, NULL, AVAHI_LOOKUP_RESULT_LLMNR, b->userdata); } }
static void lookup_handle_cname(AvahiSRBLookup *l, AvahiIfIndex interface, AvahiProtocol protocol, AvahiLookupFlags flags, AvahiRecord *r) { AvahiKey *k; AvahiSRBLookup *n; assert(l); assert(r); assert(r->key->clazz == AVAHI_DNS_CLASS_IN); assert(r->key->type == AVAHI_DNS_TYPE_CNAME); k = avahi_key_new(r->data.ptr.name, l->record_browser->key->clazz, l->record_browser->key->type); n = lookup_add(l->record_browser, interface, protocol, flags, k); avahi_key_unref(k); if (!n) { avahi_log_debug(__FILE__": Failed to create SRBLookup."); return; } l->cname_lookups = avahi_rlist_prepend(l->cname_lookups, lookup_ref(n)); lookup_go(n); lookup_unref(n); }
Expr init_prim(wchar_t* s, Prim f) { Expr e = typed(PRIMITIVE); e.prim = f; *lookup_add(uniq_symbol(s), &ground_env) = e; return e; }