1/*** 2 This file is part of avahi. 3 4 avahi is free software; you can redistribute it and/or modify it 5 under the terms of the GNU Lesser General Public License as 6 published by the Free Software Foundation; either version 2.1 of the 7 License, or (at your option) any later version. 8 9 avahi is distributed in the hope that it will be useful, but WITHOUT 10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 11 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 12 Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with avahi; if not, write to the Free Software 16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 17 USA. 18***/ 19 20#ifdef HAVE_CONFIG_H 21#include <config.h> 22#endif 23 24#include <string.h> 25 26#include "avahi-common/avahi-malloc.h" 27#include <avahi-common/dbus.h> 28#include <avahi-common/error.h> 29#include <avahi-core/log.h> 30 31#include "dbus-util.h" 32#include "dbus-internal.h" 33#include "main.h" 34 35void avahi_dbus_sync_address_resolver_free(SyncAddressResolverInfo *i) { 36 assert(i); 37 38 if (i->address_resolver) 39 avahi_s_address_resolver_free(i->address_resolver); 40 dbus_message_unref(i->message); 41 AVAHI_LLIST_REMOVE(SyncAddressResolverInfo, sync_address_resolvers, i->client->sync_address_resolvers, i); 42 43 assert(i->client->n_objects >= 1); 44 i->client->n_objects--; 45 46 avahi_free(i); 47} 48 49void avahi_dbus_sync_address_resolver_callback(AvahiSAddressResolver *r, AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, const AvahiAddress *address, const char *host_name, AvahiLookupResultFlags flags, void* userdata) { 50 SyncAddressResolverInfo *i = userdata; 51 52 assert(r); 53 assert(address); 54 assert(i); 55 56 if (event == AVAHI_RESOLVER_FOUND) { 57 char t[AVAHI_ADDRESS_STR_MAX], *pt = t; 58 int32_t i_interface, i_protocol, i_aprotocol; 59 uint32_t u_flags; 60 DBusMessage *reply; 61 62 assert(host_name); 63 avahi_address_snprint(t, sizeof(t), address); 64 65 i_interface = (int32_t) interface; 66 i_protocol = (int32_t) protocol; 67 i_aprotocol = (int32_t) address->proto; 68 u_flags = (uint32_t) flags; 69 70 reply = dbus_message_new_method_return(i->message); 71 72 if (!reply) { 73 avahi_log_error("Failed allocate message"); 74 goto finish; 75 } 76 77 dbus_message_append_args( 78 reply, 79 DBUS_TYPE_INT32, &i_interface, 80 DBUS_TYPE_INT32, &i_protocol, 81 DBUS_TYPE_INT32, &i_aprotocol, 82 DBUS_TYPE_STRING, &pt, 83 DBUS_TYPE_STRING, &host_name, 84 DBUS_TYPE_UINT32, &u_flags, 85 DBUS_TYPE_INVALID); 86 87 dbus_connection_send(server->bus, reply, NULL); 88 dbus_message_unref(reply); 89 } else { 90 assert(event == AVAHI_RESOLVER_FAILURE); 91 avahi_dbus_respond_error(server->bus, i->message, avahi_server_errno(avahi_server), NULL); 92 } 93 94finish: 95 avahi_dbus_sync_address_resolver_free(i); 96} 97