X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-client%2Fresolver.c;h=6ee15e93f2434516734c05a86eab11ec255c62e7;hb=7a5b2f69af7d36d6cd4153142f125fa011784e03;hp=c51a3bec379f066236ca0e6037d5387ce9c8ca8c;hpb=feae35a24a8d234ae5a4eb629cd09c905f74dc04;p=catta diff --git a/avahi-client/resolver.c b/avahi-client/resolver.c index c51a3be..6ee15e9 100644 --- a/avahi-client/resolver.c +++ b/avahi-client/resolver.c @@ -1,18 +1,16 @@ -/* $Id$ */ - /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 @@ -48,7 +46,7 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv assert(client); assert(message); - + dbus_error_init (&error); if (!(path = dbus_message_get_path(message))) @@ -70,7 +68,7 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv uint16_t port; DBusMessageIter iter, sub; AvahiAddress a; - + if (!dbus_message_get_args( message, &error, DBUS_TYPE_INT32, &interface, @@ -84,49 +82,48 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv 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); - + 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; } - + strlst = NULL; dbus_message_iter_recurse(&iter, &sub); - + for (;;) { DBusMessageIter sub2; int at; - + const uint8_t *k; + int n; + if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID) break; - + 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; } - + dbus_message_iter_recurse(&sub, &sub2); - if (dbus_message_iter_get_array_len(&sub2) > 0) { - uint8_t *k; - int n; - - dbus_message_iter_get_fixed_array(&sub2, &k, &n); + k = NULL; n = 0; + dbus_message_iter_get_fixed_array(&sub2, &k, &n); + if (k && n > 0) strlst = avahi_string_list_add_arbitrary(strlst, k, n); - } - + dbus_message_iter_next(&sub); } @@ -138,22 +135,23 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv } dbus_message_iter_get_basic(&iter, &flags); - + assert(address); - avahi_address_parse(address, (AvahiProtocol) aprotocol, &a); if (address[0] == 0) address = NULL; - - r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, type, domain, host, &a, port, strlst, (AvahiLookupResultFlags) flags, r->userdata); - + else + avahi_address_parse(address, (AvahiProtocol) aprotocol, &a); + + r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, name, type, domain, host, address ? &a : NULL, port, strlst, (AvahiLookupResultFlags) flags, 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, @@ -162,16 +160,16 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv 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); + r->callback(r, r->interface, r->protocol, event, r->name, r->type, r->domain, NULL, NULL, 0, NULL, 0, r->userdata); break; } } return DBUS_HANDLER_RESULT_HANDLED; - + fail: dbus_error_free (&error); avahi_string_list_free(strlst); @@ -196,7 +194,7 @@ AvahiServiceResolver * avahi_service_resolver_new( int32_t i_interface, i_protocol, i_aprotocol; uint32_t u_flags; char *path; - + assert(client); assert(type); @@ -205,10 +203,10 @@ AvahiServiceResolver * avahi_service_resolver_new( if (!name) name = ""; - + dbus_error_init (&error); - if (client->state == AVAHI_CLIENT_DISCONNECTED) { + if (!avahi_client_is_connected(client)) { avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); goto fail; } @@ -222,9 +220,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; @@ -269,13 +288,13 @@ AvahiServiceResolver * avahi_service_resolver_new( avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; } - + dbus_message_unref(message); dbus_message_unref(reply); return r; - + fail: if (dbus_error_is_set(&error)) { @@ -285,13 +304,13 @@ fail: if (r) avahi_service_resolver_free(r); - + if (message) dbus_message_unref(message); if (reply) dbus_message_unref(reply); - + return NULL; } @@ -309,12 +328,15 @@ int avahi_service_resolver_free(AvahiServiceResolver *r) { assert(r); client = r->client; - if (r->path && client->state != AVAHI_CLIENT_DISCONNECTED) + if (r->path && avahi_client_is_connected(client)) ret = avahi_client_simple_method_call(client, r->path, AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER, "Free"); 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; @@ -329,7 +351,7 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso assert(client); assert(message); - + dbus_error_init (&error); if (!(path = dbus_message_get_path(message))) @@ -348,7 +370,7 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso uint32_t flags; char *name, *address; AvahiAddress a; - + if (!dbus_message_get_args( message, &error, DBUS_TYPE_INT32, &interface, @@ -362,20 +384,20 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso 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; } - + case AVAHI_RESOLVER_FAILURE: { char *etxt; - + if (!dbus_message_get_args( message, &error, DBUS_TYPE_STRING, &etxt, @@ -384,15 +406,15 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso 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); + r->callback(r, r->interface, r->protocol, event, r->host_name, NULL, 0, r->userdata); break; } } return DBUS_HANDLER_RESULT_HANDLED; - + fail: dbus_error_free (&error); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; @@ -415,13 +437,13 @@ AvahiHostNameResolver * avahi_host_name_resolver_new( int32_t i_interface, i_protocol, i_aprotocol; uint32_t u_flags; char *path; - + assert(client); assert(name); dbus_error_init (&error); - if (client->state == AVAHI_CLIENT_DISCONNECTED) { + if (!avahi_client_is_connected(client)) { avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); goto fail; } @@ -435,9 +457,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; @@ -485,7 +515,7 @@ AvahiHostNameResolver * avahi_host_name_resolver_new( dbus_message_unref(reply); return r; - + fail: if (dbus_error_is_set(&error)) { @@ -495,7 +525,7 @@ fail: if (r) avahi_host_name_resolver_free(r); - + if (message) dbus_message_unref(message); @@ -513,12 +543,13 @@ int avahi_host_name_resolver_free(AvahiHostNameResolver *r) { assert(r); client = r->client; - if (r->path && client->state != AVAHI_CLIENT_DISCONNECTED) + if (r->path && avahi_client_is_connected(client)) ret = avahi_client_simple_method_call(client, r->path, AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER, "Free"); 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; @@ -539,7 +570,7 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv assert(client); assert(message); - + dbus_error_init (&error); if (!(path = dbus_message_get_path(message))) @@ -558,7 +589,7 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv uint32_t flags; char *name, *address; AvahiAddress a; - + if (!dbus_message_get_args( message, &error, DBUS_TYPE_INT32, &interface, @@ -572,20 +603,20 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv 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); + + r->callback(r, (AvahiIfIndex) interface, (AvahiProtocol) protocol, AVAHI_RESOLVER_FOUND, &a, name, (AvahiLookupResultFlags) flags, r->userdata); break; } case AVAHI_RESOLVER_FAILURE: { char *etxt; - + if (!dbus_message_get_args( message, &error, DBUS_TYPE_STRING, &etxt, @@ -594,21 +625,21 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv 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); + r->callback(r, r->interface, r->protocol, event, &r->address, NULL, 0, r->userdata); break; } } return DBUS_HANDLER_RESULT_HANDLED; - + fail: dbus_error_free (&error); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } -AvahiAddressResolver * avahi_address_resolver_new_a( +AvahiAddressResolver * avahi_address_resolver_new( AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, @@ -617,42 +648,25 @@ AvahiAddressResolver * avahi_address_resolver_new_a( AvahiAddressResolverCallback callback, void *userdata) { - char addr[64]; - - 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, - AvahiLookupFlags flags, - AvahiAddressResolverCallback callback, - void *userdata) { - DBusError error; AvahiAddressResolver *r = NULL; DBusMessage *message = NULL, *reply = NULL; 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 (client->state == AVAHI_CLIENT_DISCONNECTED) { + if (!avahi_address_snprint (addr, sizeof(addr), a)) { + avahi_client_set_errno(client, AVAHI_ERR_INVALID_ADDRESS); + return NULL; + } + + if (!avahi_client_is_connected(client)) { avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); goto fail; } @@ -666,7 +680,10 @@ 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); if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "AddressResolverNew"))) { @@ -701,7 +718,7 @@ AvahiAddressResolver * avahi_address_resolver_new( avahi_client_set_errno(client, AVAHI_ERR_DBUS_ERROR); goto fail; } - + if (!(r->path = avahi_strdup(path))) { /* FIXME: We don't remove the object on the server side */ @@ -714,7 +731,7 @@ AvahiAddressResolver * avahi_address_resolver_new( dbus_message_unref(reply); return r; - + fail: if (dbus_error_is_set(&error)) { @@ -724,7 +741,7 @@ fail: if (r) avahi_address_resolver_free(r); - + if (message) dbus_message_unref(message); @@ -748,7 +765,7 @@ int avahi_address_resolver_free(AvahiAddressResolver *r) { assert(r); client = r->client; - if (r->path && client->state != AVAHI_CLIENT_DISCONNECTED) + if (r->path && avahi_client_is_connected(client)) ret = avahi_client_simple_method_call(client, r->path, AVAHI_DBUS_INTERFACE_ADDRESS_RESOLVER, "Free"); AVAHI_LLIST_REMOVE(AvahiAddressResolver, address_resolvers, client->address_resolvers, r);