2 #include "alloc-util.h"
4 #include "missing_capability.h"
5 #include "resolved-dnssd.h"
6 #include "resolved-dnssd-bus.h"
7 #include "resolved-link.h"
11 int bus_dnssd_method_unregister(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
12 DnssdService
*s
= userdata
;
13 DnssdTxtData
*txt_data
;
24 r
= bus_verify_polkit_async(message
, CAP_SYS_ADMIN
,
25 "org.freedesktop.resolve1.unregister-service",
26 NULL
, false, s
->originator
,
27 &m
->polkit_registry
, error
);
31 return 1; /* Polkit will call us back */
33 HASHMAP_FOREACH(l
, m
->links
, i
) {
34 if (l
->mdns_ipv4_scope
) {
35 r
= dns_scope_announce(l
->mdns_ipv4_scope
, true);
37 log_warning_errno(r
, "Failed to send goodbye messages in IPv4 scope: %m");
39 dns_zone_remove_rr(&l
->mdns_ipv4_scope
->zone
, s
->ptr_rr
);
40 dns_zone_remove_rr(&l
->mdns_ipv4_scope
->zone
, s
->srv_rr
);
41 LIST_FOREACH(items
, txt_data
, s
->txt_data_items
)
42 dns_zone_remove_rr(&l
->mdns_ipv4_scope
->zone
, txt_data
->rr
);
45 if (l
->mdns_ipv6_scope
) {
46 r
= dns_scope_announce(l
->mdns_ipv6_scope
, true);
48 log_warning_errno(r
, "Failed to send goodbye messages in IPv6 scope: %m");
50 dns_zone_remove_rr(&l
->mdns_ipv6_scope
->zone
, s
->ptr_rr
);
51 dns_zone_remove_rr(&l
->mdns_ipv6_scope
->zone
, s
->srv_rr
);
52 LIST_FOREACH(items
, txt_data
, s
->txt_data_items
)
53 dns_zone_remove_rr(&l
->mdns_ipv6_scope
->zone
, txt_data
->rr
);
57 dnssd_service_free(s
);
59 manager_refresh_rrs(m
);
61 return sd_bus_reply_method_return(message
, NULL
);
64 const sd_bus_vtable dnssd_vtable
[] = {
65 SD_BUS_VTABLE_START(0),
67 SD_BUS_METHOD("Unregister", NULL
, NULL
, bus_dnssd_method_unregister
, SD_BUS_VTABLE_UNPRIVILEGED
),
68 SD_BUS_SIGNAL("Conflicted", NULL
, 0),
73 int dnssd_object_find(sd_bus
*bus
, const char *path
, const char *interface
, void *userdata
, void **found
, sd_bus_error
*error
) {
74 _cleanup_free_
char *name
= NULL
;
75 Manager
*m
= userdata
;
76 DnssdService
*service
;
85 r
= sd_bus_path_decode(path
, "/org/freedesktop/resolve1/dnssd", &name
);
89 service
= hashmap_get(m
->dnssd_services
, name
);
97 int dnssd_node_enumerator(sd_bus
*bus
, const char *path
, void *userdata
, char ***nodes
, sd_bus_error
*error
) {
98 _cleanup_strv_free_
char **l
= NULL
;
99 Manager
*m
= userdata
;
100 DnssdService
*service
;
110 l
= new0(char*, hashmap_size(m
->dnssd_services
) + 1);
114 HASHMAP_FOREACH(service
, m
->dnssd_services
, i
) {
117 r
= sd_bus_path_encode("/org/freedesktop/resolve1/dnssd", service
->name
, &p
);
125 *nodes
= TAKE_PTR(l
);