Home | History | Annotate | Download | only in avahi-daemon
      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