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_service_resolver_free(SyncServiceResolverInfo *i) { 36 assert(i); 37 38 if (i->service_resolver) 39 avahi_s_service_resolver_free(i->service_resolver); 40 dbus_message_unref(i->message); 41 AVAHI_LLIST_REMOVE(SyncServiceResolverInfo, sync_service_resolvers, i->client->sync_service_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_service_resolver_callback( 50 AvahiSServiceResolver *r, 51 AvahiIfIndex interface, 52 AvahiProtocol protocol, 53 AvahiResolverEvent event, 54 const char *name, 55 const char *type, 56 const char *domain, 57 const char *host_name, 58 const AvahiAddress *a, 59 uint16_t port, 60 AvahiStringList *txt, 61 AvahiLookupResultFlags flags, 62 void* userdata) { 63 64 SyncServiceResolverInfo *i = userdata; 65 66 assert(r); 67 assert(i); 68 69 if (event == AVAHI_RESOLVER_FOUND) { 70 char t[AVAHI_ADDRESS_STR_MAX], *pt = t; 71 int32_t i_interface, i_protocol, i_aprotocol; 72 uint32_t u_flags; 73 DBusMessage *reply; 74 75 assert(host_name); 76 77 if (!name) 78 name = ""; 79 80 if (a) 81 avahi_address_snprint(t, sizeof(t), a); 82 else 83 t[0] = 0; 84 85 /* Patch in AVAHI_LOOKUP_RESULT_OUR_OWN */ 86 87 if (avahi_dbus_is_our_own_service(i->client, interface, protocol, name, type, domain) > 0) 88 flags |= AVAHI_LOOKUP_RESULT_OUR_OWN; 89 90 i_interface = (int32_t) interface; 91 i_protocol = (int32_t) protocol; 92 if (a) 93 i_aprotocol = (int32_t) a->proto; 94 else 95 i_aprotocol = AVAHI_PROTO_UNSPEC; 96 u_flags = (uint32_t) flags; 97 98 reply = dbus_message_new_method_return(i->message); 99 100 if (!reply) { 101 avahi_log_error("Failed allocate message"); 102 goto finish; 103 } 104 105 dbus_message_append_args( 106 reply, 107 DBUS_TYPE_INT32, &i_interface, 108 DBUS_TYPE_INT32, &i_protocol, 109 DBUS_TYPE_STRING, &name, 110 DBUS_TYPE_STRING, &type, 111 DBUS_TYPE_STRING, &domain, 112 DBUS_TYPE_STRING, &host_name, 113 DBUS_TYPE_INT32, &i_aprotocol, 114 DBUS_TYPE_STRING, &pt, 115 DBUS_TYPE_UINT16, &port, 116 DBUS_TYPE_INVALID); 117 118 avahi_dbus_append_string_list(reply, txt); 119 120 dbus_message_append_args( 121 reply, 122 DBUS_TYPE_UINT32, &u_flags, 123 DBUS_TYPE_INVALID); 124 125 dbus_connection_send(server->bus, reply, NULL); 126 dbus_message_unref(reply); 127 } else { 128 assert(event == AVAHI_RESOLVER_FAILURE); 129 130 avahi_dbus_respond_error(server->bus, i->message, avahi_server_errno(avahi_server), NULL); 131 } 132 133 finish: 134 avahi_dbus_sync_service_resolver_free(i); 135 } 136