avahi_dns_packet_set_field(p, AVAHI_DNS_FIELD_ID, slot->id);
for (j = s->monitor->interfaces; j; j = j->interface_next)
- if (avahi_interface_relevant(j) &&
+ if (avahi_interface_is_relevant(j) &&
j != i &&
(s->config.reflect_ipv || j->protocol == i->protocol)) {
struct sockaddr_in lsa;
socklen_t l = sizeof(lsa);
- if (getsockname(s->fd_legacy_unicast_ipv4, &lsa, &l) != 0)
+ if (getsockname(s->fd_legacy_unicast_ipv4, (struct sockaddr*) &lsa, &l) != 0)
avahi_log_warn("getsockname(): %s", strerror(errno));
else
return lsa.sin_port == ((const struct sockaddr_in*) sa)->sin_port;
struct sockaddr_in6 lsa;
socklen_t l = sizeof(lsa);
- if (getsockname(s->fd_legacy_unicast_ipv6, &lsa, &l) != 0)
+ if (getsockname(s->fd_legacy_unicast_ipv6, (struct sockaddr*) &lsa, &l) != 0)
avahi_log_warn("getsockname(): %s", strerror(errno));
else
return lsa.sin6_port == ((const struct sockaddr_in6*) sa)->sin6_port;
assert(iface > 0);
if (!(i = avahi_interface_monitor_get_interface(s->monitor, iface, avahi_af_to_proto(sa->sa_family))) ||
- !avahi_interface_relevant(i)) {
+ !avahi_interface_is_relevant(i)) {
avahi_log_warn("Recieved packet from invalid interface.");
return;
}
assert(iface > 0);
if (!(i = avahi_interface_monitor_get_interface(s->monitor, iface, avahi_af_to_proto(sa->sa_family))) ||
- !avahi_interface_relevant(i)) {
+ !avahi_interface_is_relevant(i)) {
avahi_log_warn("Recieved packet from invalid interface.");
return;
}
}
if (!(j = avahi_interface_monitor_get_interface(s->monitor, slot->interface, slot->address.proto)) ||
- !avahi_interface_relevant(j))
+ !avahi_interface_is_relevant(j))
return;
/* Patch the original ID into this response */
if (s->browse_domain_entry_group)
avahi_s_entry_group_reset(s->browse_domain_entry_group);
- avahi_update_host_rrs(s->monitor, 1);
+ avahi_interface_monitor_update_rrs(s->monitor, 1);
s->n_host_rr_pending = 0;
}
register_hinfo(s);
register_browse_domain(s);
- avahi_update_host_rrs(s->monitor, 0);
+ avahi_interface_monitor_update_rrs(s->monitor, 0);
s->n_host_rr_pending --;
AvahiServer *s;
int e;
- if ((e = valid_server_config(sc)) < 0) {
+ if (sc && (e = valid_server_config(sc)) < 0) {
if (error)
*error = e;
return NULL;
assert(type);
assert(name);
- if (!AVAHI_IF_VALID(interface)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_INTERFACE);
- goto fail;
- }
-
- if (!AVAHI_PROTO_VALID(protocol)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_PROTOCOL);
- goto fail;
- }
-
- if (!AVAHI_FLAGS_VALID(flags, AVAHI_PUBLISH_NO_COOKIE|AVAHI_PUBLISH_IS_PROXY)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_FLAGS);
- goto fail;
- }
-
- if (!avahi_is_valid_service_name(name)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_NAME);
- goto fail;
- }
-
- if (!avahi_is_valid_service_type(type)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_TYPE);
- goto fail;
- }
-
- if (domain && !avahi_is_valid_domain_name(domain)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_DOMAIN_NAME);
- goto fail;
- }
-
- if (host && !avahi_is_valid_domain_name(host)) {
- ret = avahi_server_set_errno(s, AVAHI_ERR_INVALID_HOST_NAME);
- goto fail;
- }
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_FLAGS_VALID(flags, AVAHI_PUBLISH_NO_COOKIE|AVAHI_PUBLISH_IS_PROXY), AVAHI_ERR_INVALID_FLAGS);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, avahi_is_valid_service_name(name), AVAHI_ERR_INVALID_SERVICE_NAME);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, avahi_is_valid_service_type_strict(type), AVAHI_ERR_INVALID_SERVICE_TYPE);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, !host || avahi_is_valid_domain_name(host), AVAHI_ERR_INVALID_HOST_NAME);
if (!domain)
domain = s->domain_name;
if ((ret = avahi_service_name_join(svc_name, sizeof(svc_name), name, type, domain)) < 0 ||
(ret = avahi_service_name_join(ptr_name, sizeof(ptr_name), NULL, type, domain)) < 0 ||
- (ret = avahi_service_name_join(enum_ptr, sizeof(enum_ptr), NULL, "_services._dns-sd._udp", domain)) < 0)
+ (ret = avahi_service_name_join(enum_ptr, sizeof(enum_ptr), NULL, "_services._dns-sd._udp", domain)) < 0) {
+ avahi_server_set_errno(s, ret);
goto fail;
+ }
+ /* Add service enumeration PTR record */
+
if ((ret = avahi_server_add_ptr(s, g, interface, protocol, flags & AVAHI_PUBLISH_IS_PROXY, AVAHI_DEFAULT_TTL, ptr_name, svc_name)) < 0)
goto fail;
+ /* Add SRV record */
+
if (!(r = avahi_record_new_full(svc_name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV, AVAHI_DEFAULT_TTL_HOST_NAME))) {
ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY);
goto fail;
if (ret < 0)
goto fail;
+ /* Add TXT record */
+
if (!(flags & AVAHI_PUBLISH_NO_COOKIE))
strlst = add_magic_cookie(s, strlst);
if (ret < 0)
goto fail;
+ /* Add service type enumeration record */
+
ret = avahi_server_add_ptr(s, g, interface, protocol, (flags & AVAHI_PUBLISH_IS_PROXY), AVAHI_DEFAULT_TTL, enum_ptr, ptr_name);
fail:
return ret;
}
+int avahi_server_add_service_subtype(
+ AvahiServer *s,
+ AvahiSEntryGroup *g,
+ AvahiIfIndex interface,
+ AvahiProtocol protocol,
+ AvahiPublishFlags flags,
+ const char *name,
+ const char *type,
+ const char *domain,
+ const char *subtype) {
+
+ int ret = AVAHI_OK;
+ char svc_name[AVAHI_DOMAIN_NAME_MAX], ptr_name[AVAHI_DOMAIN_NAME_MAX];
+
+ assert(name);
+ assert(type);
+ assert(subtype);
+
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, AVAHI_FLAGS_VALID(flags, 0), AVAHI_ERR_INVALID_FLAGS);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, avahi_is_valid_service_name(name), AVAHI_ERR_INVALID_SERVICE_NAME);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, avahi_is_valid_service_type_strict(type), AVAHI_ERR_INVALID_SERVICE_TYPE);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+ AVAHI_CHECK_VALIDITY_SET_RET_GOTO_FAIL(s, avahi_is_valid_service_subtype(subtype), AVAHI_ERR_INVALID_SERVICE_SUBTYPE);
+
+ if (!domain)
+ domain = s->domain_name;
+
+ if ((ret = avahi_service_name_join(svc_name, sizeof(svc_name), name, type, domain)) < 0 ||
+ (ret = avahi_service_name_join(ptr_name, sizeof(ptr_name), NULL, subtype, domain)) < 0) {
+ avahi_server_set_errno(s, ret);
+ goto fail;
+ }
+
+ if ((ret = avahi_server_add_ptr(s, g, interface, protocol, flags & AVAHI_PUBLISH_IS_PROXY, AVAHI_DEFAULT_TTL, ptr_name, svc_name)) < 0)
+ goto fail;
+
+fail:
+
+ return ret;
+}
+
static void hexstring(char *s, size_t sl, const void *p, size_t pl) {
static const char hex[] = "0123456789abcdef";
int b = 0;
if (!avahi_is_valid_service_name(name))
return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_NAME);
- if (!avahi_is_valid_service_type(type))
+ if (!avahi_is_valid_service_type_strict(type))
return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_TYPE);
if (domain && !avahi_is_valid_domain_name(domain))