<div dir="ltr"><div>I am trying to understand different AvahiPublishFlags to choose a right one. What does AvahiPublishFlags#AVAHI_PUBLISH_UPDATE mean? <br><br></div><div>Documentation says:<br>Update existing records instead of adding new ones. <br>
<br>Reference: <a href="http://avahi.org/download/doxygen/defs_8h.html#a4b10ef40d32caa6ef2e2d62cae00b4a3">http://avahi.org/download/doxygen/defs_8h.html#a4b10ef40d32caa6ef2e2d62cae00b4a3</a><br><br></div><div>I traced the implementation into entry.c#server_add_service_strlst_nocopy() as follows but still, AVAHI_PUBLISH_UPDATE is only used for error checking. Any help is welcomed<br>
<br>static int server_add_service_strlst_nocopy(<br> AvahiServer *s,<br> AvahiSEntryGroup *g,<br> AvahiIfIndex interface,<br> AvahiProtocol protocol,<br> AvahiPublishFlags flags,<br> const char *name,<br>
const char *type,<br> const char *domain,<br> const char *host,<br> uint16_t port,<br> AvahiStringList *strlst) {<br><br> char ptr_name[AVAHI_DOMAIN_NAME_MAX], svc_name[AVAHI_DOMAIN_NAME_MAX], enum_ptr[AVAHI_DOMAIN_NAME_MAX], *h = NULL;<br>
AvahiRecord *r = NULL;<br> int ret = AVAHI_OK;<br> AvahiEntry *srv_entry = NULL, *txt_entry = NULL, *ptr_entry = NULL, *enum_entry = NULL;<br><br> assert(s);<br> assert(type);<br> assert(name);<br><br>
AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);<br>
AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);<br> AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_FLAGS_VALID(flags,<br> AVAHI_PUBLISH_NO_COOKIE|<br>
AVAHI_PUBLISH_UPDATE|<br> AVAHI_PUBLISH_USE_WIDE_AREA|<br> AVAHI_PUBLISH_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);<br>
AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, avahi_is_valid_service_name(name), AVAHI_ERR_INVALID_SERVICE_NAME);<br> AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, avahi_is_valid_service_type_strict(type), AVAHI_ERR_INVALID_SERVICE_TYPE);<br>
AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);<br> AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, !host || avahi_is_valid_fqdn(host), AVAHI_ERR_INVALID_HOST_NAME);<br>
<br> if (!domain)<br> domain = s->domain_name;<br><br> if (!host)<br> host = s->host_name_fqdn;<br><br> transport_flags_from_domain(s, &flags, domain);<br> AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, flags & AVAHI_PUBLISH_USE_MULTICAST, AVAHI_ERR_NOT_SUPPORTED);<br>
<br> if (!(h = avahi_normalize_name_strdup(host))) {<br> ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);<br> goto fail;<br> }<br><br> if ((ret = avahi_service_name_join(svc_name, sizeof(svc_name), name, type, domain)) < 0 ||<br>
(ret = avahi_service_name_join(ptr_name, sizeof(ptr_name), NULL, type, domain)) < 0 ||<br> (ret = avahi_service_name_join(enum_ptr, sizeof(enum_ptr), NULL, "_services._dns-sd._udp", domain)) < 0) {<br>
avahi_server_set_errno(s, ret);<br> goto fail;<br> }<br><br> /* Add service enumeration PTR record */<br><br> if (!(ptr_entry = server_add_ptr_internal(s, g, interface, protocol, 0, AVAHI_DEFAULT_TTL, ptr_name, svc_name))) {<br>
ret = avahi_server_errno(s);<br> goto fail;<br> }<br><br> /* Add SRV record */<br><br> if (!(r = avahi_record_new_full(svc_name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV, AVAHI_DEFAULT_TTL_HOST_NAME))) {<br>
ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);<br> goto fail;<br> }<br><br> r->data.srv.priority = 0;<br> r->data.srv.weight = 0;<br> r->data.srv.port = port;<br> r-><a href="http://data.srv.name">data.srv.name</a> = h;<br>
h = NULL;<br> srv_entry = server_add_internal(s, g, interface, protocol, AVAHI_PUBLISH_UNIQUE, r);<br> avahi_record_unref(r);<br><br> if (!srv_entry) {<br> ret = avahi_server_errno(s);<br> goto fail;<br>
}<br><br> /* Add TXT record */<br><br> if (!(flags & AVAHI_PUBLISH_NO_COOKIE))<br> strlst = add_magic_cookie(s, strlst);<br><br> txt_entry = server_add_txt_strlst_nocopy(s, g, interface, protocol, AVAHI_PUBLISH_UNIQUE, AVAHI_DEFAULT_TTL, svc_name, strlst);<br>
strlst = NULL;<br><br> if (!txt_entry) {<br> ret = avahi_server_errno(s);<br> goto fail;<br> }<br><br> /* Add service type enumeration record */<br><br> if (!(enum_entry = server_add_ptr_internal(s, g, interface, protocol, 0, AVAHI_DEFAULT_TTL, enum_ptr, ptr_name))) {<br>
ret = avahi_server_errno(s);<br> goto fail;<br> }<br><br>fail:<br> if (ret != AVAHI_OK && !(flags & AVAHI_PUBLISH_UPDATE)) {<br> if (srv_entry)<br> avahi_entry_free(s, srv_entry);<br>
if (txt_entry)<br> avahi_entry_free(s, txt_entry);<br> if (ptr_entry)<br> avahi_entry_free(s, ptr_entry);<br> if (enum_entry)<br> avahi_entry_free(s, enum_entry);<br>
}<br><br> avahi_string_list_free(strlst);<br> avahi_free(h);<br><br> return ret;<br>}<br></div><div><br><br></div><div><div><br clear="all"><div>Ruoruo Zhang(Lily)<br><div><br></div></div>
</div></div></div>