2 #include "alloc-util.h"
4 #include "resolved-dnssd.h"
5 #include "resolved-dnssd-bus.h"
6 #include "resolved-link.h"
10 int bus_dnssd_method_unregister(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
11 DnssdService
*s
= userdata
;
12 DnssdTxtData
*txt_data
;
23 r
= bus_verify_polkit_async(message
, CAP_SYS_ADMIN
,
24 "org.freedesktop.resolve1.unregister-service",
25 NULL
, false, s
->originator
,
26 &m
->polkit_registry
, error
);
30 return 1; /* Polkit will call us back */
32 HASHMAP_FOREACH(l
, m
->links
, i
) {
33 if (l
->mdns_ipv4_scope
) {
34 r
= dns_scope_announce(l
->mdns_ipv4_scope
, true);
36 log_warning_errno(r
, "Failed to send goodbye messages in IPv4 scope: %m");
38 dns_zone_remove_rr(&l
->mdns_ipv4_scope
->zone
, s
->ptr_rr
);
39 dns_zone_remove_rr(&l
->mdns_ipv4_scope
->zone
, s
->srv_rr
);
40 LIST_FOREACH(items
, txt_data
, s
->txt_data_items
)
41 dns_zone_remove_rr(&l
->mdns_ipv4_scope
->zone
, txt_data
->rr
);
44 if (l
->mdns_ipv6_scope
) {
45 r
= dns_scope_announce(l
->mdns_ipv6_scope
, true);
47 log_warning_errno(r
, "Failed to send goodbye messages in IPv6 scope: %m");
49 dns_zone_remove_rr(&l
->mdns_ipv6_scope
->zone
, s
->ptr_rr
);
50 dns_zone_remove_rr(&l
->mdns_ipv6_scope
->zone
, s
->srv_rr
);
51 LIST_FOREACH(items
, txt_data
, s
->txt_data_items
)
52 dns_zone_remove_rr(&l
->mdns_ipv6_scope
->zone
, txt_data
->rr
);
56 dnssd_service_free(s
);
58 manager_refresh_rrs(m
);
60 return sd_bus_reply_method_return(message
, NULL
);
63 const sd_bus_vtable dnssd_vtable
[] = {
64 SD_BUS_VTABLE_START(0),
66 SD_BUS_METHOD("Unregister", NULL
, NULL
, bus_dnssd_method_unregister
, SD_BUS_VTABLE_UNPRIVILEGED
),
67 SD_BUS_SIGNAL("Conflicted", NULL
, 0),
72 int dnssd_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
73 _cleanup_free_
char *name
= NULL
;
74 Manager
*m
= userdata
;
75 DnssdService
*service
;
84 r
= sd_bus_path_decode(path
, "/org/freedesktop/resolve1/dnssd", &name
);
88 service
= hashmap_get(m
->dnssd_services
, name
);
96 int dnssd_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
97 _cleanup_strv_free_
char **l
= NULL
;
98 Manager
*m
= userdata
;
99 DnssdService
*service
;
109 l
= new0(char*, hashmap_size(m
->dnssd_services
) + 1);
113 HASHMAP_FOREACH(service
, m
->dnssd_services
, i
) {
116 r
= sd_bus_path_encode("/org/freedesktop/resolve1/dnssd", service
->name
, &p
);
124 *nodes
= TAKE_PTR(l
);