Prepare for upcoming mDNS browse services.
Distinguish between registered and discovered services to avoid confusion.
Co-authored-by: Vishwanath Chandapur <vishwanath.chandapur@philips.com>
return sd_bus_reply_method_return(message, NULL);
}
-static int dnssd_service_on_bus_track(sd_bus_track *t, void *userdata) {
- DnssdService *s = ASSERT_PTR(userdata);
+static int dnssd_registered_service_on_bus_track(sd_bus_track *t, void *userdata) {
+ DnssdRegisteredService *s = ASSERT_PTR(userdata);
assert(t);
log_debug("Client of active request vanished, destroying DNS-SD service.");
- dnssd_service_free(s);
+ dnssd_registered_service_free(s);
return 0;
}
static int bus_method_register_service(sd_bus_message *message, void *userdata, sd_bus_error *error) {
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
- _cleanup_(dnssd_service_freep) DnssdService *service = NULL;
+ _cleanup_(dnssd_registered_service_freep) DnssdRegisteredService *service = NULL;
_cleanup_(sd_bus_track_unrefp) sd_bus_track *bus_track = NULL;
const char *id, *name_template, *type;
_cleanup_free_ char *path = NULL;
- DnssdService *s = NULL;
+ DnssdRegisteredService *s = NULL;
Manager *m = ASSERT_PTR(userdata);
uid_t euid;
int r;
if (m->mdns_support != RESOLVE_SUPPORT_YES)
return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED, "Support for MulticastDNS is disabled");
- service = new0(DnssdService, 1);
+ service = new0(DnssdRegisteredService, 1);
if (!service)
return log_oom();
if (!dnssd_srv_type_is_valid(type))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "DNS-SD service type '%s' is invalid", type);
- s = hashmap_get(m->dnssd_services, id);
+ s = hashmap_get(m->dnssd_registered_services, id);
if (s)
return sd_bus_error_setf(error, BUS_ERROR_DNSSD_SERVICE_EXISTS, "DNS-SD service '%s' exists already", id);
if (r == 0)
return 1; /* Polkit will call us back */
- r = hashmap_ensure_put(&m->dnssd_services, &string_hash_ops, service->id, service);
+ r = hashmap_ensure_put(&m->dnssd_registered_services, &string_hash_ops, service->id, service);
if (r < 0)
return r;
- r = sd_bus_track_new(sd_bus_message_get_bus(message), &bus_track, dnssd_service_on_bus_track, service);
+ r = sd_bus_track_new(sd_bus_message_get_bus(message), &bus_track, dnssd_registered_service_on_bus_track, service);
if (r < 0)
return r;
static int call_dnssd_method(Manager *m, sd_bus_message *message, sd_bus_message_handler_t handler, sd_bus_error *error) {
_cleanup_free_ char *name = NULL;
- DnssdService *s = NULL;
+ DnssdRegisteredService *s = NULL;
const char *path;
int r;
if (r < 0)
return r;
- s = hashmap_get(m->dnssd_services, name);
+ s = hashmap_get(m->dnssd_registered_services, name);
if (!s)
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_DNSSD_SERVICE, "DNS-SD service '%s' not known", name);
return 0;
}
-int dns_scope_add_dnssd_services(DnsScope *scope) {
- DnssdService *service;
+int dns_scope_add_dnssd_registered_services(DnsScope *scope) {
+ DnssdRegisteredService *service;
int r;
assert(scope);
- if (hashmap_isempty(scope->manager->dnssd_services))
+ if (hashmap_isempty(scope->manager->dnssd_registered_services))
return 0;
scope->announced = false;
- HASHMAP_FOREACH(service, scope->manager->dnssd_services) {
+ HASHMAP_FOREACH(service, scope->manager->dnssd_registered_services) {
service->withdrawn = false;
r = dns_zone_put(&scope->zone, scope, service->ptr_rr, false);
return 0;
}
-int dns_scope_remove_dnssd_services(DnsScope *scope) {
+int dns_scope_remove_dnssd_registered_services(DnsScope *scope) {
_cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
- DnssdService *service;
+ DnssdRegisteredService *service;
int r;
assert(scope);
if (r < 0)
return r;
- HASHMAP_FOREACH(service, scope->manager->dnssd_services) {
+ HASHMAP_FOREACH(service, scope->manager->dnssd_registered_services) {
dns_zone_remove_rr(&scope->zone, service->ptr_rr);
dns_zone_remove_rr(&scope->zone, service->sub_ptr_rr);
dns_zone_remove_rr(&scope->zone, service->srv_rr);
int dns_scope_announce(DnsScope *scope, bool goodbye);
-int dns_scope_add_dnssd_services(DnsScope *scope);
-int dns_scope_remove_dnssd_services(DnsScope *scope);
+int dns_scope_add_dnssd_registered_services(DnsScope *scope);
+int dns_scope_remove_dnssd_registered_services(DnsScope *scope);
bool dns_scope_is_default_route(DnsScope *scope);
#include "strv.h"
int bus_dnssd_method_unregister(sd_bus_message *message, void *userdata, sd_bus_error *error) {
- DnssdService *s = ASSERT_PTR(userdata);
+ DnssdRegisteredService *s = ASSERT_PTR(userdata);
Manager *m;
Link *l;
int r;
}
}
- dnssd_service_free(s);
+ dnssd_registered_service_free(s);
manager_refresh_rrs(m);
static int dnssd_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
_cleanup_free_ char *name = NULL;
Manager *m = ASSERT_PTR(userdata);
- DnssdService *service;
+ DnssdRegisteredService *service;
int r;
assert(bus);
if (r <= 0)
return 0;
- service = hashmap_get(m->dnssd_services, name);
+ service = hashmap_get(m->dnssd_registered_services, name);
if (!service)
return 0;
static int dnssd_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
_cleanup_strv_free_ char **l = NULL;
Manager *m = ASSERT_PTR(userdata);
- DnssdService *service;
+ DnssdRegisteredService *service;
unsigned c = 0;
int r;
assert(path);
assert(nodes);
- l = new0(char*, hashmap_size(m->dnssd_services) + 1);
+ l = new0(char*, hashmap_size(m->dnssd_registered_services) + 1);
if (!l)
return -ENOMEM;
- HASHMAP_FOREACH(service, m->dnssd_services) {
+ HASHMAP_FOREACH(service, m->dnssd_registered_services) {
char *p;
r = sd_bus_path_encode("/org/freedesktop/resolve1/dnssd", service->id, &p);
%struct-type
%includes
%%
-Service.Name, config_parse_dnssd_service_name, 0, 0
-Service.Type, config_parse_dnssd_service_type, 0, 0
-Service.SubType, config_parse_dnssd_service_subtype, 0, 0
-Service.Port, config_parse_ip_port, 0, offsetof(DnssdService, port)
-Service.Priority, config_parse_uint16, 0, offsetof(DnssdService, priority)
-Service.Weight, config_parse_uint16, 0, offsetof(DnssdService, weight)
+Service.Name, config_parse_dnssd_registered_service_name, 0, 0
+Service.Type, config_parse_dnssd_registered_service_type, 0, 0
+Service.SubType, config_parse_dnssd_registered_service_subtype, 0, 0
+Service.Port, config_parse_ip_port, 0, offsetof(DnssdRegisteredService, port)
+Service.Priority, config_parse_uint16, 0, offsetof(DnssdRegisteredService, priority)
+Service.Weight, config_parse_uint16, 0, offsetof(DnssdRegisteredService, weight)
Service.TxtText, config_parse_dnssd_txt, DNS_TXT_ITEM_TEXT, 0
Service.TxtData, config_parse_dnssd_txt, DNS_TXT_ITEM_DATA, 0
return dnssd_txtdata_free_all(next);
}
-DnssdService *dnssd_service_free(DnssdService *service) {
+DnssdRegisteredService *dnssd_registered_service_free(DnssdRegisteredService *service) {
if (!service)
return NULL;
if (service->manager)
- hashmap_remove(service->manager->dnssd_services, service->id);
+ hashmap_remove(service->manager->dnssd_registered_services, service->id);
dns_resource_record_unref(service->ptr_rr);
dns_resource_record_unref(service->sub_ptr_rr);
return mfree(service);
}
-void dnssd_service_clear_on_reload(Hashmap *services) {
- DnssdService *service;
+void dnssd_registered_service_clear_on_reload(Hashmap *services) {
+ DnssdRegisteredService *service;
HASHMAP_FOREACH(service, services)
if (service->config_source == RESOLVE_CONFIG_SOURCE_FILE) {
hashmap_remove(services, service->id);
- dnssd_service_free(service);
+ dnssd_registered_service_free(service);
}
}
return 0;
}
-static int dnssd_service_load(Manager *manager, const char *path) {
- _cleanup_(dnssd_service_freep) DnssdService *service = NULL;
+static int dnssd_registered_service_load(Manager *manager, const char *path) {
+ _cleanup_(dnssd_registered_service_freep) DnssdRegisteredService *service = NULL;
_cleanup_(dnssd_txtdata_freep) DnssdTxtData *txt_data = NULL;
_cleanup_free_ char *dropin_dirname = NULL;
int r;
assert(manager);
assert(path);
- service = new0(DnssdService, 1);
+ service = new0(DnssdRegisteredService, 1);
if (!service)
return log_oom();
TAKE_PTR(txt_data);
}
- r = hashmap_ensure_put(&manager->dnssd_services, &string_hash_ops, service->id, service);
+ r = hashmap_ensure_put(&manager->dnssd_registered_services, &string_hash_ops, service->id, service);
if (r < 0)
return r;
return strdup_to(ret, m->llmnr_hostname);
}
-int dnssd_render_instance_name(Manager *m, DnssdService *s, char **ret) {
+int dnssd_render_instance_name(Manager *m, DnssdRegisteredService *s, char **ret) {
static const Specifier specifier_table[] = {
{ 'a', specifier_architecture, NULL },
{ 'b', specifier_boot_id, NULL },
return log_error_errno(r, "Failed to enumerate .dnssd files: %m");
STRV_FOREACH_BACKWARDS(f, files) {
- r = dnssd_service_load(manager, *f);
+ r = dnssd_registered_service_load(manager, *f);
if (r < 0)
log_warning_errno(r, "Failed to load '%s': %m", *f);
}
return 0;
}
-int dnssd_update_rrs(DnssdService *s) {
+int dnssd_update_rrs(DnssdRegisteredService *s) {
_cleanup_free_ char *n = NULL, *service_name = NULL, *full_name = NULL, *sub_name = NULL, *selective_name = NULL;
int r;
}
int dnssd_signal_conflict(Manager *manager, const char *name) {
- DnssdService *s;
+ DnssdRegisteredService *s;
int r;
if (sd_bus_is_ready(manager->bus) <= 0)
return 0;
- HASHMAP_FOREACH(s, manager->dnssd_services) {
+ HASHMAP_FOREACH(s, manager->dnssd_registered_services) {
if (s->withdrawn)
continue;
return 0;
}
-int config_parse_dnssd_service_name(
+int config_parse_dnssd_registered_service_name(
const char *unit,
const char *filename,
unsigned line,
{ 'W', specifier_os_variant_id, NULL },
{}
};
- DnssdService *s = ASSERT_PTR(userdata);
+ DnssdRegisteredService *s = ASSERT_PTR(userdata);
_cleanup_free_ char *name = NULL;
int r;
return free_and_strdup_warn(&s->name_template, rvalue);
}
-int config_parse_dnssd_service_type(
+int config_parse_dnssd_registered_service_type(
const char *unit,
const char *filename,
unsigned line,
void *data,
void *userdata) {
- DnssdService *s = ASSERT_PTR(userdata);
+ DnssdRegisteredService *s = ASSERT_PTR(userdata);
int r;
assert(filename);
return 0;
}
-int config_parse_dnssd_service_subtype(
+int config_parse_dnssd_registered_service_subtype(
const char *unit,
const char *filename,
unsigned line,
void *data,
void *userdata) {
- DnssdService *s = ASSERT_PTR(userdata);
+ DnssdRegisteredService *s = ASSERT_PTR(userdata);
assert(filename);
assert(lvalue);
void *userdata) {
_cleanup_(dnssd_txtdata_freep) DnssdTxtData *txt_data = NULL;
- DnssdService *s = ASSERT_PTR(userdata);
+ DnssdRegisteredService *s = ASSERT_PTR(userdata);
DnsTxtItem *last = NULL;
assert(filename);
LIST_FIELDS(DnssdTxtData, items);
} DnssdTxtData;
-typedef struct DnssdService {
+typedef struct DnssdRegisteredService {
char *path;
char *id;
char *name_template;
bool withdrawn:1;
uid_t originator;
-} DnssdService;
+} DnssdRegisteredService;
-DnssdService *dnssd_service_free(DnssdService *service);
+DnssdRegisteredService *dnssd_registered_service_free(DnssdRegisteredService *service);
DnssdTxtData *dnssd_txtdata_free(DnssdTxtData *txt_data);
DnssdTxtData *dnssd_txtdata_free_all(DnssdTxtData *txt_data);
-void dnssd_service_clear_on_reload(Hashmap *services);
+void dnssd_registered_service_clear_on_reload(Hashmap *services);
-DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdService*, dnssd_service_free);
+DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdRegisteredService*, dnssd_registered_service_free);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdTxtData*, dnssd_txtdata_free);
-int dnssd_render_instance_name(Manager *m, DnssdService *s, char **ret);
+int dnssd_render_instance_name(Manager *m, DnssdRegisteredService *s, char **ret);
int dnssd_load(Manager *manager);
int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item);
int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item);
-int dnssd_update_rrs(DnssdService *s);
+int dnssd_update_rrs(DnssdRegisteredService *s);
int dnssd_signal_conflict(Manager *manager, const char *name);
const struct ConfigPerfItem* resolved_dnssd_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
-CONFIG_PARSER_PROTOTYPE(config_parse_dnssd_service_name);
-CONFIG_PARSER_PROTOTYPE(config_parse_dnssd_service_subtype);
-CONFIG_PARSER_PROTOTYPE(config_parse_dnssd_service_type);
+CONFIG_PARSER_PROTOTYPE(config_parse_dnssd_registered_service_name);
+CONFIG_PARSER_PROTOTYPE(config_parse_dnssd_registered_service_subtype);
+CONFIG_PARSER_PROTOTYPE(config_parse_dnssd_registered_service_type);
CONFIG_PARSER_PROTOTYPE(config_parse_dnssd_txt);
link_get_mdns_support(l) == RESOLVE_SUPPORT_YES) {
if (l->mdns_ipv4_scope) {
- r = dns_scope_add_dnssd_services(l->mdns_ipv4_scope);
+ r = dns_scope_add_dnssd_registered_services(l->mdns_ipv4_scope);
if (r < 0)
log_link_warning_errno(l, r, "Failed to add IPv4 DNS-SD services, ignoring: %m");
}
if (l->mdns_ipv6_scope) {
- r = dns_scope_add_dnssd_services(l->mdns_ipv6_scope);
+ r = dns_scope_add_dnssd_registered_services(l->mdns_ipv6_scope);
if (r < 0)
log_link_warning_errno(l, r, "Failed to add IPv6 DNS-SD services, ignoring: %m");
}
} else {
if (l->mdns_ipv4_scope) {
- r = dns_scope_remove_dnssd_services(l->mdns_ipv4_scope);
+ r = dns_scope_remove_dnssd_registered_services(l->mdns_ipv4_scope);
if (r < 0)
log_link_warning_errno(l, r, "Failed to remove IPv4 DNS-SD services, ignoring: %m");
}
if (l->mdns_ipv6_scope) {
- r = dns_scope_remove_dnssd_services(l->mdns_ipv6_scope);
+ r = dns_scope_remove_dnssd_registered_services(l->mdns_ipv6_scope);
if (r < 0)
log_link_warning_errno(l, r, "Failed to remove IPv6 DNS-SD services, ignoring: %m");
}
dns_server_unlink_on_reload(m->fallback_dns_servers);
m->dns_extra_stub_listeners = ordered_set_free(m->dns_extra_stub_listeners);
manager_dns_stub_stop(m);
- dnssd_service_clear_on_reload(m->dnssd_services);
+ dnssd_registered_service_clear_on_reload(m->dnssd_registered_services);
m->unicast_scope = dns_scope_free(m->unicast_scope);
m->delegates = hashmap_free(m->delegates);
dns_trust_anchor_flush(&m->trust_anchor);
Manager* manager_free(Manager *m) {
Link *l;
+ DnssdRegisteredService *s;
if (!m)
return NULL;
free(m->llmnr_hostname);
free(m->mdns_hostname);
- DnssdService *s;
- while ((s = hashmap_first(m->dnssd_services)))
- dnssd_service_free(s);
- hashmap_free(m->dnssd_services);
+ while ((s = hashmap_first(m->dnssd_registered_services)))
+ dnssd_registered_service_free(s);
+ hashmap_free(m->dnssd_registered_services);
dns_trust_anchor_flush(&m->trust_anchor);
manager_etc_hosts_flush(m);
void manager_refresh_rrs(Manager *m) {
Link *l;
- DnssdService *s;
+ DnssdRegisteredService *s;
assert(m);
link_add_rrs(l, true);
if (m->mdns_support == RESOLVE_SUPPORT_YES)
- HASHMAP_FOREACH(s, m->dnssd_services)
+ HASHMAP_FOREACH(s, m->dnssd_registered_services)
if (dnssd_update_rrs(s) < 0)
log_warning("Failed to refresh DNS-SD service '%s'", s->id);
}
bool manager_next_dnssd_names(Manager *m) {
- DnssdService *s;
+ DnssdRegisteredService *s;
bool tried = false;
int r;
assert(m);
- HASHMAP_FOREACH(s, m->dnssd_services) {
+ HASHMAP_FOREACH(s, m->dnssd_registered_services) {
_cleanup_free_ char * new_name = NULL;
if (!s->withdrawn)
sd_event_source *mdns_ipv6_event_source;
/* DNS-SD */
- Hashmap *dnssd_services;
+ Hashmap *dnssd_registered_services;
/* dbus */
sd_bus *bus;