]> git.meshlink.io Git - catta/blobdiff - avahi-core/announce.c
update TODO
[catta] / avahi-core / announce.c
index c21b147a5577ed3961b87e03ebbc6cdeb7b8c4c4..33d52aa2cd773dd21c74ace10015662c9fc7e2d7 100644 (file)
@@ -155,7 +155,7 @@ static void next_state(AvahiAnnouncement *a) {
 
     } 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
@@ -212,9 +212,9 @@ static void go_to_initial_state(AvahiAnnouncement *a, int immediately) {
     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;
@@ -336,7 +336,7 @@ int avahi_entry_is_registered(AvahiServer *s, AvahiEntry *e, AvahiInterface *i)
     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) {
@@ -354,7 +354,7 @@ 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) {
@@ -391,6 +391,26 @@ static AvahiRecord *make_goodbye_record(AvahiRecord *r) {
     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;
@@ -403,16 +423,19 @@ static void send_goodbye_callback(AvahiInterfaceMonitor *m, AvahiInterface *i, v
     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);
 }