patches/avahi-05-resolve-service.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 10044 7508208432e4
child 21365 ead32bf37db7
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10044
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     1
--- /usr/tmp/clean/avahi-0.6.12/avahi-core/resolve-service.c	2006-04-01 01:48:59.000000000 +0100
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     2
+++ avahi-0.6.12/avahi-core/resolve-service.c	2006-08-28 14:40:21.749772000 +0100
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     3
@@ -27,6 +27,10 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     4
 #include <stdio.h>
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     5
 #include <stdlib.h>
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     6
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     7
+#ifdef HAVE_BONJOUR
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     8
+#include <netinet/in.h> /* for ntohs */
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
     9
+#endif
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    10
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    11
 #include <avahi-common/domain.h>
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    12
 #include <avahi-common/timeval.h>
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    13
 #include <avahi-common/malloc.h>
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    14
@@ -61,9 +65,302 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    15
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    16
     AvahiTimeEvent *time_event;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    17
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    18
+#ifdef HAVE_BONJOUR
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    19
+    uint16_t port;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    20
+    AvahiTimeEvent *defer_time_event;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    21
+    char *host;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    22
+    AvahiWatch *watch;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    23
+    AvahiWatch *watch_a;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    24
+    AvahiWatch *watch_a6;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    25
+    DNSServiceRef client;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    26
+    DNSServiceRef client_a;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    27
+    DNSServiceRef client_a6;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    28
+#endif
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    29
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    30
     AVAHI_LLIST_FIELDS(AvahiSServiceResolver, resolver);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    31
 };
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    32
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    33
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    34
+#ifdef HAVE_BONJOUR
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    35
+static void finish(AvahiSServiceResolver *r, AvahiResolverEvent event ) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    36
+    AvahiLookupResultFlags flags;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    37
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    38
+    assert(r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    39
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    40
+    if (r->time_event) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    41
+        avahi_time_event_free(r->time_event);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    42
+        r->time_event = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    43
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    44
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    45
+    flags = 0;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    46
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    47
+    switch (event) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    48
+        case AVAHI_RESOLVER_FAILURE:
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    49
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    50
+            r->callback(r, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    51
+                r->interface, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    52
+                r->protocol, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    53
+                event, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    54
+                r->service_name, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    55
+                r->service_type, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    56
+                r->domain_name, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    57
+                NULL, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    58
+                NULL, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    59
+                0, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    60
+                NULL, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    61
+                flags, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    62
+                r->userdata);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    63
+            break;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    64
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    65
+        case AVAHI_RESOLVER_FOUND: {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    66
+            AvahiAddress a;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    67
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    68
+            if (r->address_record) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    69
+                switch (r->address_record->key->type) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    70
+                    case AVAHI_DNS_TYPE_A:
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    71
+                        a.proto = AVAHI_PROTO_INET;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    72
+                        a.data.ipv4 = r->address_record->data.a.address;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    73
+                        break;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    74
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    75
+                    case AVAHI_DNS_TYPE_AAAA:
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    76
+                        a.proto = AVAHI_PROTO_INET6;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    77
+                        a.data.ipv6 = r->address_record->data.aaaa.address;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    78
+                        break;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    79
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    80
+                    default:
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    81
+                        assert(0);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    82
+                }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    83
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    84
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    85
+            flags = 0;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    86
+            if (avahi_domain_equal(r->server->host_name_fqdn, r->host))
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    87
+                flags |= AVAHI_LOOKUP_RESULT_LOCAL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    88
+            r->callback(r, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    89
+                r->interface, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    90
+                r->protocol, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    91
+                event, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    92
+                r->service_name, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    93
+                r->service_type, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    94
+                r->domain_name, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    95
+                r->host, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    96
+                r->address_record ? &a : NULL, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    97
+                r->port, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    98
+                r->txt_record ? r->txt_record->data.txt.string_list : NULL, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
    99
+                flags, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   100
+                r->userdata);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   101
+            break;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   102
+        }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   103
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   104
+}
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   105
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   106
+static  void query_record(DNSServiceRef sdRef, const DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   107
+        const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   108
+{
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   109
+    AvahiSServiceResolver *r = context;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   110
+    const unsigned char *rd = rdata;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   111
+    AvahiAddress a;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   112
+    int changed = 0;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   113
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   114
+    if (r->interface > 0 && ifIndex != r->interface)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   115
+        return;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   116
+    if (r->interface <= 0)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   117
+        r->interface = ifIndex;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   118
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   119
+    switch (rrtype) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   120
+        case kDNSServiceType_A:
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   121
+            if (!r->address_record) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   122
+                if (!(r->address_record = avahi_record_new_full(r->host, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_A, ttl))) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   123
+                    avahi_server_set_errno(r->server, AVAHI_ERR_NO_MEMORY);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   124
+                    finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   125
+                    return;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   126
+                }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   127
+                if (avahi_rdata_parse(r->address_record, rdata, rdlen) != 0) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   128
+                    avahi_server_set_errno(r->server, AVAHI_ERR_INVALID_PACKET);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   129
+                    finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   130
+                }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   131
+                changed = 1;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   132
+                if (r->protocol == AVAHI_PROTO_UNSPEC)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   133
+                    r->protocol = AVAHI_PROTO_INET;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   134
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   135
+            break;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   136
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   137
+        case kDNSServiceType_A6:
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   138
+            if (!r->address_record) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   139
+                if (!(r->address_record = avahi_record_new_full(r->host, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_AAAA, ttl))) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   140
+                    avahi_server_set_errno(r->server, AVAHI_ERR_NO_MEMORY);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   141
+                    finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   142
+                    return;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   143
+                }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   144
+                if (avahi_rdata_parse(r->address_record, rdata, rdlen) != 0) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   145
+                    avahi_server_set_errno(r->server, AVAHI_ERR_INVALID_PACKET);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   146
+                    finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   147
+                }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   148
+                changed = 1;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   149
+                if (r->protocol == AVAHI_PROTO_UNSPEC)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   150
+                    r->protocol = AVAHI_PROTO_INET6;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   151
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   152
+            break;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   153
+        default:
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   154
+            abort();
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   155
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   156
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   157
+    if (changed &&
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   158
+        (r->txt_record || (r->user_flags & AVAHI_LOOKUP_NO_TXT)) &&
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   159
+        r->address_record || (r->user_flags & AVAHI_LOOKUP_NO_ADDRESS)) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   160
+        finish(r, AVAHI_RESOLVER_FOUND);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   161
+   }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   162
+}
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   163
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   164
+static void resolve_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   165
+    AvahiSServiceResolver *r = userdata;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   166
+    DNSServiceErrorType ret;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   167
+    DNSServiceRef client;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   168
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   169
+    assert(w);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   170
+    assert(fd >= 0);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   171
+    assert(events & AVAHI_WATCH_IN);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   172
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   173
+    if (fd == DNSServiceRefSockFD(r->client))
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   174
+        client = r->client;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   175
+    else if (fd == DNSServiceRefSockFD(r->client_a))
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   176
+        client = r->client_a;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   177
+    else if (fd == DNSServiceRefSockFD(r->client_a6))
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   178
+        client = r->client_a6;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   179
+    else
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   180
+        assert (0);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   181
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   182
+    ret = DNSServiceProcessResult(client);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   183
+    if (ret != kDNSServiceErr_NoError) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   184
+        if (client == r->client) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   185
+            if (r->watch) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   186
+                r->server->poll_api->watch_free(r->watch);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   187
+                r->watch = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   188
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   189
+            DNSServiceRefDeallocate(r->client);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   190
+            r->client = NULL; 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   191
+        } else if (client == r->client_a) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   192
+            if (r->watch_a) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   193
+                r->server->poll_api->watch_free(r->watch_a);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   194
+                r->watch_a = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   195
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   196
+            DNSServiceRefDeallocate(r->client_a);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   197
+            r->client_a = NULL; 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   198
+        } else if (client == r->client_a6) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   199
+            if (r->watch_a6) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   200
+                r->server->poll_api->watch_free(r->watch_a6);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   201
+                r->watch_a6 = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   202
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   203
+            DNSServiceRefDeallocate(r->client_a6);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   204
+            r->client_a6 = NULL; 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   205
+        }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   206
+        avahi_server_set_errno(r->server, AVAHI_ERR_DISCONNECTED);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   207
+        finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   208
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   209
+}
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   210
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   211
+static void resolve_reply(DNSServiceRef client, const DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   212
+        const char *fullname, const char *host, uint16_t opaqueport, uint16_t txtlen, const char* txtrecord, void *context) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   213
+    AvahiSServiceResolver *r = context;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   214
+    AvahiServer *s = r->server;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   215
+    DNSServiceErrorType ret;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   216
+    DNSServiceRef new_client;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   217
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   218
+    if (r->interface > 0 && ifIndex != r->interface)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   219
+        return;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   220
+    if (r->interface <= 0)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   221
+        r->interface = ifIndex;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   222
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   223
+    if (host) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   224
+        if (!(r->host = avahi_strdup(host))) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   225
+            avahi_server_set_errno(r->server, AVAHI_ERR_NO_MEMORY);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   226
+            finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   227
+        }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   228
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   229
+    if (!(r->user_flags & AVAHI_LOOKUP_NO_ADDRESS)) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   230
+        if (!r->txt_record) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   231
+            if (!(r->txt_record = avahi_record_new_full(r->host, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT, AVAHI_DEFAULT_TTL))) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   232
+                avahi_server_set_errno(r->server, AVAHI_ERR_NO_MEMORY);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   233
+                finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   234
+                return;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   235
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   236
+        }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   237
+        if (avahi_rdata_parse(r->txt_record, txtrecord, txtlen) != 0) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   238
+            avahi_server_set_errno(r->server, AVAHI_ERR_INVALID_PACKET);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   239
+            finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   240
+        }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   241
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   242
+    r->port = ntohs(opaqueport);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   243
+    if (!(r->user_flags & AVAHI_LOOKUP_NO_ADDRESS)) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   244
+        if (r->address_protocol == AVAHI_PROTO_INET || r->address_protocol == AVAHI_PROTO_UNSPEC) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   245
+            if (r->client_a) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   246
+                if (r->watch_a) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   247
+                    r->server->poll_api->watch_free(r->watch_a);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   248
+                    r->watch_a = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   249
+                }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   250
+                DNSServiceRefDeallocate(r->client_a);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   251
+                r->client_a = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   252
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   253
+            ret = DNSServiceQueryRecord(&r->client_a, 0, ifIndex, host, kDNSServiceType_A, kDNSServiceClass_IN, query_record, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   254
+            if (ret != kDNSServiceErr_NoError || !r->client_a) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   255
+                finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   256
+                return;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   257
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   258
+            r->watch_a = s->poll_api->watch_new(s->poll_api, DNSServiceRefSockFD(r->client_a), AVAHI_WATCH_IN, resolve_socket_event, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   259
+        }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   260
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   261
+        if (r->address_protocol == AVAHI_PROTO_INET6 || r->address_protocol == AVAHI_PROTO_UNSPEC) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   262
+            if (r->client_a6) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   263
+                if (r->watch_a6) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   264
+                    r->server->poll_api->watch_free(r->watch_a6);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   265
+                    r->watch_a6 = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   266
+                }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   267
+                DNSServiceRefDeallocate(r->client_a6);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   268
+                r->client_a6 = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   269
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   270
+            ret = DNSServiceQueryRecord(&r->client_a6, 0, ifIndex, host, kDNSServiceType_A6, kDNSServiceClass_IN, query_record, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   271
+            if (ret != kDNSServiceErr_NoError || !r->client_a6) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   272
+                finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   273
+                return;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   274
+            }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   275
+            r->watch_a6 = s->poll_api->watch_new(s->poll_api, DNSServiceRefSockFD(r->client_a6), AVAHI_WATCH_IN, resolve_socket_event, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   276
+        }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   277
+    } else {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   278
+       finish(r, AVAHI_RESOLVER_FOUND);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   279
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   280
+}
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   281
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   282
+static void resolve_error_callback(AvahiTimeEvent *e, void *userdata) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   283
+    AvahiSServiceResolver *r = userdata;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   284
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   285
+    if (r->defer_time_event) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   286
+        avahi_time_event_free(r->defer_time_event);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   287
+        r->defer_time_event = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   288
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   289
+    avahi_server_set_errno(r->server, AVAHI_ERR_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   290
+    finish(r, AVAHI_RESOLVER_FAILURE);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   291
+}
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   292
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   293
+static void avahi_resolve_service_start(AvahiServer *s, AvahiSServiceResolver *r) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   294
+    DNSServiceErrorType ret;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   295
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   296
+    ret = DNSServiceResolve(&r->client, 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   297
+              0,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   298
+              r->interface == AVAHI_IF_UNSPEC ? 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   299
+                  kDNSServiceInterfaceIndexAny :
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   300
+                  r->interface,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   301
+              r->service_name,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   302
+              r->service_type,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   303
+              r->domain_name,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   304
+              resolve_reply,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   305
+              r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   306
+    if (ret != kDNSServiceErr_NoError || !r->client) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   307
+        r->defer_time_event = avahi_time_event_new(r->server->time_event_queue, NULL, resolve_error_callback, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   308
+    } else {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   309
+        r->watch = s->poll_api->watch_new(s->poll_api, DNSServiceRefSockFD(r->client), AVAHI_WATCH_IN, resolve_socket_event, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   310
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   311
+}
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   312
+#else
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   313
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   314
 static void finish(AvahiSServiceResolver *r, AvahiResolverEvent event) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   315
     AvahiLookupResultFlags flags;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   316
     
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   317
@@ -142,6 +439,7 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   318
         }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   319
     }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   320
 }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   321
