diff options
Diffstat (limited to 'avahi-client')
-rw-r--r-- | avahi-client/browser.c | 145 | ||||
-rw-r--r-- | avahi-client/client-test.c | 9 | ||||
-rw-r--r-- | avahi-client/client.c | 18 | ||||
-rw-r--r-- | avahi-client/resolver.c | 305 |
4 files changed, 291 insertions, 186 deletions
diff --git a/avahi-client/browser.c b/avahi-client/browser.c index a83aa69..bdbd8c5 100644 --- a/avahi-client/browser.c +++ b/avahi-client/browser.c @@ -194,17 +194,42 @@ DBusHandlerResult avahi_domain_browser_event (AvahiClient *client, AvahiBrowserE if (!db) goto fail; - if (event == AVAHI_BROWSER_NEW || event == AVAHI_BROWSER_REMOVE) { - if (!dbus_message_get_args( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_UINT32, &flags, - DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) { - fprintf(stderr, "Failed to parse browser event.\n"); - goto fail; + switch (event) { + case AVAHI_BROWSER_NEW: + case AVAHI_BROWSER_REMOVE: + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + break; + + case AVAHI_BROWSER_CACHE_EXHAUSTED: + case AVAHI_BROWSER_ALL_FOR_NOW: + break; + + case AVAHI_BROWSER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + avahi_client_set_errno(db->client, avahi_error_dbus_to_number(etxt)); + break; } } @@ -369,19 +394,41 @@ DBusHandlerResult avahi_service_type_browser_event (AvahiClient *client, AvahiBr if (!b) goto fail; + switch (event) { + case AVAHI_BROWSER_NEW: + case AVAHI_BROWSER_REMOVE: + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &type, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set(&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + break; + + case AVAHI_BROWSER_CACHE_EXHAUSTED: + case AVAHI_BROWSER_ALL_FOR_NOW: + break; - if (event == AVAHI_BROWSER_NEW || event == AVAHI_BROWSER_REMOVE) { - if (!dbus_message_get_args( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &type, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_UINT32, &flags, - DBUS_TYPE_INVALID) || - dbus_error_is_set(&error)) { - fprintf(stderr, "Failed to parse browser event.\n"); - goto fail; + case AVAHI_BROWSER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + avahi_client_set_errno(b->client, avahi_error_dbus_to_number(etxt)); + break; } } @@ -528,7 +575,7 @@ int avahi_service_browser_free (AvahiServiceBrowser *b) { } -DBusHandlerResult avahi_service_browser_event (AvahiClient *client, AvahiBrowserEvent event, DBusMessage *message) { +DBusHandlerResult avahi_service_browser_event(AvahiClient *client, AvahiBrowserEvent event, DBusMessage *message) { AvahiServiceBrowser *b = NULL; DBusError error; const char *path; @@ -548,19 +595,43 @@ DBusHandlerResult avahi_service_browser_event (AvahiClient *client, AvahiBrowser if (!b) goto fail; - if (event == AVAHI_BROWSER_NEW || event == AVAHI_BROWSER_REMOVE) { - if (!dbus_message_get_args ( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &type, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_UINT32, &flags, - DBUS_TYPE_INVALID) || - dbus_error_is_set(&error)) { - fprintf(stderr, "Failed to parse browser event.\n"); - goto fail; + switch (event) { + case AVAHI_BROWSER_NEW: + case AVAHI_BROWSER_REMOVE: + + if (!dbus_message_get_args ( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &type, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set(&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + break; + + case AVAHI_BROWSER_CACHE_EXHAUSTED: + case AVAHI_BROWSER_ALL_FOR_NOW: + break; + + case AVAHI_BROWSER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + avahi_client_set_errno(b->client, avahi_error_dbus_to_number(etxt)); + break; } } diff --git a/avahi-client/client-test.c b/avahi-client/client-test.c index 15af93f..c7789ba 100644 --- a/avahi-client/client-test.c +++ b/avahi-client/client-test.c @@ -71,8 +71,7 @@ static void avahi_service_resolver_callback( char addr[64]; char *txtr; - if (event == AVAHI_RESOLVER_TIMEOUT) - { + if (event == AVAHI_RESOLVER_FAILURE) { printf ("SERVICE-RESOLVER: ServiceResolver %p timed out (%s %s)\n", (void*) r, name, type); return; } @@ -129,8 +128,7 @@ static void avahi_address_resolver_callback ( void *userdata) { char addr[64]; - if (event == AVAHI_RESOLVER_TIMEOUT) - { + if (event == AVAHI_RESOLVER_FAILURE) { printf ("ADDRESS-RESOLVER: Callback on AddressResolver, timed out.\n"); return; } @@ -152,8 +150,7 @@ static void avahi_host_name_resolver_callback ( AvahiAddressResolver *ar; char addr[64]; - if (event == AVAHI_RESOLVER_TIMEOUT) - { + if (event == AVAHI_RESOLVER_FAILURE) { printf ("HOST-NAME-RESOLVER: Callback on HostNameResolver, timed out.\n"); return; } diff --git a/avahi-client/client.c b/avahi-client/client.c index be52cc9..8b0d957 100644 --- a/avahi-client/client.c +++ b/avahi-client/client.c @@ -178,8 +178,6 @@ static DBusHandlerResult filter_func(DBusConnection *bus, DBusMessage *message, return avahi_domain_browser_event(client, AVAHI_BROWSER_CACHE_EXHAUSTED, message); else if (dbus_message_is_signal (message, AVAHI_DBUS_INTERFACE_DOMAIN_BROWSER, "AllForNow")) return avahi_domain_browser_event(client, AVAHI_BROWSER_ALL_FOR_NOW, message); - else if (dbus_message_is_signal (message, AVAHI_DBUS_INTERFACE_DOMAIN_BROWSER, "NotFound")) - return avahi_domain_browser_event(client, AVAHI_BROWSER_NOT_FOUND, message); else if (dbus_message_is_signal (message, AVAHI_DBUS_INTERFACE_DOMAIN_BROWSER, "Failure")) return avahi_domain_browser_event(client, AVAHI_BROWSER_FAILURE, message); @@ -191,8 +189,6 @@ static DBusHandlerResult filter_func(DBusConnection *bus, DBusMessage *message, return avahi_service_type_browser_event (client, AVAHI_BROWSER_CACHE_EXHAUSTED, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_TYPE_BROWSER, "AllForNow")) return avahi_service_type_browser_event (client, AVAHI_BROWSER_ALL_FOR_NOW, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_TYPE_BROWSER, "NotFound")) - return avahi_service_type_browser_event (client, AVAHI_BROWSER_NOT_FOUND, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_TYPE_BROWSER, "Failure")) return avahi_service_type_browser_event (client, AVAHI_BROWSER_FAILURE, message); @@ -204,35 +200,21 @@ static DBusHandlerResult filter_func(DBusConnection *bus, DBusMessage *message, return avahi_service_browser_event (client, AVAHI_BROWSER_CACHE_EXHAUSTED, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_BROWSER, "AllForNow")) return avahi_service_browser_event (client, AVAHI_BROWSER_ALL_FOR_NOW, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_BROWSER, "NotFound")) - return avahi_service_browser_event (client, AVAHI_BROWSER_NOT_FOUND, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_BROWSER, "Failure")) return avahi_service_browser_event (client, AVAHI_BROWSER_FAILURE, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER, "Found")) return avahi_service_resolver_event (client, AVAHI_RESOLVER_FOUND, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER, "Timeout")) - return avahi_service_resolver_event (client, AVAHI_RESOLVER_TIMEOUT, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER, "NotFound")) - return avahi_service_resolver_event (client, AVAHI_RESOLVER_NOT_FOUND, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER, "Failure")) return avahi_service_resolver_event (client, AVAHI_RESOLVER_FAILURE, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER, "Found")) return avahi_host_name_resolver_event (client, AVAHI_RESOLVER_FOUND, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER, "Timeout")) - return avahi_host_name_resolver_event (client, AVAHI_RESOLVER_TIMEOUT, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER, "NotFound")) - return avahi_host_name_resolver_event (client, AVAHI_RESOLVER_NOT_FOUND, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER, "Failure")) return avahi_host_name_resolver_event (client, AVAHI_RESOLVER_FAILURE, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_ADDRESS_RESOLVER, "Found")) return avahi_address_resolver_event (client, AVAHI_RESOLVER_FOUND, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_ADDRESS_RESOLVER, "Timeout")) - return avahi_address_resolver_event (client, AVAHI_RESOLVER_TIMEOUT, message); - else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_ADDRESS_RESOLVER, "NotFound")) - return avahi_address_resolver_event (client, AVAHI_RESOLVER_NOT_FOUND, message); else if (dbus_message_is_signal(message, AVAHI_DBUS_INTERFACE_ADDRESS_RESOLVER, "Failure")) return avahi_address_resolver_event (client, AVAHI_RESOLVER_FAILURE, message); diff --git a/avahi-client/resolver.c b/avahi-client/resolver.c index 494d3cc..889088f 100644 --- a/avahi-client/resolver.c +++ b/avahi-client/resolver.c @@ -61,95 +61,113 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv if (!r) goto fail; - if (event == AVAHI_RESOLVER_FOUND) { - int j; - int32_t interface, protocol, aprotocol; - uint32_t flags; - char *name, *type, *domain, *host, *address; - uint16_t port; - DBusMessageIter iter, sub; - AvahiAddress a; - - if (!dbus_message_get_args( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &type, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_STRING, &host, - DBUS_TYPE_INT32, &aprotocol, - DBUS_TYPE_STRING, &address, - DBUS_TYPE_UINT16, &port, - DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) { + switch (event) { + case AVAHI_RESOLVER_FOUND: { + int j; + int32_t interface, protocol, aprotocol; + uint32_t flags; + char *name, *type, *domain, *host, *address; + uint16_t port; + DBusMessageIter iter, sub; + AvahiAddress a; - fprintf(stderr, "Failed to parse resolver event.\n"); - goto fail; - } + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &type, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_STRING, &host, + DBUS_TYPE_INT32, &aprotocol, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_UINT16, &port, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + + fprintf(stderr, "Failed to parse resolver event.\n"); + goto fail; + } - dbus_message_iter_init(message, &iter); + dbus_message_iter_init(message, &iter); - for (j = 0; j < 9; j++) - dbus_message_iter_next(&iter); + for (j = 0; j < 9; j++) + dbus_message_iter_next(&iter); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || - dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_ARRAY) { - fprintf(stderr, "Error parsing service resolving message\n"); - goto fail; - } + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || + dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_ARRAY) { + fprintf(stderr, "Error parsing service resolving message\n"); + goto fail; + } - strlst = NULL; - dbus_message_iter_recurse(&iter, &sub); + strlst = NULL; + dbus_message_iter_recurse(&iter, &sub); - for (;;) { - DBusMessageIter sub2; - int at; + for (;;) { + DBusMessageIter sub2; + int at; - if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID) - break; + if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID) + break; - assert(at == DBUS_TYPE_ARRAY); + assert(at == DBUS_TYPE_ARRAY); - if (dbus_message_iter_get_element_type(&sub) != DBUS_TYPE_BYTE) { - fprintf(stderr, "Error parsing service resolving message\n"); - goto fail; - } + if (dbus_message_iter_get_element_type(&sub) != DBUS_TYPE_BYTE) { + fprintf(stderr, "Error parsing service resolving message\n"); + goto fail; + } - dbus_message_iter_recurse(&sub, &sub2); + dbus_message_iter_recurse(&sub, &sub2); - if (dbus_message_iter_get_array_len(&sub2) > 0) { - uint8_t *k; - int n; + if (dbus_message_iter_get_array_len(&sub2) > 0) { + uint8_t *k; + int n; - dbus_message_iter_get_fixed_array(&sub2, &k, &n); - strlst = avahi_string_list_add_arbitrary(strlst, k, n); - } + dbus_message_iter_get_fixed_array(&sub2, &k, &n); + strlst = avahi_string_list_add_arbitrary(strlst, k, n); + } - dbus_message_iter_next(&sub); - } + dbus_message_iter_next(&sub); + } - dbus_message_iter_next(&iter); + dbus_message_iter_next(&iter); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32) { - fprintf(stderr, "Failed to parse resolver event.\n"); - goto fail; - } + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32) { + fprintf(stderr, "Failed to parse resolver event.\n"); + goto fail; + } - dbus_message_iter_get_basic(&iter, &flags); + dbus_message_iter_get_basic(&iter, &flags); - assert(address); - if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) { - fprintf(stderr, "Failed to parse address\n"); - goto fail; - } + assert(address); + if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) { + fprintf(stderr, "Failed to parse address\n"); + goto fail; + } - r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, type, domain, host, &a, port, strlst, (AvahiLookupResultFlags) flags, r->userdata); + r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, type, domain, host, &a, port, strlst, (AvahiLookupResultFlags) flags, r->userdata); - avahi_string_list_free(strlst); - - } else - r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, r->userdata); + avahi_string_list_free(strlst); + break; + } + + case AVAHI_RESOLVER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse resolver event.\n"); + goto fail; + } + + avahi_client_set_errno(r->client, avahi_error_dbus_to_number(etxt)); + r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, r->userdata); + break; + } + } return DBUS_HANDLER_RESULT_HANDLED; @@ -324,36 +342,54 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso if (!r) goto fail; - if (event == AVAHI_RESOLVER_FOUND) { - int32_t interface, protocol, aprotocol; - uint32_t flags; - char *name, *address; - AvahiAddress a; - - if (!dbus_message_get_args( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_INT32, &aprotocol, - DBUS_TYPE_STRING, &address, - DBUS_TYPE_UINT32, &flags, - DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) { - fprintf(stderr, "Failed to parse resolver event.\n"); - goto fail; + switch (event) { + case AVAHI_RESOLVER_FOUND: { + int32_t interface, protocol, aprotocol; + uint32_t flags; + char *name, *address; + AvahiAddress a; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_INT32, &aprotocol, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse resolver event.\n"); + goto fail; + } + + assert(address); + if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) { + fprintf(stderr, "Failed to parse address\n"); + goto fail; + } + + r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, &a, (AvahiLookupResultFlags) flags, r->userdata); + break; } - - assert(address); - if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) { - fprintf(stderr, "Failed to parse address\n"); - goto fail; + + case AVAHI_RESOLVER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse resolver event.\n"); + goto fail; + } + + avahi_client_set_errno(r->client, avahi_error_dbus_to_number(etxt)); + r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, 0, r->userdata); + break; } - - r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, &a, (AvahiLookupResultFlags) flags, r->userdata); - - } else - r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, NULL, 0, r->userdata); + } return DBUS_HANDLER_RESULT_HANDLED; @@ -516,35 +552,54 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv if (!r) goto fail; - if (event == AVAHI_RESOLVER_FOUND) { - int32_t interface, protocol, aprotocol; - uint32_t flags; - char *name, *address; - AvahiAddress a; - - if (!dbus_message_get_args( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_INT32, &aprotocol, - DBUS_TYPE_STRING, &address, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_UINT32, &flags, - DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) { - fprintf(stderr, "Failed to parse resolver event.\n"); - goto fail; + switch (event) { + case AVAHI_RESOLVER_FOUND: { + int32_t interface, protocol, aprotocol; + uint32_t flags; + char *name, *address; + AvahiAddress a; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_INT32, &aprotocol, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse resolver event.\n"); + goto fail; + } + + assert(address); + if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) { + fprintf(stderr, "Failed to parse address\n"); + goto fail; + } + + r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, (AvahiProtocol) aprotocol, &a, name, (AvahiLookupResultFlags) flags, r->userdata); + break; } - - assert(address); - if (!avahi_address_parse(address, (AvahiProtocol) aprotocol, &a)) { - fprintf(stderr, "Failed to parse address\n"); - goto fail; + + case AVAHI_RESOLVER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse resolver event.\n"); + goto fail; + } + + avahi_client_set_errno(r->client, avahi_error_dbus_to_number(etxt)); + r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, AVAHI_PROTO_UNSPEC, NULL, NULL, 0, r->userdata); + break; } - - r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, (AvahiProtocol) aprotocol, &a, name, (AvahiLookupResultFlags) flags, r->userdata); - } else - r->callback(r, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, AVAHI_PROTO_UNSPEC, NULL, NULL, 0, r->userdata); + } return DBUS_HANDLER_RESULT_HANDLED; |