case AVAHI_ERR_INVALID_PORT:
case AVAHI_ERR_INVALID_KEY:
case AVAHI_ERR_INVALID_ADDRESS:
+ case AVAHI_ERR_INVALID_SERVICE_SUBTYPE:
return kDNSServiceErr_BadParam;
break;
case AVAHI_BROWSER_FAILURE:
- sdref->service_browser_callback(sdref, 0, interface, kDNSServiceErr_Unknown, NULL, NULL, NULL, sdref->context);
- break;
-
- case AVAHI_BROWSER_NOT_FOUND:
- sdref->service_browser_callback(sdref, 0, interface, kDNSServiceErr_NoSuchName, NULL, NULL, NULL, sdref->context);
+ sdref->service_browser_callback(sdref, 0, interface, map_error(avahi_client_errno(sdref->client)), NULL, NULL, NULL, sdref->context);
break;
case AVAHI_BROWSER_CACHE_EXHAUSTED:
assert(domain);
assert(callback);
- if (interface == kDNSServiceInterfaceIndexLocalOnly || flags != 0)
+ if (interface == kDNSServiceInterfaceIndexLocalOnly || flags != 0) {
+ AVAHI_WARN_UNSUPPORTED;
return kDNSServiceErr_Unsupported;
+ }
if (!(sdref = sdref_new()))
return kDNSServiceErr_Unknown;
if ((p = avahi_new0(char, (l = avahi_string_list_serialize(txt, NULL, 0))+1)))
avahi_string_list_serialize(txt, p, l);
- ret = avahi_service_name_snprint(full_name, sizeof(full_name), name, type, domain);
+ ret = avahi_service_name_join(full_name, sizeof(full_name), name, type, domain);
assert(ret == AVAHI_OK);
strcat(full_name, ".");
break;
}
- case AVAHI_RESOLVER_TIMEOUT:
- case AVAHI_RESOLVER_NOT_FOUND:
- sdref->service_resolver_callback(sdref, 0, interface, kDNSServiceErr_NoSuchName, NULL, NULL, 0, 0, NULL, sdref->context);
- break;
-
case AVAHI_RESOLVER_FAILURE:
- sdref->service_resolver_callback(sdref, 0, interface, kDNSServiceErr_Unknown, NULL, NULL, 0, 0, NULL, sdref->context);
+ sdref->service_resolver_callback(sdref, 0, interface, map_error(avahi_client_errno(sdref->client)), NULL, NULL, 0, 0, NULL, sdref->context);
}
}
assert(domain);
assert(callback);
- if (interface == kDNSServiceInterfaceIndexLocalOnly || flags != 0)
+ if (interface == kDNSServiceInterfaceIndexLocalOnly || flags != 0) {
+ AVAHI_WARN_UNSUPPORTED;
return kDNSServiceErr_Unsupported;
+ }
if (!(sdref = sdref_new()))
return kDNSServiceErr_Unknown;
assert(regtype);
assert(domain);
- if (avahi_service_name_snprint(fullName, kDNSServiceMaxDomainName, service, regtype, domain) < 0)
+ if (avahi_service_name_join(fullName, kDNSServiceMaxDomainName, service, regtype, domain) < 0)
return -1;
return 0;
break;
case AVAHI_BROWSER_FAILURE:
- sdref->domain_browser_callback(sdref, 0, interface, kDNSServiceErr_Unknown, domain, sdref->context);
- break;
-
- case AVAHI_BROWSER_NOT_FOUND:
- sdref->domain_browser_callback(sdref, 0, interface, kDNSServiceErr_NoSuchName, domain, sdref->context);
+ sdref->domain_browser_callback(sdref, 0, interface, map_error(avahi_client_errno(sdref->client)), domain, sdref->context);
break;
case AVAHI_BROWSER_CACHE_EXHAUSTED:
assert(callback);
if (interface == kDNSServiceInterfaceIndexLocalOnly ||
- (flags != kDNSServiceFlagsBrowseDomains && flags != kDNSServiceFlagsRegistrationDomains))
+ (flags != kDNSServiceFlagsBrowseDomains && flags != kDNSServiceFlagsRegistrationDomains)) {
+ AVAHI_WARN_UNSUPPORTED;
return kDNSServiceErr_Unsupported;
+ }
if (!(sdref = sdref_new()))
return kDNSServiceErr_Unknown;
ifindex = interface == kDNSServiceInterfaceIndexAny ? AVAHI_IF_UNSPEC : (AvahiIfIndex) interface;
- if (!(sdref->domain_browser = avahi_domain_browser_new(sdref->client, ifindex, AVAHI_PROTO_UNSPEC, NULL,
+ if (!(sdref->domain_browser = avahi_domain_browser_new(sdref->client, ifindex, AVAHI_PROTO_UNSPEC, "local",
flags == kDNSServiceFlagsRegistrationDomains ? AVAHI_DOMAIN_BROWSER_REGISTER : AVAHI_DOMAIN_BROWSER_BROWSE,
0, domain_browser_callback, sdref))) {
ret = map_error(avahi_client_errno(sdref->client));
static int reg_create_service(DNSServiceRef sdref) {
int ret;
+ const char *real_type;
+
assert(sdref);
assert(sdref->n_ref >= 1);
+ real_type = avahi_get_type_from_subtype(sdref->service_regtype);
+
if ((ret = avahi_entry_group_add_service_strlst(
sdref->entry_group,
sdref->service_interface,
AVAHI_PROTO_UNSPEC,
0,
sdref->service_name_chosen,
- sdref->service_regtype,
+ real_type ? real_type : sdref->service_regtype,
sdref->service_domain,
sdref->service_host,
sdref->service_port,
sdref->service_txt)) < 0)
return ret;
+
+ if (real_type) {
+ /* Create a subtype entry */
+
+ if (avahi_entry_group_add_service_subtype(
+ sdref->entry_group,
+ sdref->service_interface,
+ AVAHI_PROTO_UNSPEC,
+ 0,
+ sdref->service_name_chosen,
+ real_type,
+ sdref->service_domain,
+ sdref->service_regtype) < 0)
+ return ret;
+
+ }
+
if ((ret = avahi_entry_group_commit(sdref->entry_group)) < 0)
return ret;
assert(callback);
assert(regtype);
- if (interface == kDNSServiceInterfaceIndexLocalOnly || flags)
+ if (interface == kDNSServiceInterfaceIndexLocalOnly || flags) {
+ AVAHI_WARN_UNSUPPORTED;
return kDNSServiceErr_Unsupported;
+ }
if (!(sdref = sdref_new()))
return kDNSServiceErr_Unknown;
sdref->service_register_callback = callback;
sdref->service_name = avahi_strdup(name);
- sdref->service_regtype = regtype ? avahi_normalize_name(regtype) : NULL;
- sdref->service_domain = domain ? avahi_normalize_name(domain) : NULL;
- sdref->service_host = host ? avahi_normalize_name(host) : NULL;
+ sdref->service_regtype = regtype ? avahi_normalize_name_strdup(regtype) : NULL;
+ sdref->service_domain = domain ? avahi_normalize_name_strdup(domain) : NULL;
+ sdref->service_host = host ? avahi_normalize_name_strdup(host) : NULL;
sdref->service_interface = interface == kDNSServiceInterfaceIndexAny ? AVAHI_IF_UNSPEC : (AvahiIfIndex) interface;
sdref->service_port = ntohs(port);
sdref->service_txt = txtRecord ? avahi_string_list_parse(txtRecord, txtLen) : NULL;