+#endif
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   322
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   323
 static void time_event_callback(AvahiTimeEvent *e, void *userdata) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   324
     AvahiSServiceResolver *r = userdata;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   325
@@ -165,6 +463,7 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   326
     r->time_event = avahi_time_event_new(r->server->time_event_queue, &tv, time_event_callback, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   327
 }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   328
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   329
+#ifndef HAVE_BONJOUR
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   330
 static void record_browser_callback(
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   331
     AvahiSRecordBrowser*rr,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   332
     AvahiIfIndex interface,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   333
@@ -376,6 +675,7 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   334
             break;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   335
     }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   336
 }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   337
+#endif
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   338
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   339
 AvahiSServiceResolver *avahi_s_service_resolver_new(
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   340
     AvahiServer *server,
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   341
@@ -435,6 +735,17 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   342
     r->time_event = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   343
     AVAHI_LLIST_PREPEND(AvahiSServiceResolver, resolver, server->service_resolvers, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   344
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   345
+#ifdef HAVE_BONJOUR
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   346
+    r->defer_time_event = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   347
+    r->host = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   348
+    r->watch = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   349
+    r->watch_a = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   350
+    r->watch_a6 = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   351
+    r->client = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   352
+    r->client_a = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   353
+    r->client_a6 = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   354
+    avahi_resolve_service_start(server, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   355
+#else
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   356
     k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   357
     r->record_browser_srv = avahi_s_record_browser_new(server, interface, protocol, k, flags & ~(AVAHI_LOOKUP_NO_TXT|AVAHI_LOOKUP_NO_ADDRESS), record_browser_callback, r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   358
     avahi_key_unref(k);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   359
@@ -454,6 +765,7 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   360
             return NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   361
         }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   362
     }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   363
+#endif
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   364
 
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   365
     start_timeout(r);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   366
     
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   367
@@ -484,6 +796,29 @@
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   368
     if (r->address_record)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   369
         avahi_record_unref(r->address_record);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   370
     
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   371
+#ifdef HAVE_BONJOUR
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   372
+    if (r->defer_time_event) {
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   373
+        avahi_time_event_free(r->defer_time_event);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   374
+        r->defer_time_event = NULL;
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   375
+    }
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   376
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   377
+    if (r->host)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   378
+        avahi_free(r->host);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   379
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   380
+    if (r->watch)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   381
+        r->server->poll_api->watch_free(r->watch);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   382
+    if (r->watch_a)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   383
+        r->server->poll_api->watch_free(r->watch_a);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   384
+    if (r->watch_a6)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   385
+        r->server->poll_api->watch_free(r->watch_a6);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   386
+
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   387
+    if (r->client)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   388
+        DNSServiceRefDeallocate (r->client);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   389
+    if (r->client_a)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   390
+        DNSServiceRefDeallocate (r->client_a);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   391
+    if (r->client_a6)
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   392
+        DNSServiceRefDeallocate (r->client_a6);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   393
+#endif
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   394
     avahi_free(r->service_name);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   395
     avahi_free(r->service_type);
7508208432e4 2007-06-12 Padraig O'Briain <[email protected]>
padraig
parents:
diff changeset
   396
     avahi_free(r->domain_name);