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