} else if (a->state == AVAHI_ANNOUNCING) {
- if (a->entry->flags & AVAHI_ENTRY_UNIQUE)
+ if (a->entry->flags & AVAHI_PUBLISH_UNIQUE)
/* Send the whole rrset at once */
avahi_server_prepare_matching_responses(a->server, a->interface, a->entry->record->key, 0);
else
assert(a);
e = a->entry;
- if ((e->flags & AVAHI_ENTRY_UNIQUE) && !(e->flags & AVAHI_ENTRY_NOPROBE))
+ if ((e->flags & AVAHI_PUBLISH_UNIQUE) && !(e->flags & AVAHI_PUBLISH_NO_PROBE))
a->state = AVAHI_PROBING;
- else if (!(e->flags & AVAHI_ENTRY_NOANNOUNCE)) {
+ else if (!(e->flags & AVAHI_PUBLISH_NO_ANNOUNCE)) {
if (!e->group || e->group->state == AVAHI_ENTRY_GROUP_ESTABLISHED)
a->state = AVAHI_ANNOUNCING;
return
a->state == AVAHI_ANNOUNCING ||
a->state == AVAHI_ESTABLISHED ||
- (a->state == AVAHI_WAITING && !(e->flags & AVAHI_ENTRY_UNIQUE));
+ (a->state == AVAHI_WAITING && !(e->flags & AVAHI_PUBLISH_UNIQUE));
}
int avahi_entry_is_probing(AvahiServer *s, AvahiEntry *e, AvahiInterface *i) {
return
a->state == AVAHI_PROBING ||
- (a->state == AVAHI_WAITING && (e->flags & AVAHI_ENTRY_UNIQUE));
+ (a->state == AVAHI_WAITING && (e->flags & AVAHI_PUBLISH_UNIQUE));
}
void avahi_entry_return_to_initial_state(AvahiServer *s, AvahiEntry *e, AvahiInterface *i) {
return g;
}
+static int is_duplicate_entry(AvahiServer *s, AvahiEntry *e) {
+ AvahiEntry *i;
+
+ assert(s);
+ assert(e);
+
+ for (i = avahi_hashmap_lookup(s->entries_by_key, e->record->key); i; i = i->by_key_next) {
+
+ if (i == e)
+ continue;
+
+ if (!avahi_record_equal_no_ttl(i->record, e->record))
+ continue;
+
+ return 1;
+ }
+
+ return 0;
+}
+
static void send_goodbye_callback(AvahiInterfaceMonitor *m, AvahiInterface *i, void* userdata) {
AvahiEntry *e = userdata;
AvahiRecord *g;
if (!avahi_interface_match(i, e->interface, e->protocol))
return;
- if (e->flags & AVAHI_ENTRY_NOANNOUNCE)
+ if (e->flags & AVAHI_PUBLISH_NO_ANNOUNCE)
return;
if (!avahi_entry_is_registered(m->server, e, i))
return;
+
+ if (is_duplicate_entry(m->server, e))
+ return;
if (!(g = make_goodbye_record(e->record)))
return; /* OOM */
- avahi_interface_post_response(i, g, e->flags & AVAHI_ENTRY_UNIQUE, NULL, 1);
+ avahi_interface_post_response(i, g, e->flags & AVAHI_PUBLISH_UNIQUE, NULL, 1);
avahi_record_unref(g);
}
/* avahi_log_debug("goodbye interface: %s.%u", i->hardware->name, i->protocol); */
- if (goodbye && avahi_interface_relevant(i)) {
+ if (goodbye && avahi_interface_is_relevant(i)) {
AvahiEntry *e;
for (e = s->entries; e; e = e->entries_next)