Branch data Line data Source code
1 : :
2 : : #include "alloc-util.h"
3 : : #include "bus-util.h"
4 : : #include "missing_capability.h"
5 : : #include "resolved-dnssd.h"
6 : : #include "resolved-dnssd-bus.h"
7 : : #include "resolved-link.h"
8 : : #include "strv.h"
9 : : #include "user-util.h"
10 : :
11 : 0 : int bus_dnssd_method_unregister(sd_bus_message *message, void *userdata, sd_bus_error *error) {
12 : 0 : DnssdService *s = userdata;
13 : : DnssdTxtData *txt_data;
14 : : Manager *m;
15 : : Iterator i;
16 : : Link *l;
17 : : int r;
18 : :
19 [ # # ]: 0 : assert(message);
20 [ # # ]: 0 : assert(s);
21 : :
22 : 0 : m = s->manager;
23 : :
24 : 0 : 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);
28 [ # # ]: 0 : if (r < 0)
29 : 0 : return r;
30 [ # # ]: 0 : if (r == 0)
31 : 0 : return 1; /* Polkit will call us back */
32 : :
33 [ # # ]: 0 : HASHMAP_FOREACH(l, m->links, i) {
34 [ # # ]: 0 : if (l->mdns_ipv4_scope) {
35 : 0 : r = dns_scope_announce(l->mdns_ipv4_scope, true);
36 [ # # ]: 0 : if (r < 0)
37 [ # # ]: 0 : log_warning_errno(r, "Failed to send goodbye messages in IPv4 scope: %m");
38 : :
39 : 0 : dns_zone_remove_rr(&l->mdns_ipv4_scope->zone, s->ptr_rr);
40 : 0 : dns_zone_remove_rr(&l->mdns_ipv4_scope->zone, s->srv_rr);
41 [ # # ]: 0 : LIST_FOREACH(items, txt_data, s->txt_data_items)
42 : 0 : dns_zone_remove_rr(&l->mdns_ipv4_scope->zone, txt_data->rr);
43 : : }
44 : :
45 [ # # ]: 0 : if (l->mdns_ipv6_scope) {
46 : 0 : r = dns_scope_announce(l->mdns_ipv6_scope, true);
47 [ # # ]: 0 : if (r < 0)
48 [ # # ]: 0 : log_warning_errno(r, "Failed to send goodbye messages in IPv6 scope: %m");
49 : :
50 : 0 : dns_zone_remove_rr(&l->mdns_ipv6_scope->zone, s->ptr_rr);
51 : 0 : dns_zone_remove_rr(&l->mdns_ipv6_scope->zone, s->srv_rr);
52 [ # # ]: 0 : LIST_FOREACH(items, txt_data, s->txt_data_items)
53 : 0 : dns_zone_remove_rr(&l->mdns_ipv6_scope->zone, txt_data->rr);
54 : : }
55 : : }
56 : :
57 : 0 : dnssd_service_free(s);
58 : :
59 : 0 : manager_refresh_rrs(m);
60 : :
61 : 0 : return sd_bus_reply_method_return(message, NULL);
62 : : }
63 : :
64 : : const sd_bus_vtable dnssd_vtable[] = {
65 : : SD_BUS_VTABLE_START(0),
66 : :
67 : : SD_BUS_METHOD("Unregister", NULL, NULL, bus_dnssd_method_unregister, SD_BUS_VTABLE_UNPRIVILEGED),
68 : : SD_BUS_SIGNAL("Conflicted", NULL, 0),
69 : :
70 : : SD_BUS_VTABLE_END
71 : : };
72 : :
73 : 0 : int dnssd_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
74 : 0 : _cleanup_free_ char *name = NULL;
75 : 0 : Manager *m = userdata;
76 : : DnssdService *service;
77 : : int r;
78 : :
79 [ # # ]: 0 : assert(bus);
80 [ # # ]: 0 : assert(path);
81 [ # # ]: 0 : assert(interface);
82 [ # # ]: 0 : assert(found);
83 [ # # ]: 0 : assert(m);
84 : :
85 : 0 : r = sd_bus_path_decode(path, "/org/freedesktop/resolve1/dnssd", &name);
86 [ # # ]: 0 : if (r <= 0)
87 : 0 : return 0;
88 : :
89 : 0 : service = hashmap_get(m->dnssd_services, name);
90 [ # # ]: 0 : if (!service)
91 : 0 : return 0;
92 : :
93 : 0 : *found = service;
94 : 0 : return 1;
95 : : }
96 : :
97 : 0 : int dnssd_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
98 : 0 : _cleanup_strv_free_ char **l = NULL;
99 : 0 : Manager *m = userdata;
100 : : DnssdService *service;
101 : : Iterator i;
102 : 0 : unsigned c = 0;
103 : : int r;
104 : :
105 [ # # ]: 0 : assert(bus);
106 [ # # ]: 0 : assert(path);
107 [ # # ]: 0 : assert(m);
108 [ # # ]: 0 : assert(nodes);
109 : :
110 [ # # ]: 0 : l = new0(char*, hashmap_size(m->dnssd_services) + 1);
111 [ # # ]: 0 : if (!l)
112 : 0 : return -ENOMEM;
113 : :
114 [ # # ]: 0 : HASHMAP_FOREACH(service, m->dnssd_services, i) {
115 : : char *p;
116 : :
117 : 0 : r = sd_bus_path_encode("/org/freedesktop/resolve1/dnssd", service->name, &p);
118 [ # # ]: 0 : if (r < 0)
119 : 0 : return r;
120 : :
121 : 0 : l[c++] = p;
122 : : }
123 : :
124 : 0 : l[c] = NULL;
125 : 0 : *nodes = TAKE_PTR(l);
126 : :
127 : 0 : return 1;
128 : : }
|