Home | History | Annotate | Download | only in patches
      1  11510  padraig --- /usr/tmp/clean/avahi-0.6.12/avahi-core/entry.c	2006-03-02 01:30:17.000000000 +0000
      2  11510  padraig +++ avahi-0.6.12/avahi-core/entry.c	2006-08-28 14:26:37.958555000 +0100
      3  11510  padraig @@ -52,6 +52,33 @@
      4  11510  padraig  #include "rr-util.h"
      5  11510  padraig  #include "domain-util.h"
      6  11510  padraig  
      7  11510  padraig +#ifdef HAVE_BONJOUR
      8  11510  padraig +
      9  11510  padraig +struct AvahiService {
     10  11510  padraig +    AvahiServer *server;
     11  11510  padraig +    AvahiSEntryGroup *group;
     12  11510  padraig +
     13  11510  padraig +    int dead;
     14  11510  padraig +
     15  11510  padraig +    AvahiPublishFlags flags;
     16  11510  padraig +    AvahiIfIndex interface;
     17  11510  padraig +    AvahiProtocol protocol;
     18  11510  padraig +
     19  11510  padraig +    char *name;
     20  11510  padraig +    char *type;
     21  11510  padraig +    char *domain;
     22  11510  padraig +    char *host;
     23  11510  padraig +    uint16_t port;
     24  11510  padraig +
     25  11510  padraig +    AvahiWatch *watch;
     26  11510  padraig +    DNSServiceRef client;
     27  11510  padraig +    size_t txtlen;
     28  11510  padraig +    uint8_t *txtrecord;
     29  11510  padraig +
     30  11510  padraig +    AVAHI_LLIST_FIELDS(AvahiService, services);
     31  11510  padraig +};
     32  11510  padraig +#endif
     33  11510  padraig +
     34  11510  padraig  static void transport_flags_from_domain(AvahiServer *s, AvahiPublishFlags *flags, const char *domain) {
     35  11510  padraig      assert(flags);
     36  11510  padraig      assert(domain);
     37  11510  padraig @@ -71,13 +98,146 @@
     38  11510  padraig          *flags |= AVAHI_PUBLISH_USE_WIDE_AREA;
     39  11510  padraig  }
     40  11510  padraig  
     41  11510  padraig +#ifdef HAVE_BONJOUR
     42  11510  padraig +static void register_service_reply(DNSServiceRef client, const DNSServiceFlags flags, DNSServiceErrorType errorCode,
     43  11510  padraig +        const char *name, const char *regtype, const char *domain, void *context) {
     44  11510  padraig +    AvahiService *as = context;
     45  11510  padraig +
     46  11510  padraig +    switch (errorCode) {
     47  11510  padraig +        case kDNSServiceErr_NoError:
     48  11510  padraig +            as->group->n_probing--;
     49  11510  padraig +            if (as->group->n_probing == 0) {
     50  11510  padraig +                avahi_s_entry_group_change_state(as->group, AVAHI_ENTRY_GROUP_ESTABLISHED);
     51  11510  padraig +            }
     52  11510  padraig +            break;
     53  11510  padraig +        case kDNSServiceErr_NameConflict:
     54  11510  padraig +            avahi_s_entry_group_change_state(as->group, AVAHI_ENTRY_GROUP_COLLISION);
     55  11510  padraig +            break;
     56  11510  padraig +        default: 
     57  11510  padraig +            avahi_s_entry_group_change_state(as->group, AVAHI_ENTRY_GROUP_FAILURE);
     58  11510  padraig +    }
     59  11510  padraig +}
     60  11510  padraig +
     61  11510  padraig +static void register_service_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) {
     62  11510  padraig +    AvahiService *as = userdata;
     63  11510  padraig +    DNSServiceErrorType ret;
     64  11510  padraig +
     65  11510  padraig +    assert(w);
     66  11510  padraig +    assert(fd >= 0);
     67  11510  padraig +    assert(events & AVAHI_WATCH_IN);
     68  11510  padraig +
     69  11510  padraig +    assert (fd == DNSServiceRefSockFD(as->client));
     70  11510  padraig +    ret = DNSServiceProcessResult(as->client);
     71  11510  padraig +    if (ret != kDNSServiceErr_NoError) {
     72  11510  padraig +        if (as->watch) {
     73  11510  padraig +            as->server->poll_api->watch_free(as->watch);
     74  11510  padraig +            as->watch = NULL;
     75  11510  padraig +        }
     76  11510  padraig +        DNSServiceRefDeallocate(as->client);
     77  11510  padraig +        as->client = NULL;
     78  11510  padraig +        avahi_s_entry_group_change_state(as->group, AVAHI_ENTRY_GROUP_FAILURE);
     79  11510  padraig +    }
     80  11510  padraig +}
     81  11510  padraig +
     82  11510  padraig +static void avahi_service_free(AvahiServer*s, AvahiService *as) {
     83  11510  padraig +    AvahiService *t;
     84  11510  padraig +
     85  11510  padraig +    assert(s);
     86  11510  padraig +    assert(as);
     87  11510  padraig +
     88  11510  padraig +    /* Remove from linked list */
     89  11510  padraig +    AVAHI_LLIST_REMOVE(AvahiService, services, s->services, as);
     90  11510  padraig +
     91  11510  padraig +    /* Remove from associated group */
     92  19688    gheet +    if (as->group && (as->group->services != NULL))
     93  11510  padraig +        AVAHI_LLIST_REMOVE(AvahiService, services, as->group->services, as);
     94  11510  padraig +
     95  11510  padraig +    if (as->name)
     96  11510  padraig +        avahi_free(as->name);
     97  11510  padraig +
     98  11510  padraig +    if (as->type)
     99  11510  padraig +        avahi_free(as->type);
    100  11510  padraig +
    101  11510  padraig +    if (as->domain)
    102  11510  padraig +        avahi_free(as->domain);
    103  11510  padraig +
    104  11510  padraig +    if (as->host)
    105  11510  padraig +        avahi_free(as->host);
    106  11510  padraig +
    107  11510  padraig +    if (as->watch)
    108  11510  padraig +        s->poll_api->watch_free(as->watch);
    109  11510  padraig +    
    110  11510  padraig +    if (as->client)
    111  11510  padraig +        DNSServiceRefDeallocate (as->client);
    112  11510  padraig +
    113  11510  padraig +    if (as->txtrecord)
    114  11510  padraig +        avahi_free(as->txtrecord);
    115  11510  padraig +
    116  11510  padraig +    avahi_free(as);
    117  11510  padraig +}
    118  11510  padraig +
    119  11510  padraig +static void avahi_register_service(AvahiServer *s, AvahiService *as) {
    120  11510  padraig +    DNSServiceErrorType ret;
    121  11510  padraig +
    122  11510  padraig +    ret = DNSServiceRegister(&as->client, 
    123  11510  padraig +              as->interface == AVAHI_IF_UNSPEC ? 
    124  11510  padraig +                  kDNSServiceInterfaceIndexAny :
    125  11510  padraig +                  as->interface,
    126  11510  padraig +              0, 
    127  11510  padraig +              as->name,
    128  11510  padraig +              as->type,
    129  11510  padraig +              as->domain,
    130  11510  padraig +              as->host,
    131  11510  padraig +              htons(as->port),
    132  11510  padraig +              as->txtlen,
    133  11510  padraig +              as->txtrecord,
    134  11510  padraig +              register_service_reply,
    135  11510  padraig +              as);
    136  11510  padraig +    if (ret == kDNSServiceErr_NoError) {
    137  11510  padraig +        if  (!as->client) {
    138  11510  padraig +            avahi_s_entry_group_change_state(as->group, AVAHI_ENTRY_GROUP_FAILURE);
    139  11510  padraig +        } else {
    140  11510  padraig +            as->group->n_probing++;
    141  11510  padraig +            as->watch = s->poll_api->watch_new(s->poll_api, DNSServiceRefSockFD(as->client), AVAHI_WATCH_IN, register_service_socket_event, as);
    142  11510  padraig +        } 
    143  11510  padraig +    } else {
    144  11510  padraig +        if (ret == kDNSServiceErr_NameConflict) {
    145  11510  padraig +            avahi_s_entry_group_change_state(as->group, AVAHI_ENTRY_GROUP_COLLISION);
    146  11510  padraig +        }
    147  11510  padraig +        else {
    148  11510  padraig +            avahi_s_entry_group_change_state(as->group, AVAHI_ENTRY_GROUP_FAILURE);
    149  11510  padraig +        }
    150  11510  padraig +    }
    151  11510  padraig +}
    152  11510  padraig +
    153  11510  padraig +static void register_record_reply(DNSServiceRef client, DNSRecordRef recordref, const DNSServiceFlags flags, DNSServiceErrorType errorCode, void *context) {
    154  11510  padraig +    AvahiEntry *e = context;
    155  11510  padraig +    DNSServiceErrorType ret;
    156  11510  padraig +    
    157  11510  padraig +    switch (errorCode) {
    158  11510  padraig +        case kDNSServiceErr_NoError:
    159  11510  padraig +            break;
    160  11510  padraig +        case kDNSServiceErr_NameConflict:
    161  11510  padraig +            e->recordref = NULL;
    162  11510  padraig +            avahi_server_set_errno(e->server, AVAHI_ERR_COLLISION);
    163  11510  padraig +            break;
    164  11510  padraig +        default: 
    165  11510  padraig +            e->recordref = NULL;
    166  11510  padraig +            avahi_server_set_errno(e->server, AVAHI_ERR_FAILURE);
    167  11510  padraig +            break;
    168  11510  padraig +    }
    169  11510  padraig +}
    170  11510  padraig +#endif
    171  11510  padraig +
    172  11510  padraig  void avahi_entry_free(AvahiServer*s, AvahiEntry *e) {
    173  11510  padraig      AvahiEntry *t;
    174  11510  padraig  
    175  11510  padraig      assert(s);
    176  11510  padraig      assert(e);
    177  11510  padraig  
    178  11510  padraig +#ifndef HAVE_BONJOUR
    179  11510  padraig      avahi_goodbye_entry(s, e, 1, 1);
    180  11510  padraig +#endif
    181  11510  padraig  
    182  11510  padraig      /* Remove from linked list */
    183  11510  padraig      AVAHI_LLIST_REMOVE(AvahiEntry, entries, s->entries, e);
    184  11510  padraig @@ -104,6 +264,15 @@
    185  11510  padraig  
    186  11510  padraig      while (g->entries)
    187  11510  padraig          avahi_entry_free(s, g->entries);
    188  11510  padraig +#ifdef HAVE_BONJOUR
    189  11510  padraig +    while (g->services)
    190  11510  padraig +        avahi_service_free(s, g->services);
    191  11510  padraig +
    192  11510  padraig +    if (g->record_connection) {
    193  11510  padraig +        DNSServiceRefDeallocate(g->record_connection);
    194  11510  padraig +        g->record_connection = NULL;
    195  11510  padraig +    }
    196  11510  padraig +#endif
    197  11510  padraig  
    198  11510  padraig      if (g->register_time_event)
    199  11510  padraig          avahi_time_event_free(g->register_time_event);
    200  11510  padraig @@ -141,6 +310,21 @@
    201  11510  padraig          s->need_entry_cleanup = 0;
    202  11510  padraig      }
    203  11510  padraig  
    204  11510  padraig +#ifdef HAVE_BONJOUR
    205  11510  padraig +    if (s->need_service_cleanup) {
    206  11510  padraig +        AvahiService *as, *next;
    207  11510  padraig +        
    208  11510  padraig +        for (as = s->services; as; as = next) {
    209  11510  padraig +            next = as->services_next;
    210  11510  padraig +            
    211  11510  padraig +            if (as->dead)
    212  11510  padraig +                avahi_service_free(s, as);
    213  11510  padraig +        }
    214  11510  padraig +
    215  11510  padraig +        s->need_service_cleanup = 0;
    216  11510  padraig +    }
    217  11510  padraig +#endif
    218  11510  padraig +
    219  11510  padraig      if (s->need_browser_cleanup)
    220  11510  padraig          avahi_browser_cleanup(s);
    221  11510  padraig  }
    222  11510  padraig @@ -226,7 +410,7 @@
    223  11510  padraig          int is_first = 1;
    224  11510  padraig          
    225  11510  padraig          /* Update and existing record */
    226  11510  padraig -
    227  11510  padraig + 
    228  11510  padraig          /* Find the first matching entry */
    229  11510  padraig          for (e = avahi_hashmap_lookup(s->entries_by_key, r->key); e; e = e->by_key_next) {
    230  11510  padraig              if (!e->dead && e->group == g && e->interface == interface && e->protocol == protocol)
    231  11510  padraig @@ -237,8 +421,54 @@
    232  11510  padraig  
    233  11510  padraig          /* Hmm, nothing found? */
    234  11510  padraig          if (!e) {
    235  11510  padraig +#ifdef HAVE_BONJOUR
    236  11510  padraig +            /*
    237  11510  padraig +             * Assume that we are updating a service's primary TXT record
    238  11510  padraig +             * so find the service
    239  11510  padraig +             */
    240  11510  padraig +            DNSServiceErrorType ret;
    241  11510  padraig +            uint16_t rlen;
    242  11510  padraig +            uint8_t rdata[AVAHI_DNS_RDATA_MAX];
    243  11510  padraig +            size_t l;
    244  11510  padraig +            AvahiService *as;
    245  11510  padraig +            int found_as = 0;
    246  11510  padraig +
    247  11510  padraig +            for (as = g->services; as; as = as->services_next) {
    248  11510  padraig +                int a_ret = AVAHI_OK;
    249  11510  padraig +                char svc_name[AVAHI_DOMAIN_NAME_MAX];
    250  11510  padraig +
    251  11510  padraig +                if ((a_ret = avahi_service_name_join(svc_name, sizeof(svc_name), as->name, as->type, as->domain ? as->domain : s->domain_name)) < 0) {
    252  11510  padraig +                      avahi_server_set_errno(s, a_ret);
    253  11510  padraig +                      return NULL;
    254  11510  padraig +                }
    255  11510  padraig +                if (!strcmp(svc_name, r->key->name)) {
    256  11510  padraig +                    found_as = 1;
    257  11510  padraig +                    break;
    258  11510  padraig +                }
    259  11510  padraig +            }
    260  11510  padraig +
    261  11510  padraig +            if (!found_as) {
    262  11510  padraig +                avahi_server_set_errno(s, AVAHI_ERR_NOT_FOUND);
    263  11510  padraig +                return NULL;
    264  11510  padraig +            }
    265  11510  padraig +            if ((l = avahi_rdata_serialize(r, rdata, sizeof(rdata))) == (size_t) -1) {
    266  11510  padraig +                avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    267  11510  padraig +                return NULL;
    268  11510  padraig +            }
    269  11510  padraig +            ret = DNSServiceUpdateRecord(as->client,
    270  11510  padraig +                                         NULL,
    271  11510  padraig +                                         0,
    272  11510  padraig +                                         l,
    273  11510  padraig +                                         rdata,
    274  11510  padraig +                                         r->ttl);
    275  11510  padraig +            if (ret != kDNSServiceErr_NoError) {
    276  11510  padraig +                avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    277  11510  padraig +            }
    278  11510  padraig +            return NULL;
    279  11510  padraig +#else
    280  11510  padraig              avahi_server_set_errno(s, AVAHI_ERR_NOT_FOUND);
    281  11510  padraig              return NULL;
    282  11510  padraig +#endif
    283  11510  padraig          }
    284  11510  padraig  
    285  11510  padraig          /* Update the entry */
    286  11510  padraig @@ -248,6 +478,36 @@
    287  11510  padraig  
    288  11510  padraig          /* Announce our changes when needed */
    289  11510  padraig          if (!avahi_record_equal_no_ttl(old_record, r) && (!g || g->state != AVAHI_ENTRY_GROUP_UNCOMMITED)) {
    290  11510  padraig +#ifdef HAVE_BONJOUR
    291  11510  padraig +            DNSServiceErrorType ret;
    292  11510  padraig +            uint16_t rlen;
    293  11510  padraig +            uint8_t rdata[AVAHI_DNS_RDATA_MAX];
    294  11510  padraig +            size_t l;
    295  11510  padraig +
    296  11510  padraig +            if (!g->record_connection) {
    297  11510  padraig +                if (DNSServiceCreateConnection(&g->record_connection) != kDNSServiceErr_NoError) {
    298  11510  padraig +                    avahi_entry_free(s, e);
    299  11510  padraig +                    avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    300  11510  padraig +                    return NULL;
    301  11510  padraig +                }
    302  11510  padraig +            }
    303  11510  padraig +            if ((l = avahi_rdata_serialize(r, rdata, sizeof(rdata))) == (size_t) -1) {
    304  11510  padraig +                avahi_entry_free(s, e);
    305  11510  padraig +                avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    306  11510  padraig +                return NULL;
    307  11510  padraig +            }
    308  11510  padraig +            ret = DNSServiceUpdateRecord(g->record_connection,
    309  11510  padraig +                                         e->recordref,
    310  11510  padraig +                                         0,
    311  11510  padraig +                                         l,
    312  11510  padraig +                                         rdata,
    313  11510  padraig +                                         r->ttl);
    314  11510  padraig +            if (ret != kDNSServiceErr_NoError) {
    315  11510  padraig +                avahi_entry_free(s, e);
    316  11510  padraig +                avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    317  11510  padraig +                return NULL;
    318  11510  padraig +            }
    319  11510  padraig +#else
    320  11510  padraig  
    321  11510  padraig              /* Remove the old entry from all caches, if needed */
    322  11510  padraig              if (!(e->flags & AVAHI_PUBLISH_UNIQUE))
    323  11510  padraig @@ -255,6 +515,7 @@
    324  11510  padraig  
    325  11510  padraig              /* Reannounce our updated entry */
    326  11510  padraig              avahi_reannounce_entry(s, e);
    327  11510  padraig +#endif
    328  11510  padraig          }
    329  11510  padraig  
    330  11510  padraig          /* If we were the first entry in the list, we need to update the key */
    331  11510  padraig @@ -265,6 +526,14 @@
    332  11510  padraig  
    333  11510  padraig      } else {
    334  11510  padraig          AvahiEntry *t;
    335  11510  padraig +#ifdef HAVE_BONJOUR
    336  11510  padraig +        DNSServiceErrorType ret;
    337  11510  padraig +        DNSServiceFlags bflags;
    338  11510  padraig +        uint16_t rlen;
    339  11510  padraig +        uint8_t rdata[AVAHI_DNS_RDATA_MAX];
    340  11510  padraig +        size_t l;
    341  11510  padraig +        char *record_name;
    342  11510  padraig +#endif
    343  11510  padraig  
    344  11510  padraig          /* Add a new record */
    345  11510  padraig      
    346  11510  padraig @@ -299,7 +568,69 @@
    347  11510  padraig          if (g)
    348  11510  padraig              AVAHI_LLIST_PREPEND(AvahiEntry, by_group, g->entries, e); 
    349  11510  padraig          
    350  11510  padraig +#ifdef HAVE_BONJOUR
    351  11510  padraig +        e->recordref = NULL; 
    352  11510  padraig +        if (!g->record_connection) {
    353  11510  padraig +            if (DNSServiceCreateConnection(&g->record_connection) != kDNSServiceErr_NoError) {
    354  11510  padraig +                avahi_entry_free(s, e);
    355  11510  padraig +                avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    356  11510  padraig +                return NULL;
    357  11510  padraig +            }
    358  11510  padraig +        }
    359  11510  padraig +        bflags = 0;
    360  11510  padraig +        if (flags & AVAHI_PUBLISH_ALLOW_MULTIPLE)
    361  11510  padraig +            bflags |= kDNSServiceFlagsShared;
    362  11510  padraig +        else
    363  11510  padraig +            bflags |= kDNSServiceFlagsUnique;
    364  11510  padraig +
    365  11510  padraig +        switch (r->key->type) {
    366  11510  padraig +            case AVAHI_DNS_TYPE_A:
    367  11510  padraig +            case AVAHI_DNS_TYPE_AAAA:
    368  11510  padraig +                record_name = avahi_strdup(r->key->name);
    369  11510  padraig +                break;
    370  11510  padraig +            default:
    371  11510  padraig +                record_name = avahi_malloc(strlen(r->key->name) + strlen(s->host_name_fqdn) + 2);
    372  11510  padraig +                strcpy(record_name, r->key->name);
    373  11510  padraig +                strcat(record_name, ".");
    374  11510  padraig +                strcat(record_name, s->host_name_fqdn);
    375  11510  padraig +                break;
    376  11510  padraig +        }
    377  11510  padraig +
    378  11510  padraig +        if ((l = avahi_rdata_serialize(r, rdata, sizeof(rdata))) == (size_t) -1) {
    379  11510  padraig +            avahi_entry_free(s, e);
    380  11510  padraig +            avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    381  11510  padraig +            return NULL;
    382  11510  padraig +        }
    383  11510  padraig +
    384  11510  padraig +        ret = DNSServiceRegisterRecord(g->record_connection,
    385  11510  padraig +                  &e->recordref,
    386  11510  padraig +                  bflags,
    387  11510  padraig +                  interface == AVAHI_IF_UNSPEC ? 
    388  11510  padraig +                      kDNSServiceInterfaceIndexAny :
    389  11510  padraig +                      interface,
    390  11510  padraig +                  record_name,
    391  11510  padraig +                  r->key->type,
    392  11510  padraig +                  r->key->clazz,
    393  11510  padraig +                  l,
    394  11510  padraig +                  rdata,
    395  11510  padraig +                  r->ttl,
    396  11510  padraig +                  register_record_reply,
    397  11510  padraig +                  e);
    398  11510  padraig +        if (ret == kDNSServiceErr_NoError) {
    399  11510  padraig +            ret = DNSServiceProcessResult(g->record_connection);
    400  11510  padraig +            if (ret != kDNSServiceErr_NoError || e->recordref == NULL) {
    401  11510  padraig +                avahi_entry_free(s, e);
    402  11510  padraig +                return NULL;
    403  11510  padraig +            }
    404  11510  padraig +        } else {
    405  11510  padraig +            avahi_entry_free(s, e);
    406  11510  padraig +            avahi_server_set_errno(s, AVAHI_ERR_FAILURE);
    407  11510  padraig +            return NULL;
    408  11510  padraig +        }
    409  11510  padraig +        avahi_free(record_name);
    410  11510  padraig +#else
    411  11510  padraig          avahi_announce_entry(s, e);
    412  11510  padraig +#endif
    413  11510  padraig      }
    414  11510  padraig  
    415  11510  padraig      return e;
    416  11510  padraig @@ -575,7 +906,10 @@
    417  11510  padraig      AvahiRecord *r = NULL;
    418  11510  padraig      int ret = AVAHI_OK;
    419  11510  padraig      AvahiEntry *srv_entry = NULL, *txt_entry = NULL, *ptr_entry = NULL, *enum_entry = NULL;
    420  11510  padraig -    
    421  11510  padraig +#ifdef HAVE_BONJOUR
    422  11510  padraig +    AvahiService *as;
    423  11510  padraig +#endif
    424  11510  padraig + 
    425  11510  padraig      assert(s);
    426  11510  padraig      assert(type);
    427  11510  padraig      assert(name);
    428  11510  padraig @@ -595,6 +929,36 @@
    429  11510  padraig      if (!domain)
    430  11510  padraig          domain = s->domain_name;
    431  11510  padraig  
    432  11510  padraig +#ifdef HAVE_BONJOUR
    433  11510  padraig +    as = avahi_new (AvahiService, 1);
    434  11510  padraig +    as->server = s;
    435  11510  padraig +    as->group = g;
    436  11510  padraig +    as->dead = 0;
    437  11510  padraig +    as->flags = flags;
    438  11510  padraig +    as->interface = interface;
    439  11510  padraig +    as->protocol = protocol;
    440  11510  padraig +    as->name = avahi_strdup(name);
    441  11510  padraig +    as->type = avahi_strdup(type);
    442  11510  padraig +    as->domain = avahi_strdup(domain);
    443  11510  padraig +    as->host = avahi_strdup(host);
    444  11510  padraig +    as->port = port;
    445  11510  padraig +    as->watch = NULL;
    446  11510  padraig +    as->client = NULL;
    447  11510  padraig +    as->txtlen = avahi_string_list_serialize(strlst, NULL, 0);
    448  11510  padraig +    if (as->txtlen > 0) {
    449  11510  padraig +        as->txtrecord = avahi_new(uint8_t, as->txtlen);
    450  11510  padraig +        if (as->txtrecord == NULL) {
    451  11510  padraig +            as->txtlen = 0;
    452  11510  padraig +            ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
    453  11510  padraig +            goto fail;
    454  11510  padraig +        }
    455  11510  padraig +        avahi_string_list_serialize(strlst, as->txtrecord, as->txtlen);
    456  11510  padraig +    } else
    457  11510  padraig +        as->txtrecord = NULL;
    458  11510  padraig +
    459  11510  padraig +    AVAHI_LLIST_PREPEND(AvahiService, services, s->services, as);
    460  11510  padraig +    AVAHI_LLIST_PREPEND(AvahiService, services, g->services, as);
    461  11510  padraig +#else
    462  11510  padraig      if (!host)
    463  11510  padraig          host = s->host_name_fqdn;
    464  11510  padraig  
    465  11510  padraig @@ -659,6 +1023,7 @@
    466  11510  padraig          ret = avahi_server_errno(s);
    467  11510  padraig          goto fail;
    468  11510  padraig      }
    469  11510  padraig +#endif
    470  11510  padraig  
    471  11510  padraig  fail:
    472  11510  padraig      if (ret != AVAHI_OK && !(flags & AVAHI_PUBLISH_UPDATE)) {
    473  11510  padraig @@ -938,6 +1303,18 @@
    474  11510  padraig      return e;
    475  11510  padraig  }
    476  11510  padraig  
    477  11510  padraig +#ifdef HAVE_BONJOUR
    478  11510  padraig +static void server_cleanup_time_event_callback(AVAHI_GCC_UNUSED AvahiTimeEvent *e, void* userdata) {
    479  11510  padraig +    AvahiServer *s = userdata;
    480  11510  padraig +    assert(s);
    481  11510  padraig +
    482  11510  padraig +    avahi_time_event_free(s->cleanup_time_event);
    483  11510  padraig +    s->cleanup_time_event = NULL;
    484  11510  padraig +    
    485  11510  padraig +    avahi_cleanup_dead_entries(s);
    486  11510  padraig +}
    487  11510  padraig +#endif
    488  11510  padraig +
    489  11510  padraig  int avahi_server_add_dns_server_address(
    490  11510  padraig      AvahiServer *s,
    491  11510  padraig      AvahiSEntryGroup *g,
    492  11510  padraig @@ -1005,7 +1382,11 @@
    493  11510  padraig      if (g->state == state)
    494  11510  padraig          return;
    495  11510  padraig  
    496  11510  padraig +#ifdef HAVE_BONJOUR
    497  11510  padraig +    assert(state <= AVAHI_ENTRY_GROUP_FAILURE);
    498  11510  padraig +#else
    499  11510  padraig      assert(state <= AVAHI_ENTRY_GROUP_COLLISION);
    500  11510  padraig +#endif
    501  11510  padraig  
    502  11510  padraig      if (g->state == AVAHI_ENTRY_GROUP_ESTABLISHED) {
    503  11510  padraig  
    504  11510  padraig @@ -1050,6 +1431,10 @@
    505  11510  padraig      g->register_time.tv_sec = 0;
    506  11510  padraig      g->register_time.tv_usec = 0;
    507  11510  padraig      AVAHI_LLIST_HEAD_INIT(AvahiEntry, g->entries);
    508  11510  padraig +#ifdef HAVE_BONJOUR
    509  11510  padraig +    AVAHI_LLIST_HEAD_INIT(AvahiService, g->services);
    510  11510  padraig +    g->record_connection = NULL;
    511  11510  padraig +#endif
    512  11510  padraig  
    513  11510  padraig      AVAHI_LLIST_PREPEND(AvahiSEntryGroup, groups, s->groups, g);
    514  11510  padraig      return g;
    515  11510  padraig @@ -1057,16 +1442,26 @@
    516  11510  padraig  
    517  11510  padraig  void avahi_s_entry_group_free(AvahiSEntryGroup *g) {
    518  11510  padraig      AvahiEntry *e;
    519  11510  padraig +#ifdef HAVE_BONJOUR
    520  11510  padraig +    AvahiService *s;
    521  11510  padraig +#endif
    522  11510  padraig      
    523  11510  padraig      assert(g);
    524  11510  padraig      assert(g->server);
    525  11510  padraig  
    526  11510  padraig      for (e = g->entries; e; e = e->by_group_next) {
    527  11510  padraig          if (!e->dead) {
    528  11510  padraig +#ifndef HAVE_BONJOUR
    529  11510  padraig              avahi_goodbye_entry(g->server, e, 1, 1);
    530  11510  padraig +#endif
    531  11510  padraig              e->dead = 1;
    532  11510  padraig          }
    533  11510  padraig      }
    534  11510  padraig +#ifdef HAVE_BONJOUR
    535  11510  padraig +    for (s = g->services; s; s = s->services_next) {
    536  11510  padraig +        s->dead = 1;
    537  11510  padraig +    }
    538  11510  padraig +#endif
    539  11510  padraig  
    540  11510  padraig      if (g->register_time_event) {
    541  11510  padraig          avahi_time_event_free(g->register_time_event);
    542  11510  padraig @@ -1077,9 +1472,17 @@
    543  11510  padraig      
    544  11510  padraig      g->server->need_group_cleanup = 1;
    545  11510  padraig      g->server->need_entry_cleanup = 1;
    546  11510  padraig +#ifdef HAVE_BONJOUR
    547  11510  padraig +    g->server->need_service_cleanup = 1;
    548  11510  padraig +    if (!g->server->cleanup_time_event)
    549  11510  padraig +        g->server->cleanup_time_event = avahi_time_event_new(g->server->time_event_queue, NULL, server_cleanup_time_event_callback, g->server);
    550  11510  padraig +#endif
    551  11510  padraig  }
    552  11510  padraig  
    553  11510  padraig  static void entry_group_commit_real(AvahiSEntryGroup *g) {
    554  11510  padraig +#ifdef HAVE_BONJOUR
    555  11510  padraig +    AvahiService *s;
    556  11510  padraig +#endif
    557  11510  padraig      assert(g);
    558  11510  padraig  
    559  11510  padraig      gettimeofday(&g->register_time, NULL);
    560  11510  padraig @@ -1089,8 +1492,15 @@
    561  11510  padraig      if (g->dead)
    562  11510  padraig          return;
    563  11510  padraig  
    564  11510  padraig +#ifdef HAVE_BONJOUR
    565  11510  padraig +    assert(g->server);
    566  11510  padraig +    for (s = g->services; s; s = s->services_next)
    567  11510  padraig +        if (!s->dead)
    568  11510  padraig +            avahi_register_service(g->server, s);
    569  11510  padraig +#else
    570  11510  padraig      avahi_announce_group(g->server, g);
    571  11510  padraig      avahi_s_entry_group_check_probed(g, 0);
    572  11510  padraig +#endif
    573  11510  padraig  }
    574  11510  padraig  
    575  11510  padraig  static void entry_group_register_time_event_callback(AVAHI_GCC_UNUSED AvahiTimeEvent *e, void* userdata) {
    576  11510  padraig @@ -1143,16 +1553,29 @@
    577  11510  padraig  
    578  11510  padraig  void avahi_s_entry_group_reset(AvahiSEntryGroup *g) {
    579  11510  padraig      AvahiEntry *e;
    580  11510  padraig +#ifdef HAVE_BONJOUR
    581  11510  padraig +    AvahiService *s;
    582  11510  padraig +#endif
    583  11510  padraig      assert(g);
    584  11510  padraig      
    585  11510  padraig      for (e = g->entries; e; e = e->by_group_next) {
    586  11510  padraig          if (!e->dead) {
    587  11510  padraig +#ifndef HAVE_BONJOUR
    588  11510  padraig              avahi_goodbye_entry(g->server, e, 1, 1);
    589  11510  padraig +#endif
    590  11510  padraig              e->dead = 1;
    591  11510  padraig          }
    592  11510  padraig      }
    593  11510  padraig      g->server->need_entry_cleanup = 1;
    594  11510  padraig  
    595  11510  padraig +#ifdef HAVE_BONJOUR
    596  11510  padraig +    for (s = g->services; s; s = s->services_next) {
    597  11510  padraig +        s->dead = 1;
    598  11510  padraig +    }
    599  11510  padraig +    g->server->need_service_cleanup = 1;
    600  11510  padraig +    if (!g->server->cleanup_time_event)
    601  11510  padraig +        g->server->cleanup_time_event = avahi_time_event_new(g->server->time_event_queue, NULL, server_cleanup_time_event_callback, g->server);
    602  11510  padraig +#endif
    603  11510  padraig      g->n_probing = 0;
    604  11510  padraig 
    605  11510  padraig      avahi_s_entry_group_change_state(g, AVAHI_ENTRY_GROUP_UNCOMMITED);
    606  11510  padraig @@ -1195,12 +1618,23 @@
    607  11510  padraig  
    608  11510  padraig  int avahi_s_entry_group_is_empty(AvahiSEntryGroup *g) {
    609  11510  padraig      AvahiEntry *e;
    610  11510  padraig +#ifdef HAVE_BONJOUR
    611  11510  padraig +    AvahiService *s;
    612  11510  padraig +#endif
    613  11510  padraig +
    614  11510  padraig      assert(g);
    615  11510  padraig  
    616  11510  padraig +#ifdef HAVE_BONJOUR
    617  11510  padraig +    for (s = g->services; s; s = s->services_next)
    618  11510  padraig +        if (!s->dead)
    619  11510  padraig +            return 0;
    620  11510  padraig +#else
    621  11510  padraig      /* Look for an entry that is not dead */
    622  11510  padraig      for (e = g->entries; e; e = e->by_group_next)
    623  11510  padraig          if (!e->dead)
    624  11510  padraig              return 0;
    625  11510  padraig +#endif
    626  11510  padraig  
    627  11510  padraig      return 1;
    628  11510  padraig  }
    629  11510  padraig +
    630