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