From bb14e0a8aa3173c8a6d80b1a9c8b300a452ee9f1 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 12 Oct 2005 02:37:08 +0000 Subject: * drop AVAHI_RESOLVER_TIMEOUT, AVAHI_RESOLVER_NOT_FOUND and AVAHI_BROWSER_NOT_FOUND, use AVAHI_xxx_FAILURE instead * set the client/server errno variable when AVAHI_xxx_FAILURE happens * update DBUS interface accordingly, pass errno value with Failure events * Pass DNS return codes to the app by wrapping them in avahi error codes git-svn-id: file:///home/lennart/svn/public/avahi/trunk@732 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-core/avahi-test.c | 3 --- avahi-core/browse-dns-server.c | 3 --- avahi-core/browse.c | 4 ++-- avahi-core/querier-test.c | 1 - avahi-core/resolve-address.c | 14 +++++--------- avahi-core/resolve-host-name.c | 8 +++----- avahi-core/resolve-service.c | 12 +++--------- avahi-core/wide-area.c | 32 +++++++++++++++++++++++++++++++- 8 files changed, 44 insertions(+), 33 deletions(-) (limited to 'avahi-core') diff --git a/avahi-core/avahi-test.c b/avahi-core/avahi-test.c index 7ed5991..46e68d5 100644 --- a/avahi-core/avahi-test.c +++ b/avahi-core/avahi-test.c @@ -71,7 +71,6 @@ static const char *browser_event_to_string(AvahiBrowserEvent event) { case AVAHI_BROWSER_CACHE_EXHAUSTED : return "CACHE_EXHAUSTED"; case AVAHI_BROWSER_ALL_FOR_NOW : return "ALL_FOR_NOW"; case AVAHI_BROWSER_FAILURE : return "FAILURE"; - case AVAHI_BROWSER_NOT_FOUND : return "NOT_FOUND"; } abort(); @@ -80,8 +79,6 @@ static const char *browser_event_to_string(AvahiBrowserEvent event) { static const char *resolver_event_to_string(AvahiResolverEvent event) { switch (event) { case AVAHI_RESOLVER_FOUND: return "FOUND"; - case AVAHI_RESOLVER_TIMEOUT: return "TIMEOUT"; - case AVAHI_RESOLVER_NOT_FOUND: return "NOT_FOUND"; case AVAHI_RESOLVER_FAILURE: return "FAILURE"; } abort(); diff --git a/avahi-core/browse-dns-server.c b/avahi-core/browse-dns-server.c index 52dafc2..2c907c3 100644 --- a/avahi-core/browse-dns-server.c +++ b/avahi-core/browse-dns-server.c @@ -128,9 +128,7 @@ static void host_name_resolver_callback( break; } - case AVAHI_RESOLVER_NOT_FOUND: case AVAHI_RESOLVER_FAILURE: - case AVAHI_RESOLVER_TIMEOUT: /* Ignore */ break; } @@ -215,7 +213,6 @@ static void record_browser_callback( } case AVAHI_BROWSER_FAILURE: - case AVAHI_BROWSER_NOT_FOUND: case AVAHI_BROWSER_ALL_FOR_NOW: case AVAHI_BROWSER_CACHE_EXHAUSTED: diff --git a/avahi-core/browse.c b/avahi-core/browse.c index 5617395..a133c62 100644 --- a/avahi-core/browse.c +++ b/avahi-core/browse.c @@ -222,7 +222,6 @@ static void lookup_wide_area_callback( abort(); case AVAHI_BROWSER_ALL_FOR_NOW: - case AVAHI_BROWSER_NOT_FOUND: case AVAHI_BROWSER_FAILURE: b->callback(b, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, flags, b->userdata); @@ -292,7 +291,6 @@ static void lookup_multicast_callback( break; case AVAHI_BROWSER_CACHE_EXHAUSTED: - case AVAHI_BROWSER_NOT_FOUND: case AVAHI_BROWSER_FAILURE: /* Not defined for multicast DNS */ abort(); @@ -464,6 +462,8 @@ static void defer_callback(AvahiTimeEvent *e, void *userdata) { 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 : AVAHI_LOOKUP_RESULT_MULTICAST, diff --git a/avahi-core/querier-test.c b/avahi-core/querier-test.c index 254ecbb..41efc2c 100644 --- a/avahi-core/querier-test.c +++ b/avahi-core/querier-test.c @@ -49,7 +49,6 @@ static const char *browser_event_to_string(AvahiBrowserEvent event) { case AVAHI_BROWSER_CACHE_EXHAUSTED : return "CACHE_EXHAUSTED"; case AVAHI_BROWSER_ALL_FOR_NOW : return "ALL_FOR_NOW"; case AVAHI_BROWSER_FAILURE : return "FAILURE"; - case AVAHI_BROWSER_NOT_FOUND : return "NOT_FOUND"; } abort(); diff --git a/avahi-core/resolve-address.c b/avahi-core/resolve-address.c index 704dab4..661982d 100644 --- a/avahi-core/resolve-address.c +++ b/avahi-core/resolve-address.c @@ -62,8 +62,6 @@ static void finish(AvahiSAddressResolver *r, AvahiResolverEvent event) { } switch (event) { - case AVAHI_RESOLVER_NOT_FOUND: - case AVAHI_RESOLVER_TIMEOUT: case AVAHI_RESOLVER_FAILURE: r->callback(r, r->interface, r->protocol, event, &r->address, NULL, r->flags, r->userdata); break; @@ -81,7 +79,8 @@ static void time_event_callback(AvahiTimeEvent *e, void *userdata) { assert(e); assert(r); - finish(r, AVAHI_RESOLVER_TIMEOUT); + avahi_server_set_errno(r->server, AVAHI_ERR_TIMEOUT); + finish(r, AVAHI_RESOLVER_FAILURE); } static void start_timeout(AvahiSAddressResolver *r) { @@ -155,7 +154,7 @@ static void record_browser_callback( case AVAHI_BROWSER_ALL_FOR_NOW: break; - case AVAHI_BROWSER_NOT_FOUND: + case AVAHI_BROWSER_FAILURE: if (r->retry_with_multicast) { r->retry_with_multicast = 0; @@ -169,12 +168,9 @@ static void record_browser_callback( } } - /* Fallthrough */ - - case AVAHI_BROWSER_FAILURE: r->flags = flags; - finish(r, event == AVAHI_BROWSER_NOT_FOUND ? AVAHI_RESOLVER_NOT_FOUND : AVAHI_RESOLVER_FAILURE); - + finish(r, AVAHI_RESOLVER_FAILURE); + break; } } diff --git a/avahi-core/resolve-host-name.c b/avahi-core/resolve-host-name.c index 6315dbb..a38c001 100644 --- a/avahi-core/resolve-host-name.c +++ b/avahi-core/resolve-host-name.c @@ -89,8 +89,6 @@ static void finish(AvahiSHostNameResolver *r, AvahiResolverEvent event) { } - case AVAHI_RESOLVER_TIMEOUT: - case AVAHI_RESOLVER_NOT_FOUND: case AVAHI_RESOLVER_FAILURE: r->callback(r, r->interface, r->protocol, event, r->host_name, NULL, r->flags, r->userdata); @@ -104,7 +102,8 @@ static void time_event_callback(AvahiTimeEvent *e, void *userdata) { assert(e); assert(r); - finish(r, AVAHI_RESOLVER_TIMEOUT); + avahi_server_set_errno(r->server, AVAHI_ERR_TIMEOUT); + finish(r, AVAHI_RESOLVER_FAILURE); } static void start_timeout(AvahiSHostNameResolver *r) { @@ -188,7 +187,6 @@ static void record_browser_callback( break; case AVAHI_BROWSER_FAILURE: - case AVAHI_BROWSER_NOT_FOUND: /* Stop browsers */ @@ -200,7 +198,7 @@ static void record_browser_callback( r->record_browser_a = r->record_browser_aaaa = NULL; r->flags = flags; - finish(r, event == AVAHI_BROWSER_FAILURE ? AVAHI_RESOLVER_FAILURE : AVAHI_RESOLVER_NOT_FOUND); + finish(r, AVAHI_RESOLVER_FAILURE); break; } } diff --git a/avahi-core/resolve-service.c b/avahi-core/resolve-service.c index 85ac3d5..a897546 100644 --- a/avahi-core/resolve-service.c +++ b/avahi-core/resolve-service.c @@ -81,8 +81,6 @@ static void finish(AvahiSServiceResolver *r, AvahiResolverEvent event) { switch (event) { case AVAHI_RESOLVER_FAILURE: - case AVAHI_RESOLVER_NOT_FOUND: - case AVAHI_RESOLVER_TIMEOUT: r->callback( r, @@ -151,9 +149,8 @@ static void time_event_callback(AvahiTimeEvent *e, void *userdata) { assert(e); assert(r); - avahi_log_debug("timeout"); - - finish(r, AVAHI_RESOLVER_TIMEOUT); + avahi_server_set_errno(r->server, AVAHI_ERR_TIMEOUT); + finish(r, AVAHI_RESOLVER_FAILURE); } static void start_timeout(AvahiSServiceResolver *r) { @@ -346,9 +343,7 @@ static void record_browser_callback( case AVAHI_BROWSER_ALL_FOR_NOW: break; - case AVAHI_BROWSER_NOT_FOUND: case AVAHI_BROWSER_FAILURE: - if (rr == r->record_browser_a && r->record_browser_aaaa) { /* We were looking for both AAAA and A, and the other query is still living, so we'll not die */ @@ -364,7 +359,6 @@ static void record_browser_callback( break; } - /* Hmm, everything's lost, tell the user */ if (r->record_browser_srv) @@ -378,7 +372,7 @@ static void record_browser_callback( r->record_browser_srv = r->record_browser_txt = r->record_browser_a = r->record_browser_aaaa = NULL; - finish(r, event == AVAHI_BROWSER_FAILURE ? AVAHI_RESOLVER_FAILURE : AVAHI_RESOLVER_NOT_FOUND); + finish(r, AVAHI_RESOLVER_FAILURE); break; } } diff --git a/avahi-core/wide-area.c b/avahi-core/wide-area.c index 8c8b962..1075084 100644 --- a/avahi-core/wide-area.c +++ b/avahi-core/wide-area.c @@ -29,6 +29,7 @@ #include #include +#include #include "server.h" #include "browse.h" @@ -173,6 +174,7 @@ static void sender_timeout_callback(AvahiTimeEvent *e, void *userdata) { if (l->n_send >= 6) { avahi_log_warn(__FILE__": Query timed out."); + avahi_server_set_errno(l->engine->server, AVAHI_ERR_TIMEOUT); l->callback(l->engine, AVAHI_BROWSER_FAILURE, AVAHI_LOOKUP_RESULT_WIDE_AREA, NULL, l->userdata); avahi_wide_area_lookup_free(l); return; @@ -447,6 +449,31 @@ finish: run_callbacks(e, r); } +static int map_dns_error(uint16_t error) { + static const int table[16] = { + AVAHI_OK, + AVAHI_ERR_DNS_FORMERR, + AVAHI_ERR_DNS_SERVFAIL, + AVAHI_ERR_DNS_NXDOMAIN, + AVAHI_ERR_DNS_NOTIMP, + AVAHI_ERR_DNS_REFUSED, + AVAHI_ERR_DNS_YXDOMAIN, + AVAHI_ERR_DNS_YXRRSET, + AVAHI_ERR_DNS_NXRRSET, + AVAHI_ERR_DNS_NOTAUTH, + AVAHI_ERR_DNS_NOTZONE, + AVAHI_ERR_INVALID_DNS_ERROR, + AVAHI_ERR_INVALID_DNS_ERROR, + AVAHI_ERR_INVALID_DNS_ERROR, + AVAHI_ERR_INVALID_DNS_ERROR, + AVAHI_ERR_INVALID_DNS_ERROR + }; + + assert(error <= 15); + + return table[error]; +} + static void handle_packet(AvahiWideAreaLookupEngine *e, AvahiDnsPacket *p, AvahiAddress *a) { AvahiWideAreaLookup *l = NULL; int i, r; @@ -470,8 +497,9 @@ static void handle_packet(AvahiWideAreaLookupEngine *e, AvahiDnsPacket *p, Avahi if ((r = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_FLAGS) & 15) != 0 || avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT) == 0) { + avahi_server_set_errno(e->server, r == 0 ? AVAHI_ERR_NOT_FOUND : map_dns_error(r)); /* Tell the user about the failure */ - final_event = r == 3 ? AVAHI_BROWSER_NOT_FOUND : AVAHI_BROWSER_FAILURE; + final_event = AVAHI_BROWSER_FAILURE; /* We go on here, since some of the records contained in the reply might be interesting in some way */ @@ -483,6 +511,7 @@ static void handle_packet(AvahiWideAreaLookupEngine *e, AvahiDnsPacket *p, Avahi if (!(k = avahi_dns_packet_consume_key(p, NULL))) { avahi_log_warn(__FILE__": Wide area response packet too short."); + avahi_server_set_errno(e->server, AVAHI_ERR_INVALID_PACKET); final_event = AVAHI_BROWSER_FAILURE; goto finish; } @@ -499,6 +528,7 @@ static void handle_packet(AvahiWideAreaLookupEngine *e, AvahiDnsPacket *p, Avahi if (!(rr = avahi_dns_packet_consume_record(p, NULL))) { avahi_log_warn(__FILE__": Wide area response packet too short (2)."); + avahi_server_set_errno(e->server, AVAHI_ERR_INVALID_PACKET); final_event = AVAHI_BROWSER_FAILURE; goto finish; } -- cgit