<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>