From 6b391bb81f0dce0193a722254016b26c12a17643 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 18 Oct 2005 19:52:03 +0000 Subject: * remove AVAHI_PUBLISH_IS_PROXY, it was a bad idea * drop avahi_service_is_service_local(), avahi_client_is_service_local() * add new lookup result flags AVAHI_LOOKUP_RESULT_OUR_OWN and AVAHI_LOOKUP_RESULT_LOCAL * remove avahi_address_resolver_new() and replace it by avahi_address_resolver_new_a() * avahi-client: save query data in browse/resolve objects so that we can return it on failure * other cleanups git-svn-id: file:///home/lennart/svn/public/avahi/trunk@811 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-client/browser.c | 61 ++++++++++++++++++++++++++++------- avahi-client/client-test.c | 8 ++--- avahi-client/client.c | 67 --------------------------------------- avahi-client/client.h | 3 -- avahi-client/entrygroup.c | 1 - avahi-client/internal.h | 23 ++++++++++++++ avahi-client/lookup.h | 14 +------- avahi-client/resolver.c | 79 ++++++++++++++++++++++++++++------------------ 8 files changed, 126 insertions(+), 130 deletions(-) (limited to 'avahi-client') diff --git a/avahi-client/browser.c b/avahi-client/browser.c index bdbd8c5..122d6f2 100644 --- a/avahi-client/browser.c +++ b/avahi-client/browser.c @@ -77,6 +77,8 @@ AvahiDomainBrowser* avahi_domain_browser_new( db->callback = callback; db->userdata = userdata; db->path = NULL; + db->interface = interface; + db->protocol = protocol; AVAHI_LLIST_PREPEND(AvahiDomainBrowser, domain_browsers, client->domain_browsers, db); @@ -147,8 +149,7 @@ fail: return NULL; } -AvahiClient* avahi_domain_browser_get_client (AvahiDomainBrowser *b) -{ +AvahiClient* avahi_domain_browser_get_client (AvahiDomainBrowser *b) { assert(b); return b->client; } @@ -176,7 +177,7 @@ DBusHandlerResult avahi_domain_browser_event (AvahiClient *client, AvahiBrowserE DBusError error; const char *path; char *domain = NULL; - int32_t interface = AVAHI_IF_UNSPEC, protocol = AVAHI_PROTO_UNSPEC; + int32_t interface, protocol; uint32_t flags = 0; assert(client); @@ -194,6 +195,9 @@ DBusHandlerResult avahi_domain_browser_event (AvahiClient *client, AvahiBrowserE if (!db) goto fail; + interface = db->interface; + protocol = db->protocol; + switch (event) { case AVAHI_BROWSER_NEW: case AVAHI_BROWSER_REMOVE: @@ -281,9 +285,18 @@ AvahiServiceTypeBrowser* avahi_service_type_browser_new( b->callback = callback; b->userdata = userdata; b->path = NULL; + b->domain = NULL; + b->interface = interface; + b->protocol = protocol; AVAHI_LLIST_PREPEND(AvahiServiceTypeBrowser, service_type_browsers, client->service_type_browsers, b); + if (domain[0]) + if (!(b->domain = avahi_strdup(domain))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + if (!(message = dbus_message_new_method_call (AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "ServiceTypeBrowserNew"))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -349,8 +362,7 @@ fail: return NULL; } -AvahiClient* avahi_service_type_browser_get_client (AvahiServiceTypeBrowser *b) -{ +AvahiClient* avahi_service_type_browser_get_client (AvahiServiceTypeBrowser *b) { assert(b); return b->client; } @@ -368,6 +380,7 @@ int avahi_service_type_browser_free (AvahiServiceTypeBrowser *b) { AVAHI_LLIST_REMOVE(AvahiServiceTypeBrowser, service_type_browsers, b->client->service_type_browsers, b); avahi_free(b->path); + avahi_free(b->domain); avahi_free(b); return r; } @@ -376,8 +389,8 @@ DBusHandlerResult avahi_service_type_browser_event (AvahiClient *client, AvahiBr AvahiServiceTypeBrowser *b = NULL; DBusError error; const char *path; - char *domain = NULL, *type = NULL; - int32_t interface = AVAHI_IF_UNSPEC, protocol = AVAHI_PROTO_UNSPEC; + char *domain, *type = NULL; + int32_t interface, protocol; uint32_t flags = 0; assert(client); @@ -394,6 +407,11 @@ DBusHandlerResult avahi_service_type_browser_event (AvahiClient *client, AvahiBr if (!b) goto fail; + + domain = b->domain; + interface = b->interface; + protocol = b->protocol; + switch (event) { case AVAHI_BROWSER_NEW: case AVAHI_BROWSER_REMOVE: @@ -483,9 +501,23 @@ AvahiServiceBrowser* avahi_service_browser_new( b->callback = callback; b->userdata = userdata; b->path = NULL; + b->type = b->domain = NULL; + b->interface = interface; + b->protocol = protocol; AVAHI_LLIST_PREPEND(AvahiServiceBrowser, service_browsers, client->service_browsers, b); + if (!(b->type = avahi_strdup(type))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + + if (domain && domain[0]) + if (!(b->domain = avahi_strdup(domain))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + if (!(message = dbus_message_new_method_call (AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "ServiceBrowserNew"))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -551,8 +583,7 @@ fail: return NULL; } -AvahiClient* avahi_service_browser_get_client (AvahiServiceBrowser *b) -{ +AvahiClient* avahi_service_browser_get_client (AvahiServiceBrowser *b) { assert(b); return b->client; } @@ -570,17 +601,18 @@ int avahi_service_browser_free (AvahiServiceBrowser *b) { AVAHI_LLIST_REMOVE(AvahiServiceBrowser, service_browsers, b->client->service_browsers, b); avahi_free(b->path); + avahi_free(b->type); + avahi_free(b->domain); avahi_free(b); return r; } - DBusHandlerResult avahi_service_browser_event(AvahiClient *client, AvahiBrowserEvent event, DBusMessage *message) { AvahiServiceBrowser *b = NULL; DBusError error; const char *path; - char *name = NULL, *type = NULL, *domain = NULL; - int32_t interface = AVAHI_IF_UNSPEC, protocol = AVAHI_PROTO_UNSPEC; + char *name = NULL, *type, *domain; + int32_t interface, protocol; uint32_t flags = 0; dbus_error_init (&error); @@ -595,6 +627,11 @@ DBusHandlerResult avahi_service_browser_event(AvahiClient *client, AvahiBrowserE if (!b) goto fail; + type = b->type; + domain = b->domain; + interface = b->interface; + protocol = b->protocol; + switch (event) { case AVAHI_BROWSER_NEW: case AVAHI_BROWSER_REMOVE: diff --git a/avahi-client/client-test.c b/avahi-client/client-test.c index 076fb3b..f9913e6 100644 --- a/avahi-client/client-test.c +++ b/avahi-client/client-test.c @@ -33,6 +33,7 @@ #include #include #include +#include static const AvahiPoll *poll_api = NULL; static AvahiSimplePoll *simple_poll = NULL; @@ -129,7 +130,6 @@ static void avahi_address_resolver_callback ( AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, - AvahiProtocol aprotocol, const AvahiAddress *address, const char *name, AvahiLookupResultFlags flags, @@ -141,7 +141,7 @@ static void avahi_address_resolver_callback ( return; } avahi_address_snprint (addr, sizeof (addr), address); - printf ("ADDRESS-RESOLVER: Callback on AddressResolver, interface (%d), protocol (%d), even (%d), aprotocol (%d), address (%s), name (%s), data(%s)\n", interface, protocol, event, aprotocol, addr, name, (char*) userdata); + printf ("ADDRESS-RESOLVER: Callback on AddressResolver, interface (%d), protocol (%d), even (%d), address (%s), name (%s), data(%s)\n", interface, protocol, event, addr, name, (char*) userdata); } static void avahi_host_name_resolver_callback ( @@ -163,7 +163,7 @@ static void avahi_host_name_resolver_callback ( return; } client = avahi_host_name_resolver_get_client (r); - ar = avahi_address_resolver_new_a (client, interface, protocol, a, 0, avahi_address_resolver_callback, "omghai6u"); + ar = avahi_address_resolver_new(client, interface, protocol, a, 0, avahi_address_resolver_callback, "omghai6u"); if (ar) { printf ("Succesfully created address resolver object\n"); @@ -293,7 +293,7 @@ int main (int argc, char *argv[]) { group2 = avahi_entry_group_new (avahi, avahi_entry_group2_callback, "omghai222"); if ((error = avahi_entry_group_add_address (group2, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "test-mdns.local.", aar)) < 0) { - printf ("*** failed to add address to entry group: %s\n", avahi_strerror (ret)); + printf ("*** failed to add address to entry group: %s\n", avahi_strerror (error)); avahi_entry_group_free (group2); } else { printf ("*** success, added address\n"); diff --git a/avahi-client/client.c b/avahi-client/client.c index 8b0d957..8bc515e 100644 --- a/avahi-client/client.c +++ b/avahi-client/client.c @@ -725,70 +725,3 @@ fail: return AVAHI_SERVICE_COOKIE_INVALID; } - -int avahi_client_is_service_local(AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *name, const char *type, const char *domain) { - DBusMessage *message = NULL, *reply = NULL; - DBusError error; - int32_t i_interface, i_protocol; - int b; - - assert(client); - assert(name); - assert(type); - assert(domain); - - if (client->state == AVAHI_CLIENT_DISCONNECTED) { - avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); - return AVAHI_SERVICE_COOKIE_INVALID; - } - - dbus_error_init (&error); - - if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "IsServiceLocal"))) { - avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); - goto fail; - } - - i_interface = (int32_t) interface; - i_protocol = (int32_t) protocol; - - if (!dbus_message_append_args( - message, - DBUS_TYPE_INT32, &i_interface, - DBUS_TYPE_INT32, &i_protocol, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &type, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_INVALID)) { - avahi_client_set_errno (client, AVAHI_ERR_NO_MEMORY); - goto fail; - } - - reply = dbus_connection_send_with_reply_and_block (client->bus, message, -1, &error); - - if (!reply || dbus_error_is_set (&error)) - goto fail; - - if (!dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, &b, DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) - goto fail; - - dbus_message_unref(message); - dbus_message_unref(reply); - - return b; - -fail: - - if (message) - dbus_message_unref(message); - if (reply) - dbus_message_unref(reply); - - if (dbus_error_is_set(&error)) { - avahi_client_set_dbus_error(client, &error); - dbus_error_free(&error); - } - - return AVAHI_SERVICE_COOKIE_INVALID; -} diff --git a/avahi-client/client.h b/avahi-client/client.h index 8a59ca1..d00cc8b 100644 --- a/avahi-client/client.h +++ b/avahi-client/client.h @@ -82,9 +82,6 @@ int avahi_client_errno (AvahiClient*); /** Return the local service cookie. returns AVAHI_SERVICE_COOKIE_INVALID on failure. */ uint32_t avahi_client_get_local_service_cookie(AvahiClient *client); -/** Return 1 if the specified service is a registered locally, negative on failure, 0 otherwise. */ -int avahi_client_is_service_local(AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *name, const char *type, const char *domain); - #ifndef DOXYGEN_SHOULD_SKIP_THIS AVAHI_C_DECL_END #endif diff --git a/avahi-client/entrygroup.c b/avahi-client/entrygroup.c index 0b7d217..9d58afb 100644 --- a/avahi-client/entrygroup.c +++ b/avahi-client/entrygroup.c @@ -336,7 +336,6 @@ static int append_string_list(DBusMessage *message, AvahiStringList *txt) { AvahiStringList *p; assert(message); - assert(txt); dbus_message_iter_init_append(message, &iter); diff --git a/avahi-client/internal.h b/avahi-client/internal.h index 56aaaae..c9c9dc7 100644 --- a/avahi-client/internal.h +++ b/avahi-client/internal.h @@ -66,6 +66,9 @@ struct AvahiDomainBrowser { AvahiDomainBrowserCallback callback; void *userdata; AVAHI_LLIST_FIELDS(AvahiDomainBrowser, domain_browsers); + + AvahiIfIndex interface; + AvahiProtocol protocol; }; struct AvahiServiceBrowser { @@ -74,6 +77,10 @@ struct AvahiServiceBrowser { AvahiServiceBrowserCallback callback; void *userdata; AVAHI_LLIST_FIELDS(AvahiServiceBrowser, service_browsers); + + char *type, *domain; + AvahiIfIndex interface; + AvahiProtocol protocol; }; struct AvahiServiceTypeBrowser { @@ -82,6 +89,10 @@ struct AvahiServiceTypeBrowser { AvahiServiceTypeBrowserCallback callback; void *userdata; AVAHI_LLIST_FIELDS(AvahiServiceTypeBrowser, service_type_browsers); + + char *domain; + AvahiIfIndex interface; + AvahiProtocol protocol; }; struct AvahiServiceResolver { @@ -90,6 +101,10 @@ struct AvahiServiceResolver { AvahiServiceResolverCallback callback; void *userdata; AVAHI_LLIST_FIELDS(AvahiServiceResolver, service_resolvers); + + char *name, *type, *domain; + AvahiIfIndex interface; + AvahiProtocol protocol; }; struct AvahiHostNameResolver { @@ -98,6 +113,10 @@ struct AvahiHostNameResolver { AvahiHostNameResolverCallback callback; void *userdata; AVAHI_LLIST_FIELDS(AvahiHostNameResolver, host_name_resolvers); + + char *host_name; + AvahiIfIndex interface; + AvahiProtocol protocol; }; struct AvahiAddressResolver { @@ -106,6 +125,10 @@ struct AvahiAddressResolver { AvahiAddressResolverCallback callback; void *userdata; AVAHI_LLIST_FIELDS(AvahiAddressResolver, address_resolvers); + + AvahiAddress address; + AvahiIfIndex interface; + AvahiProtocol protocol; }; int avahi_client_set_errno (AvahiClient *client, int error); diff --git a/avahi-client/lookup.h b/avahi-client/lookup.h index 659700e..bf19479 100644 --- a/avahi-client/lookup.h +++ b/avahi-client/lookup.h @@ -102,13 +102,11 @@ typedef void (*AvahiAddressResolverCallback) ( AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, - AvahiProtocol aprotocol, const AvahiAddress *a, const char *name, AvahiLookupResultFlags flags, void *userdata); - /** Browse for domains on the local network */ AvahiDomainBrowser* avahi_domain_browser_new ( AvahiClient *client, @@ -195,18 +193,8 @@ AvahiClient* avahi_host_name_resolver_get_client (AvahiHostNameResolver *); /** Free a hostname resolver object */ int avahi_host_name_resolver_free(AvahiHostNameResolver *r); -/** Create a new address resolver object from an address string. Set aprotocol to AF_UNSPEC for protocol detection. */ -AvahiAddressResolver * avahi_address_resolver_new( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const char *address, - AvahiLookupFlags flags, - AvahiAddressResolverCallback callback, - void *userdata); - /** Create a new address resolver object from an AvahiAddress object */ -AvahiAddressResolver* avahi_address_resolver_new_a( +AvahiAddressResolver* avahi_address_resolver_new( AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, diff --git a/avahi-client/resolver.c b/avahi-client/resolver.c index 14d6aca..d06c43c 100644 --- a/avahi-client/resolver.c +++ b/avahi-client/resolver.c @@ -165,7 +165,7 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv } 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); + r->callback(r, r->interface, r->protocol, event, r->name, r->type, r->domain, NULL, NULL, 0, NULL, 0, r->userdata); break; } } @@ -223,9 +223,30 @@ AvahiServiceResolver * avahi_service_resolver_new( r->callback = callback; r->userdata = userdata; r->path = NULL; + r->name = r->type = r->domain = NULL; + r->interface = interface; + r->protocol = protocol; AVAHI_LLIST_PREPEND(AvahiServiceResolver, service_resolvers, client->service_resolvers, r); + if (name && name[0]) + if (!(r->name = avahi_strdup(name))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + + if (!(r->type = avahi_strdup(type))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + + if (domain && domain[0]) + if (!(r->domain = avahi_strdup(domain))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + + if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "ServiceResolverNew"))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -316,6 +337,9 @@ int avahi_service_resolver_free(AvahiServiceResolver *r) { AVAHI_LLIST_REMOVE(AvahiServiceResolver, service_resolvers, client->service_resolvers, r); avahi_free(r->path); + avahi_free(r->name); + avahi_free(r->type); + avahi_free(r->domain); avahi_free(r); return ret; @@ -387,7 +411,7 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso } 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); + r->callback(r, r->interface, r->protocol, event, r->host_name, NULL, 0, r->userdata); break; } } @@ -436,9 +460,17 @@ AvahiHostNameResolver * avahi_host_name_resolver_new( r->callback = callback; r->userdata = userdata; r->path = NULL; + r->interface = interface; + r->protocol = protocol; + r->host_name = NULL; AVAHI_LLIST_PREPEND(AvahiHostNameResolver, host_name_resolvers, client->host_name_resolvers, r); + if (!(r->host_name = avahi_strdup(name))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "HostNameResolverNew"))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -520,6 +552,7 @@ int avahi_host_name_resolver_free(AvahiHostNameResolver *r) { AVAHI_LLIST_REMOVE(AvahiHostNameResolver, host_name_resolvers, client->host_name_resolvers, r); avahi_free(r->path); + avahi_free(r->host_name); avahi_free(r); return ret; @@ -580,7 +613,7 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv goto fail; } - r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, (AvahiProtocol) aprotocol, &a, name, (AvahiLookupResultFlags) flags, r->userdata); + r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, &a, name, (AvahiLookupResultFlags) flags, r->userdata); break; } @@ -597,7 +630,7 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv } 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); + r->callback(r, r->interface, r->protocol, event, &r->address, NULL, 0, r->userdata); break; } } @@ -609,35 +642,11 @@ fail: return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } -AvahiAddressResolver * avahi_address_resolver_new_a( - AvahiClient *client, - AvahiIfIndex interface, - AvahiProtocol protocol, - const AvahiAddress *a, - AvahiLookupFlags flags, - AvahiAddressResolverCallback callback, - void *userdata) { - - char addr[AVAHI_ADDRESS_STR_MAX]; - - assert (a); - - if (!avahi_address_snprint (addr, sizeof (addr), a)) { - avahi_client_set_errno(client, AVAHI_ERR_INVALID_ADDRESS); - return NULL; - } - - return avahi_address_resolver_new( - client, interface, protocol, - addr, flags, - callback, userdata); -} - AvahiAddressResolver * avahi_address_resolver_new( AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, - const char *address, + const AvahiAddress *a, AvahiLookupFlags flags, AvahiAddressResolverCallback callback, void *userdata) { @@ -648,11 +657,18 @@ AvahiAddressResolver * avahi_address_resolver_new( int32_t i_interface, i_protocol; uint32_t u_flags; char *path; - + char addr[AVAHI_ADDRESS_STR_MAX], *address = addr; + assert(client); + assert(a); dbus_error_init (&error); + if (!avahi_address_snprint (addr, sizeof(addr), a)) { + avahi_client_set_errno(client, AVAHI_ERR_INVALID_ADDRESS); + return NULL; + } + if (client->state == AVAHI_CLIENT_DISCONNECTED) { avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); goto fail; @@ -667,6 +683,9 @@ AvahiAddressResolver * avahi_address_resolver_new( r->callback = callback; r->userdata = userdata; r->path = NULL; + r->interface = interface; + r->protocol = protocol; + r->address = *a; AVAHI_LLIST_PREPEND(AvahiAddressResolver, address_resolvers, client->address_resolvers, r); -- cgit