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 35 void avahi_dbus_sync_host_name_resolver_free(SyncHostNameResolverInfo *i) { 36 assert(i); 37 38 if (i->host_name_resolver) 39 avahi_s_host_name_resolver_free(i->host_name_resolver); 40 dbus_message_unref(i->message); 41 AVAHI_LLIST_REMOVE(SyncHostNameResolverInfo, sync_host_name_resolvers, i->client->sync_host_name_resolvers, i); 42 43 assert(i->client->n_objects >= 1); 44 i->client->n_objects--; 45 46 avahi_free(i); 47 } 48 49 void 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) { 50 SyncHostNameResolverInfo *i = userdata; 51 52 assert(r); 53 assert(host_name); 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(a); 63 avahi_address_snprint(t, sizeof(t), a); 64 65 i_interface = (int32_t) interface; 66 i_protocol = (int32_t) protocol; 67 i_aprotocol = (int32_t) a->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_STRING, &host_name, 82 DBUS_TYPE_INT32, &i_aprotocol, 83 DBUS_TYPE_STRING, &pt, 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 94 finish: 95 avahi_dbus_sync_host_name_resolver_free(i); 96 } 97