resolve: use custom hash_ops for Manager.dnssd_registered_services
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user