X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-client%2Fresolver.c;h=6ee15e93f2434516734c05a86eab11ec255c62e7;hb=e9f7d4faa2566d22ad1589438cdce51244a2ce4f;hp=23011342e87de9df0cbc9ee395e7bba91ceaa4ee;hpb=4e2113a7d5b702ff070e8220b32662bb00ae02dd;p=catta diff --git a/avahi-client/resolver.c b/avahi-client/resolver.c index 2301134..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,23 +135,23 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv } dbus_message_iter_get_basic(&iter, &flags); - + assert(address); if (address[0] == 0) address = NULL; 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, @@ -163,7 +160,7 @@ 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, r->interface, r->protocol, event, r->name, r->type, r->domain, NULL, NULL, 0, NULL, 0, r->userdata); break; @@ -172,7 +169,7 @@ DBusHandlerResult avahi_service_resolver_event (AvahiClient *client, AvahiResolv return DBUS_HANDLER_RESULT_HANDLED; - + fail: dbus_error_free (&error); avahi_string_list_free(strlst); @@ -197,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); @@ -206,10 +203,10 @@ AvahiServiceResolver * avahi_service_resolver_new( if (!name) name = ""; - + dbus_error_init (&error); - if (client->state == AVAHI_CLIENT_FAILURE) { + if (!avahi_client_is_connected(client)) { avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); goto fail; } @@ -226,7 +223,7 @@ AvahiServiceResolver * avahi_service_resolver_new( 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]) @@ -245,8 +242,8 @@ AvahiServiceResolver * avahi_service_resolver_new( 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; @@ -291,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)) { @@ -307,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; } @@ -331,7 +328,7 @@ int avahi_service_resolver_free(AvahiServiceResolver *r) { assert(r); client = r->client; - if (r->path && client->state != AVAHI_CLIENT_FAILURE) + 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); @@ -354,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))) @@ -373,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, @@ -387,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, @@ -409,7 +406,7 @@ 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, r->interface, r->protocol, event, r->host_name, NULL, 0, r->userdata); break; @@ -417,7 +414,7 @@ DBusHandlerResult avahi_host_name_resolver_event (AvahiClient *client, AvahiReso } return DBUS_HANDLER_RESULT_HANDLED; - + fail: dbus_error_free (&error); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; @@ -440,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_FAILURE) { + if (!avahi_client_is_connected(client)) { avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); goto fail; } @@ -463,7 +460,7 @@ AvahiHostNameResolver * avahi_host_name_resolver_new( 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))) { @@ -518,7 +515,7 @@ AvahiHostNameResolver * avahi_host_name_resolver_new( dbus_message_unref(reply); return r; - + fail: if (dbus_error_is_set(&error)) { @@ -528,7 +525,7 @@ fail: if (r) avahi_host_name_resolver_free(r); - + if (message) dbus_message_unref(message); @@ -546,7 +543,7 @@ int avahi_host_name_resolver_free(AvahiHostNameResolver *r) { assert(r); client = r->client; - if (r->path && client->state != AVAHI_CLIENT_FAILURE) + 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); @@ -573,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))) @@ -592,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, @@ -606,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, &a, name, (AvahiLookupResultFlags) flags, r->userdata); break; } case AVAHI_RESOLVER_FAILURE: { char *etxt; - + if (!dbus_message_get_args( message, &error, DBUS_TYPE_STRING, &etxt, @@ -628,7 +625,7 @@ 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, r->interface, r->protocol, event, &r->address, NULL, 0, r->userdata); break; @@ -636,7 +633,7 @@ DBusHandlerResult avahi_address_resolver_event (AvahiClient *client, AvahiResolv } return DBUS_HANDLER_RESULT_HANDLED; - + fail: dbus_error_free (&error); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; @@ -647,7 +644,7 @@ AvahiAddressResolver * avahi_address_resolver_new( AvahiIfIndex interface, AvahiProtocol protocol, const AvahiAddress *a, - AvahiLookupFlags flags, + AvahiLookupFlags flags, AvahiAddressResolverCallback callback, void *userdata) { @@ -669,7 +666,7 @@ AvahiAddressResolver * avahi_address_resolver_new( return NULL; } - if (client->state == AVAHI_CLIENT_FAILURE) { + if (!avahi_client_is_connected(client)) { avahi_client_set_errno(client, AVAHI_ERR_BAD_STATE); goto fail; } @@ -686,7 +683,7 @@ AvahiAddressResolver * avahi_address_resolver_new( 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"))) { @@ -721,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 */ @@ -734,7 +731,7 @@ AvahiAddressResolver * avahi_address_resolver_new( dbus_message_unref(reply); return r; - + fail: if (dbus_error_is_set(&error)) { @@ -744,7 +741,7 @@ fail: if (r) avahi_address_resolver_free(r); - + if (message) dbus_message_unref(message); @@ -768,7 +765,7 @@ int avahi_address_resolver_free(AvahiAddressResolver *r) { assert(r); client = r->client; - if (r->path && client->state != AVAHI_CLIENT_FAILURE) + 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);