resolve: use custom hash_ops for Manager.dnssd_registered_services

This commit is contained in:
Yu Watanabe
2026-09-23 11:38:15 +09:00
parent 3959ccbd32
commit e677674522
4 changed files with 21 additions and 11 deletions
+10 -7
View File
@@ -2055,6 +2055,15 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
if (r == 0)
return 1; /* Polkit will call us back */
/* First, attach the service to the manager. */
r = hashmap_ensure_put(&m->dnssd_registered_services, &dnssd_registered_service_hash_ops, service->id, service);
if (r < 0)
return r;
service->manager = m;
/* Then, attach the bus track to the service. As dnssd_registered_service_on_bus_track() requires
* service->manager is set, this must be done after attaching to the manager in the above. */
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;
@@ -2067,13 +2076,7 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
* bus, hence keep the bus track object pinned for the lifetime of the service. */
service->bus_track = TAKE_PTR(bus_track);
service->manager = m;
r = hashmap_ensure_put(&m->dnssd_registered_services, &string_hash_ops, service->id, service);
if (r < 0)
return r;
service = NULL;
TAKE_PTR(service);
manager_refresh_rrs(m);
+9 -1
View File
@@ -74,6 +74,14 @@ DnssdRegisteredService *dnssd_registered_service_free(DnssdRegisteredService *se
return mfree(service);
}
DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
dnssd_registered_service_hash_ops,
char,
string_hash_func,
string_compare_func,
DnssdRegisteredService,
dnssd_registered_service_free);
static int dnssd_registered_service_make_goodbye(
DnssdRegisteredService *service,
DnsScope *scope,
@@ -263,7 +271,7 @@ static int dnssd_registered_service_load(Manager *manager, const char *path) {
TAKE_PTR(txt_data);
}
r = hashmap_ensure_put(&manager->dnssd_registered_services, &string_hash_ops, service->id, service);
r = hashmap_ensure_put(&manager->dnssd_registered_services, &dnssd_registered_service_hash_ops, service->id, service);
if (r < 0)
return r;
+2
View File
@@ -50,6 +50,8 @@ typedef struct DnssdRegisteredService {
uid_t originator;
} DnssdRegisteredService;
extern const struct hash_ops dnssd_registered_service_hash_ops;
DnssdRegisteredService *dnssd_registered_service_free(DnssdRegisteredService *service);
void dnssd_registered_service_unregister(DnssdRegisteredService *service);
DnssdTxtData *dnssd_txtdata_free(DnssdTxtData *txt_data);
-3
View File
@@ -840,7 +840,6 @@ int manager_start(Manager *m) {
Manager* manager_free(Manager *m) {
Link *l;
DnssdRegisteredService *s;
if (!m)
return NULL;
@@ -914,8 +913,6 @@ Manager* manager_free(Manager *m) {
free(m->llmnr_hostname);
free(m->mdns_hostname);
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);