-static int check_record_conflict(AvahiServer *s, AvahiIfIndex interface, AvahiProtocol protocol, AvahiRecord *r, AvahiEntryFlags flags) {
- AvahiEntry *e;
-
- assert(s);
- assert(r);
-
- for (e = avahi_hashmap_lookup(s->entries_by_key, r->key); e; e = e->by_key_next) {
- if (e->dead)
- continue;
-
- if (!(flags & AVAHI_ENTRY_UNIQUE) && !(e->flags & AVAHI_ENTRY_UNIQUE))
- continue;
-
- if ((flags & AVAHI_ENTRY_ALLOWMUTIPLE) && (e->flags & AVAHI_ENTRY_ALLOWMUTIPLE) )
- continue;
-
- if ((interface <= 0 ||
- e->interface <= 0 ||
- e->interface == interface) &&
- (protocol == AVAHI_PROTO_UNSPEC ||
- e->protocol == AVAHI_PROTO_UNSPEC ||
- e->protocol == protocol))
-
- return -1;
- }
-
- return 0;
-}
-
-int avahi_server_add(
- AvahiServer *s,
- AvahiSEntryGroup *g,
- AvahiIfIndex interface,
- AvahiProtocol protocol,
- AvahiEntryFlags flags,
- AvahiRecord *r) {
-
- AvahiEntry *e, *t;
-
- assert(s);
- assert(r);
-
- if (r->ttl == 0)
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_TTL);
-
- if (avahi_key_is_pattern(r->key))
- return avahi_server_set_errno(s, AVAHI_ERR_IS_PATTERN);
-
- if (!avahi_record_is_valid(r))
- return avahi_server_set_errno(s, AVAHI_ERR_INVALID_RECORD);
-
- if (check_record_conflict(s, interface, protocol, r, flags) < 0)
- return avahi_server_set_errno(s, AVAHI_ERR_LOCAL_COLLISION);
-
- if (!(e = avahi_new(AvahiEntry, 1)))
- return avahi_server_set_errno(s, AVAHI_ERR_NO_NETWORK);
-
- e->server = s;
- e->record = avahi_record_ref(r);
- e->group = g;
- e->interface = interface;
- e->protocol = protocol;
- e->flags = flags;
- e->dead = 0;
-
- AVAHI_LLIST_HEAD_INIT(AvahiAnnouncement, e->announcements);
-
- AVAHI_LLIST_PREPEND(AvahiEntry, entries, s->entries, e);
-
- /* Insert into hash table indexed by name */
- t = avahi_hashmap_lookup(s->entries_by_key, e->record->key);
- AVAHI_LLIST_PREPEND(AvahiEntry, by_key, t, e);
- avahi_hashmap_replace(s->entries_by_key, e->record->key, t);
-
- /* Insert into group list */
- if (g)
- AVAHI_LLIST_PREPEND(AvahiEntry, by_group, g->entries, e);
-
- avahi_announce_entry(s, e);
-
- return 0;
-}
-
-const AvahiRecord *avahi_server_iterate(AvahiServer *s, AvahiSEntryGroup *g, void **state) {
- AvahiEntry **e = (AvahiEntry**) state;