]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-bus/sd-bus.c
Merge pull request #2790 from ronnychevalier/rc/systemctl_missing_oom_check
[thirdparty/systemd.git] / src / libsystemd / sd-bus / sd-bus.c
CommitLineData
de1c301e
LP
1/***
2 This file is part of systemd.
3
4 Copyright 2013 Lennart Poettering
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18***/
19
20#include <endian.h>
de1c301e 21#include <netdb.h>
0a6f50c0 22#include <poll.h>
45fbe937 23#include <pthread.h>
cf0fbc49
TA
24#include <stdlib.h>
25#include <sys/mman.h>
26#include <unistd.h>
de1c301e 27
de1c301e 28#include "sd-bus.h"
07630cea 29
b5efdb8a 30#include "alloc-util.h"
07630cea
LP
31#include "bus-container.h"
32#include "bus-control.h"
de1c301e 33#include "bus-internal.h"
6629161f 34#include "bus-kernel.h"
07630cea
LP
35#include "bus-label.h"
36#include "bus-message.h"
992c052c 37#include "bus-objects.h"
0461f8cd 38#include "bus-protocol.h"
19befb2d 39#include "bus-slot.h"
07630cea
LP
40#include "bus-socket.h"
41#include "bus-track.h"
42#include "bus-type.h"
43#include "bus-util.h"
44#include "cgroup-util.h"
45#include "def.h"
3ffd4af2 46#include "fd-util.h"
cf0fbc49 47#include "hexdecoct.h"
07630cea
LP
48#include "hostname-util.h"
49#include "macro.h"
50#include "missing.h"
6bedfcbb 51#include "parse-util.h"
07630cea
LP
52#include "string-util.h"
53#include "strv.h"
54#include "util.h"
de1c301e 55
b56c4604
LP
56#define log_debug_bus_message(m) \
57 do { \
58 sd_bus_message *_mm = (m); \
59 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
60 bus_message_type_to_string(_mm->header->type), \
61 strna(sd_bus_message_get_sender(_mm)), \
62 strna(sd_bus_message_get_destination(_mm)), \
63 strna(sd_bus_message_get_path(_mm)), \
64 strna(sd_bus_message_get_interface(_mm)), \
65 strna(sd_bus_message_get_member(_mm)), \
66 BUS_MESSAGE_COOKIE(_mm), \
67 _mm->reply_cookie, \
68 strna(_mm->error.message)); \
69 } while (false)
f9f97ca6 70
e3017af9 71static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
1e05d493
LP
72static int attach_io_events(sd_bus *b);
73static void detach_io_events(sd_bus *b);
e3017af9 74
fa2f8973
LP
75static thread_local sd_bus *default_system_bus = NULL;
76static thread_local sd_bus *default_user_bus = NULL;
77static thread_local sd_bus *default_starter_bus = NULL;
78
f54514f3
LP
79static void bus_close_fds(sd_bus *b) {
80 assert(b);
81
1e05d493
LP
82 detach_io_events(b);
83
0fd8d506 84 if (b->input_fd != b->output_fd)
03e334a1 85 safe_close(b->output_fd);
0fd8d506 86 b->output_fd = b->input_fd = safe_close(b->input_fd);
f54514f3
LP
87}
88
0e586eae 89static void bus_reset_queues(sd_bus *b) {
0e586eae
LP
90 assert(b);
91
f389bf15
LP
92 while (b->rqueue_size > 0)
93 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
94
253f96e5 95 b->rqueue = mfree(b->rqueue);
f389bf15 96 b->rqueue_allocated = 0;
0e586eae 97
f389bf15
LP
98 while (b->wqueue_size > 0)
99 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
0e586eae 100
253f96e5 101 b->wqueue = mfree(b->wqueue);
f389bf15 102 b->wqueue_allocated = 0;
0e586eae
LP
103}
104
de1c301e 105static void bus_free(sd_bus *b) {
19befb2d 106 sd_bus_slot *s;
de1c301e
LP
107
108 assert(b);
8f8f05a9
LP
109 assert(!b->track_queue);
110
19befb2d
LP
111 b->state = BUS_CLOSED;
112
40ca29a1
LP
113 sd_bus_detach_event(b);
114
19befb2d
LP
115 while ((s = b->slots)) {
116 /* At this point only floating slots can still be
117 * around, because the non-floating ones keep a
118 * reference to the bus, and we thus couldn't be
119 * destructing right now... We forcibly disconnect the
120 * slots here, so that they still can be referenced by
121 * apps, but are dead. */
122
123 assert(s->floating);
124 bus_slot_disconnect(s);
125 sd_bus_slot_unref(s);
126 }
127
f4d140e9
LP
128 if (b->default_bus_ptr)
129 *b->default_bus_ptr = NULL;
130
f54514f3 131 bus_close_fds(b);
de1c301e 132
63edf05e
LP
133 if (b->kdbus_buffer)
134 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
135
c4e6556c 136 free(b->label);
de1c301e 137 free(b->rbuffer);
89ffcd2a 138 free(b->unique_name);
2181a7f5 139 free(b->auth_buffer);
89ffcd2a 140 free(b->address);
e9a967f9 141 free(b->kernel);
a7893c6b 142 free(b->machine);
8a0e0ed9 143 free(b->fake_label);
751bc6ac 144 free(b->cgroup_root);
455971c1 145 free(b->description);
89ffcd2a 146
2fd9ae2e
LP
147 free(b->exec_path);
148 strv_free(b->exec_argv);
149
2c93b4ef
LP
150 close_many(b->fds, b->n_fds);
151 free(b->fds);
152
0e586eae 153 bus_reset_queues(b);
de1c301e 154
c9fe4af7 155 ordered_hashmap_free_free(b->reply_callbacks);
e3017af9 156 prioq_free(b->reply_callbacks_prioq);
de1c301e 157
75a0da95 158 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
392d5b37
LP
159 bus_match_free(&b->match_callbacks);
160
29ddb38f
LP
161 hashmap_free_free(b->vtable_methods);
162 hashmap_free_free(b->vtable_properties);
163
19befb2d 164 assert(hashmap_isempty(b->nodes));
29ddb38f
LP
165 hashmap_free(b->nodes);
166
bc7fd8cd
LP
167 bus_kernel_flush_memfd(b);
168
45fbe937
LP
169 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
170
de1c301e
LP
171 free(b);
172}
173
d9f644e2 174_public_ int sd_bus_new(sd_bus **ret) {
de1c301e
LP
175 sd_bus *r;
176
d6888822 177 assert_return(ret, -EINVAL);
021a1e78 178
de1c301e
LP
179 r = new0(sd_bus, 1);
180 if (!r)
021a1e78 181 return -ENOMEM;
de1c301e 182
e4ee6e5c 183 r->n_ref = REFCNT_INIT;
e82c9509 184 r->input_fd = r->output_fd = -1;
de1c301e 185 r->message_version = 1;
3310dfd5 186 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
c32195e0 187 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
d21a7bb1 188 r->attach_flags |= KDBUS_ATTACH_NAMES;
d5a2b9a6 189 r->original_pid = getpid();
de1c301e 190
45fbe937
LP
191 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
192
de1c301e
LP
193 /* We guarantee that wqueue always has space for at least one
194 * entry */
821e0756 195 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
de1c301e 196 free(r);
021a1e78 197 return -ENOMEM;
de1c301e
LP
198 }
199
021a1e78
LP
200 *ret = r;
201 return 0;
202}
203
d9f644e2 204_public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
021a1e78
LP
205 char *a;
206
d6888822
LP
207 assert_return(bus, -EINVAL);
208 assert_return(bus->state == BUS_UNSET, -EPERM);
209 assert_return(address, -EINVAL);
210 assert_return(!bus_pid_changed(bus), -ECHILD);
021a1e78
LP
211
212 a = strdup(address);
213 if (!a)
214 return -ENOMEM;
215
216 free(bus->address);
217 bus->address = a;
218
219 return 0;
220}
221
d9f644e2 222_public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
d6888822
LP
223 assert_return(bus, -EINVAL);
224 assert_return(bus->state == BUS_UNSET, -EPERM);
8ac43fee
LP
225 assert_return(input_fd >= 0, -EBADF);
226 assert_return(output_fd >= 0, -EBADF);
d6888822 227 assert_return(!bus_pid_changed(bus), -ECHILD);
021a1e78 228
e82c9509
LP
229 bus->input_fd = input_fd;
230 bus->output_fd = output_fd;
021a1e78
LP
231 return 0;
232}
233
d9f644e2 234_public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
2fd9ae2e
LP
235 char *p, **a;
236
d6888822
LP
237 assert_return(bus, -EINVAL);
238 assert_return(bus->state == BUS_UNSET, -EPERM);
239 assert_return(path, -EINVAL);
240 assert_return(!strv_isempty(argv), -EINVAL);
241 assert_return(!bus_pid_changed(bus), -ECHILD);
2fd9ae2e
LP
242
243 p = strdup(path);
244 if (!p)
245 return -ENOMEM;
246
247 a = strv_copy(argv);
248 if (!a) {
249 free(p);
250 return -ENOMEM;
251 }
252
253 free(bus->exec_path);
254 strv_free(bus->exec_argv);
255
256 bus->exec_path = p;
257 bus->exec_argv = a;
258
259 return 0;
260}
261
d9f644e2 262_public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
d6888822
LP
263 assert_return(bus, -EINVAL);
264 assert_return(bus->state == BUS_UNSET, -EPERM);
265 assert_return(!bus_pid_changed(bus), -ECHILD);
021a1e78 266
94bbf1ba 267 bus->bus_client = !!b;
021a1e78
LP
268 return 0;
269}
270
09365592
LP
271_public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
272 assert_return(bus, -EINVAL);
273 assert_return(bus->state == BUS_UNSET, -EPERM);
274 assert_return(!bus_pid_changed(bus), -ECHILD);
275
276 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
277 return 0;
278}
279
d9f644e2 280_public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
d6888822
LP
281 assert_return(bus, -EINVAL);
282 assert_return(bus->state == BUS_UNSET, -EPERM);
283 assert_return(!bus_pid_changed(bus), -ECHILD);
021a1e78 284
264ad849
LP
285 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
286 return 0;
287}
288
4fc31988 289_public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
b5dae4c7 290 uint64_t new_flags;
16be4368 291 assert_return(bus, -EINVAL);
b5dae4c7 292 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
16be4368
KS
293 assert_return(!bus_pid_changed(bus), -ECHILD);
294
b5dae4c7
LP
295 new_flags = bus->attach_flags;
296 SET_FLAG(new_flags, KDBUS_ATTACH_TIMESTAMP, b);
297
298 if (bus->attach_flags == new_flags)
299 return 0;
300
301 bus->attach_flags = new_flags;
302 if (bus->state != BUS_UNSET && bus->is_kernel)
303 bus_kernel_realize_attach_flags(bus);
304
16be4368
KS
305 return 0;
306}
307
b5dae4c7
LP
308_public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
309 uint64_t new_flags;
310
16be4368 311 assert_return(bus, -EINVAL);
95c4fe82 312 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
b5dae4c7 313 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
16be4368
KS
314 assert_return(!bus_pid_changed(bus), -ECHILD);
315
b5dae4c7
LP
316 if (b)
317 bus->creds_mask |= mask;
318 else
319 bus->creds_mask &= ~mask;
320
49b832c5 321 /* The well knowns we need unconditionally, so that matches can work */
b5dae4c7
LP
322 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
323
324 /* Make sure we don't lose the timestamp flag */
325 new_flags = (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) | attach_flags_to_kdbus(bus->creds_mask);
326 if (bus->attach_flags == new_flags)
327 return 0;
49b832c5 328
b5dae4c7
LP
329 bus->attach_flags = new_flags;
330 if (bus->state != BUS_UNSET && bus->is_kernel)
331 bus_kernel_realize_attach_flags(bus);
332
333 return 0;
021a1e78 334}
de1c301e 335
d9f644e2 336_public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
d6888822
LP
337 assert_return(bus, -EINVAL);
338 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
339 assert_return(bus->state == BUS_UNSET, -EPERM);
340 assert_return(!bus_pid_changed(bus), -ECHILD);
2181a7f5
LP
341
342 bus->is_server = !!b;
98178d39 343 bus->server_id = server_id;
2181a7f5
LP
344 return 0;
345}
346
d9f644e2 347_public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
d6888822
LP
348 assert_return(bus, -EINVAL);
349 assert_return(bus->state == BUS_UNSET, -EPERM);
350 assert_return(!bus_pid_changed(bus), -ECHILD);
2181a7f5
LP
351
352 bus->anonymous_auth = !!b;
353 return 0;
354}
355
adacb957
LP
356_public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
357 assert_return(bus, -EINVAL);
358 assert_return(bus->state == BUS_UNSET, -EPERM);
359 assert_return(!bus_pid_changed(bus), -ECHILD);
360
361 bus->trusted = !!b;
362 return 0;
363}
364
455971c1 365_public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
5972fe95 366 assert_return(bus, -EINVAL);
5972fe95
LP
367 assert_return(bus->state == BUS_UNSET, -EPERM);
368 assert_return(!bus_pid_changed(bus), -ECHILD);
369
d1b91c99 370 return free_and_strdup(&bus->description, description);
5972fe95
LP
371}
372
c0765ddb
LP
373_public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
374 assert_return(bus, -EINVAL);
375 assert_return(!bus_pid_changed(bus), -ECHILD);
376
377 bus->allow_interactive_authorization = !!b;
378 return 0;
379}
380
381_public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
382 assert_return(bus, -EINVAL);
383 assert_return(!bus_pid_changed(bus), -ECHILD);
384
385 return bus->allow_interactive_authorization;
386}
387
19070062 388static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
de1c301e 389 const char *s;
19070062 390 sd_bus *bus;
de1c301e
LP
391 int r;
392
19070062
LP
393 assert(reply);
394 bus = reply->bus;
de1c301e 395 assert(bus);
c99c09a2 396 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
de1c301e 397
40ca29a1 398 r = sd_bus_message_get_errno(reply);
40ca29a1
LP
399 if (r > 0)
400 return -r;
eb01ba5d 401
de1c301e
LP
402 r = sd_bus_message_read(reply, "s", &s);
403 if (r < 0)
404 return r;
405
dafb7591
LP
406 if (!service_name_is_valid(s) || s[0] != ':')
407 return -EBADMSG;
408
de1c301e
LP
409 bus->unique_name = strdup(s);
410 if (!bus->unique_name)
411 return -ENOMEM;
412
c99c09a2
LP
413 if (bus->state == BUS_HELLO)
414 bus->state = BUS_RUNNING;
dafb7591 415
de1c301e
LP
416 return 1;
417}
418
419static int bus_send_hello(sd_bus *bus) {
4afd3348 420 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
de1c301e
LP
421 int r;
422
423 assert(bus);
424
6629161f 425 if (!bus->bus_client || bus->is_kernel)
021a1e78
LP
426 return 0;
427
de1c301e
LP
428 r = sd_bus_message_new_method_call(
429 bus,
151b9b96 430 &m,
de1c301e 431 "org.freedesktop.DBus",
a7639e37 432 "/org/freedesktop/DBus",
de1c301e 433 "org.freedesktop.DBus",
151b9b96 434 "Hello");
de1c301e
LP
435 if (r < 0)
436 return r;
437
19befb2d 438 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
de1c301e
LP
439}
440
a7e3212d 441int bus_start_running(sd_bus *bus) {
de1c301e
LP
442 assert(bus);
443
f08838da 444 if (bus->bus_client && !bus->is_kernel) {
de1c301e 445 bus->state = BUS_HELLO;
e3017af9 446 return 1;
de1c301e
LP
447 }
448
449 bus->state = BUS_RUNNING;
e3017af9 450 return 1;
de1c301e
LP
451}
452
453static int parse_address_key(const char **p, const char *key, char **value) {
821e0756 454 size_t l, n = 0, allocated = 0;
de1c301e
LP
455 const char *a;
456 char *r = NULL;
457
458 assert(p);
459 assert(*p);
de1c301e
LP
460 assert(value);
461
2fd9ae2e
LP
462 if (key) {
463 l = strlen(key);
464 if (strncmp(*p, key, l) != 0)
465 return 0;
de1c301e 466
2fd9ae2e
LP
467 if ((*p)[l] != '=')
468 return 0;
de1c301e 469
2fd9ae2e
LP
470 if (*value)
471 return -EINVAL;
de1c301e 472
2fd9ae2e
LP
473 a = *p + l + 1;
474 } else
475 a = *p;
476
477 while (*a != ';' && *a != ',' && *a != 0) {
821e0756 478 char c;
de1c301e
LP
479
480 if (*a == '%') {
481 int x, y;
482
483 x = unhexchar(a[1]);
484 if (x < 0) {
485 free(r);
486 return x;
487 }
488
489 y = unhexchar(a[2]);
490 if (y < 0) {
491 free(r);
492 return y;
493 }
494
de1c301e 495 c = (char) ((x << 4) | y);
89ffcd2a
LP
496 a += 3;
497 } else {
de1c301e 498 c = *a;
89ffcd2a
LP
499 a++;
500 }
de1c301e 501
821e0756 502 if (!GREEDY_REALLOC(r, allocated, n + 2))
de1c301e 503 return -ENOMEM;
de1c301e 504
de1c301e
LP
505 r[n++] = c;
506 }
507
89ffcd2a
LP
508 if (!r) {
509 r = strdup("");
510 if (!r)
511 return -ENOMEM;
512 } else
513 r[n] = 0;
514
515 if (*a == ',')
516 a++;
517
de1c301e 518 *p = a;
2fd9ae2e
LP
519
520 free(*value);
de1c301e 521 *value = r;
2fd9ae2e 522
de1c301e
LP
523 return 1;
524}
525
526static void skip_address_key(const char **p) {
527 assert(p);
528 assert(*p);
529
89ffcd2a
LP
530 *p += strcspn(*p, ",");
531
532 if (**p == ',')
313cefa1 533 (*p)++;
de1c301e
LP
534}
535
2fd9ae2e
LP
536static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
537 _cleanup_free_ char *path = NULL, *abstract = NULL;
538 size_t l;
de1c301e
LP
539 int r;
540
541 assert(b);
2fd9ae2e
LP
542 assert(p);
543 assert(*p);
544 assert(guid);
de1c301e 545
2fd9ae2e
LP
546 while (**p != 0 && **p != ';') {
547 r = parse_address_key(p, "guid", guid);
548 if (r < 0)
549 return r;
550 else if (r > 0)
551 continue;
de1c301e 552
2fd9ae2e
LP
553 r = parse_address_key(p, "path", &path);
554 if (r < 0)
555 return r;
556 else if (r > 0)
557 continue;
de1c301e 558
2fd9ae2e
LP
559 r = parse_address_key(p, "abstract", &abstract);
560 if (r < 0)
561 return r;
562 else if (r > 0)
563 continue;
de1c301e 564
2fd9ae2e
LP
565 skip_address_key(p);
566 }
de1c301e 567
2fd9ae2e
LP
568 if (!path && !abstract)
569 return -EINVAL;
de1c301e 570
2fd9ae2e
LP
571 if (path && abstract)
572 return -EINVAL;
573
574 if (path) {
575 l = strlen(path);
576 if (l > sizeof(b->sockaddr.un.sun_path))
577 return -E2BIG;
de1c301e 578
2fd9ae2e
LP
579 b->sockaddr.un.sun_family = AF_UNIX;
580 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
581 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
582 } else if (abstract) {
583 l = strlen(abstract);
584 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
585 return -E2BIG;
586
587 b->sockaddr.un.sun_family = AF_UNIX;
588 b->sockaddr.un.sun_path[0] = 0;
589 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
590 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
591 }
592
593 return 0;
594}
595
596static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
597 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
2fd9ae2e 598 int r;
b92bea5d
ZJS
599 struct addrinfo *result, hints = {
600 .ai_socktype = SOCK_STREAM,
601 .ai_flags = AI_ADDRCONFIG,
602 };
2fd9ae2e
LP
603
604 assert(b);
605 assert(p);
606 assert(*p);
607 assert(guid);
608
609 while (**p != 0 && **p != ';') {
610 r = parse_address_key(p, "guid", guid);
611 if (r < 0)
612 return r;
613 else if (r > 0)
614 continue;
615
616 r = parse_address_key(p, "host", &host);
617 if (r < 0)
618 return r;
619 else if (r > 0)
620 continue;
621
622 r = parse_address_key(p, "port", &port);
623 if (r < 0)
624 return r;
625 else if (r > 0)
626 continue;
627
628 r = parse_address_key(p, "family", &family);
629 if (r < 0)
630 return r;
631 else if (r > 0)
632 continue;
633
634 skip_address_key(p);
635 }
636
637 if (!host || !port)
638 return -EINVAL;
639
2fd9ae2e
LP
640 if (family) {
641 if (streq(family, "ipv4"))
642 hints.ai_family = AF_INET;
643 else if (streq(family, "ipv6"))
644 hints.ai_family = AF_INET6;
645 else
646 return -EINVAL;
647 }
648
649 r = getaddrinfo(host, port, &hints, &result);
650 if (r == EAI_SYSTEM)
651 return -errno;
652 else if (r != 0)
653 return -EADDRNOTAVAIL;
654
655 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
656 b->sockaddr_size = result->ai_addrlen;
657
658 freeaddrinfo(result);
659
660 return 0;
661}
662
663static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
664 char *path = NULL;
665 unsigned n_argv = 0, j;
666 char **argv = NULL;
821e0756 667 size_t allocated = 0;
2fd9ae2e
LP
668 int r;
669
670 assert(b);
671 assert(p);
672 assert(*p);
673 assert(guid);
674
675 while (**p != 0 && **p != ';') {
676 r = parse_address_key(p, "guid", guid);
677 if (r < 0)
678 goto fail;
679 else if (r > 0)
680 continue;
681
682 r = parse_address_key(p, "path", &path);
683 if (r < 0)
684 goto fail;
685 else if (r > 0)
686 continue;
687
688 if (startswith(*p, "argv")) {
689 unsigned ul;
690
691 errno = 0;
692 ul = strtoul(*p + 4, (char**) p, 10);
8333c77e 693 if (errno > 0 || **p != '=' || ul > 256) {
2fd9ae2e
LP
694 r = -EINVAL;
695 goto fail;
696 }
697
313cefa1 698 (*p)++;
2fd9ae2e
LP
699
700 if (ul >= n_argv) {
821e0756 701 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
2fd9ae2e
LP
702 r = -ENOMEM;
703 goto fail;
704 }
705
2fd9ae2e
LP
706 n_argv = ul + 1;
707 }
708
709 r = parse_address_key(p, NULL, argv + ul);
de1c301e 710 if (r < 0)
2fd9ae2e 711 goto fail;
de1c301e 712
2fd9ae2e 713 continue;
de1c301e
LP
714 }
715
2fd9ae2e
LP
716 skip_address_key(p);
717 }
de1c301e 718
5a0f6033
LP
719 if (!path) {
720 r = -EINVAL;
2fd9ae2e 721 goto fail;
5a0f6033 722 }
de1c301e 723
2fd9ae2e
LP
724 /* Make sure there are no holes in the array, with the
725 * exception of argv[0] */
726 for (j = 1; j < n_argv; j++)
727 if (!argv[j]) {
728 r = -EINVAL;
729 goto fail;
730 }
731
732 if (argv && argv[0] == NULL) {
733 argv[0] = strdup(path);
734 if (!argv[0]) {
735 r = -ENOMEM;
736 goto fail;
737 }
738 }
de1c301e 739
2fd9ae2e
LP
740 b->exec_path = path;
741 b->exec_argv = argv;
742 return 0;
de1c301e 743
2fd9ae2e
LP
744fail:
745 for (j = 0; j < n_argv; j++)
746 free(argv[j]);
747
748 free(argv);
749 free(path);
750 return r;
751}
752
6629161f
LP
753static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
754 _cleanup_free_ char *path = NULL;
755 int r;
756
757 assert(b);
758 assert(p);
759 assert(*p);
760 assert(guid);
761
762 while (**p != 0 && **p != ';') {
763 r = parse_address_key(p, "guid", guid);
764 if (r < 0)
765 return r;
766 else if (r > 0)
767 continue;
768
769 r = parse_address_key(p, "path", &path);
770 if (r < 0)
771 return r;
772 else if (r > 0)
773 continue;
774
775 skip_address_key(p);
776 }
777
778 if (!path)
779 return -EINVAL;
780
781 free(b->kernel);
782 b->kernel = path;
783 path = NULL;
784
785 return 0;
786}
787
bc9fd78c 788static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
ee502e0c 789 _cleanup_free_ char *machine = NULL, *pid = NULL;
a7893c6b
LP
790 int r;
791
792 assert(b);
793 assert(p);
794 assert(*p);
795 assert(guid);
796
797 while (**p != 0 && **p != ';') {
798 r = parse_address_key(p, "guid", guid);
799 if (r < 0)
800 return r;
801 else if (r > 0)
802 continue;
803
804 r = parse_address_key(p, "machine", &machine);
805 if (r < 0)
806 return r;
807 else if (r > 0)
808 continue;
809
ee502e0c
LP
810 r = parse_address_key(p, "pid", &pid);
811 if (r < 0)
812 return r;
813 else if (r > 0)
814 continue;
815
a7893c6b
LP
816 skip_address_key(p);
817 }
818
ee502e0c 819 if (!machine == !pid)
a7893c6b
LP
820 return -EINVAL;
821
ee502e0c
LP
822 if (machine) {
823 if (!machine_name_is_valid(machine))
824 return -EINVAL;
b6741478 825
ee502e0c
LP
826 free(b->machine);
827 b->machine = machine;
828 machine = NULL;
829 } else {
a1e58e8e 830 b->machine = mfree(b->machine);
ee502e0c
LP
831 }
832
833 if (pid) {
834 r = parse_pid(pid, &b->nspid);
835 if (r < 0)
836 return r;
837 } else
838 b->nspid = 0;
a7893c6b
LP
839
840 b->sockaddr.un.sun_family = AF_UNIX;
df1e0204
LP
841 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
842 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
a7893c6b
LP
843
844 return 0;
845}
846
bc9fd78c 847static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
ee502e0c 848 _cleanup_free_ char *machine = NULL, *pid = NULL;
bc9fd78c
LP
849 int r;
850
851 assert(b);
852 assert(p);
853 assert(*p);
854 assert(guid);
855
856 while (**p != 0 && **p != ';') {
857 r = parse_address_key(p, "guid", guid);
858 if (r < 0)
859 return r;
860 else if (r > 0)
861 continue;
862
863 r = parse_address_key(p, "machine", &machine);
864 if (r < 0)
865 return r;
866 else if (r > 0)
867 continue;
868
ee502e0c
LP
869 r = parse_address_key(p, "pid", &pid);
870 if (r < 0)
871 return r;
872 else if (r > 0)
873 continue;
874
bc9fd78c
LP
875 skip_address_key(p);
876 }
877
ee502e0c 878 if (!machine == !pid)
bc9fd78c
LP
879 return -EINVAL;
880
ee502e0c
LP
881 if (machine) {
882 if (!machine_name_is_valid(machine))
883 return -EINVAL;
bc9fd78c 884
ee502e0c
LP
885 free(b->machine);
886 b->machine = machine;
887 machine = NULL;
888 } else {
a1e58e8e 889 b->machine = mfree(b->machine);
ee502e0c
LP
890 }
891
892 if (pid) {
893 r = parse_pid(pid, &b->nspid);
894 if (r < 0)
895 return r;
896 } else
897 b->nspid = 0;
bc9fd78c 898
2fc09a9c
DM
899 r = free_and_strdup(&b->kernel, "/sys/fs/kdbus/0-system/bus");
900 if (r < 0)
901 return r;
bc9fd78c
LP
902
903 return 0;
904}
905
2fd9ae2e
LP
906static void bus_reset_parsed_address(sd_bus *b) {
907 assert(b);
908
909 zero(b->sockaddr);
910 b->sockaddr_size = 0;
ba243e51
NK
911 b->exec_argv = strv_free(b->exec_argv);
912 b->exec_path = mfree(b->exec_path);
98178d39 913 b->server_id = SD_ID128_NULL;
ba243e51
NK
914 b->kernel = mfree(b->kernel);
915 b->machine = mfree(b->machine);
ee502e0c 916 b->nspid = 0;
2fd9ae2e
LP
917}
918
919static int bus_parse_next_address(sd_bus *b) {
920 _cleanup_free_ char *guid = NULL;
921 const char *a;
922 int r;
923
924 assert(b);
925
926 if (!b->address)
927 return 0;
928 if (b->address[b->address_index] == 0)
929 return 0;
930
931 bus_reset_parsed_address(b);
932
933 a = b->address + b->address_index;
de1c301e 934
2fd9ae2e 935 while (*a != 0) {
de1c301e 936
2fd9ae2e
LP
937 if (*a == ';') {
938 a++;
939 continue;
de1c301e
LP
940 }
941
2fd9ae2e
LP
942 if (startswith(a, "unix:")) {
943 a += 5;
de1c301e 944
2fd9ae2e 945 r = parse_unix_address(b, &a, &guid);
de1c301e
LP
946 if (r < 0)
947 return r;
2fd9ae2e 948 break;
de1c301e 949
2fd9ae2e 950 } else if (startswith(a, "tcp:")) {
de1c301e 951
2fd9ae2e
LP
952 a += 4;
953 r = parse_tcp_address(b, &a, &guid);
de1c301e
LP
954 if (r < 0)
955 return r;
de1c301e 956
2fd9ae2e
LP
957 break;
958
959 } else if (startswith(a, "unixexec:")) {
960
961 a += 9;
962 r = parse_exec_address(b, &a, &guid);
de1c301e
LP
963 if (r < 0)
964 return r;
de1c301e 965
2fd9ae2e 966 break;
de1c301e 967
6629161f
LP
968 } else if (startswith(a, "kernel:")) {
969
970 a += 7;
971 r = parse_kernel_address(b, &a, &guid);
972 if (r < 0)
973 return r;
974
a7893c6b 975 break;
de33fc62 976 } else if (startswith(a, "x-machine-unix:")) {
bc9fd78c 977
146d4773 978 a += 15;
bc9fd78c
LP
979 r = parse_container_unix_address(b, &a, &guid);
980 if (r < 0)
981 return r;
982
983 break;
de33fc62 984 } else if (startswith(a, "x-machine-kernel:")) {
a7893c6b 985
146d4773 986 a += 17;
bc9fd78c 987 r = parse_container_kernel_address(b, &a, &guid);
a7893c6b
LP
988 if (r < 0)
989 return r;
990
6629161f 991 break;
de1c301e
LP
992 }
993
2fd9ae2e
LP
994 a = strchr(a, ';');
995 if (!a)
996 return 0;
de1c301e
LP
997 }
998
999 if (guid) {
98178d39 1000 r = sd_id128_from_string(guid, &b->server_id);
de1c301e
LP
1001 if (r < 0)
1002 return r;
1003 }
1004
2fd9ae2e 1005 b->address_index = a - b->address;
de1c301e
LP
1006 return 1;
1007}
1008
a7e3212d 1009static int bus_start_address(sd_bus *b) {
15442912
DH
1010 bool container_kdbus_available = false;
1011 bool kdbus_available = false;
2fd9ae2e
LP
1012 int r;
1013
1014 assert(b);
1015
1016 for (;;) {
1e05d493 1017 bool skipped = false;
2fd9ae2e 1018
1e05d493 1019 bus_close_fds(b);
a7e3212d 1020
15442912
DH
1021 /*
1022 * Usually, if you provide multiple different bus-addresses, we
1023 * try all of them in order. We use the first one that
1024 * succeeds. However, if you mix kernel and unix addresses, we
1025 * never try unix-addresses if a previous kernel address was
1026 * tried and kdbus was available. This is required to prevent
1027 * clients to fallback to the bus-proxy if kdbus is available
1028 * but failed (eg., too many connections).
1029 */
1030
1e05d493 1031 if (b->exec_path)
a7893c6b 1032 r = bus_socket_exec(b);
15442912 1033 else if ((b->nspid > 0 || b->machine) && b->kernel) {
bc9fd78c 1034 r = bus_container_connect_kernel(b);
15442912
DH
1035 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1036 container_kdbus_available = true;
751090cc
LP
1037
1038 } else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC) {
1039 if (!container_kdbus_available)
1040 r = bus_container_connect_socket(b);
1041 else
1042 skipped = true;
1043
1044 } else if (b->kernel) {
a7893c6b 1045 r = bus_kernel_connect(b);
15442912
DH
1046 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1047 kdbus_available = true;
751090cc
LP
1048
1049 } else if (b->sockaddr.sa.sa_family != AF_UNSPEC) {
1050 if (!kdbus_available)
1051 r = bus_socket_connect(b);
1052 else
1053 skipped = true;
751090cc 1054 } else
1e05d493
LP
1055 skipped = true;
1056
1057 if (!skipped) {
1058 if (r >= 0) {
1059 r = attach_io_events(b);
1060 if (r >= 0)
1061 return r;
1062 }
6629161f 1063
2fd9ae2e
LP
1064 b->last_connect_error = -r;
1065 }
1066
1067 r = bus_parse_next_address(b);
1068 if (r < 0)
1069 return r;
1070 if (r == 0)
1071 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
de1c301e
LP
1072 }
1073}
1074
a7e3212d
LP
1075int bus_next_address(sd_bus *b) {
1076 assert(b);
1077
1078 bus_reset_parsed_address(b);
1079 return bus_start_address(b);
1080}
1081
021a1e78 1082static int bus_start_fd(sd_bus *b) {
6629161f 1083 struct stat st;
021a1e78
LP
1084 int r;
1085
1086 assert(b);
e82c9509
LP
1087 assert(b->input_fd >= 0);
1088 assert(b->output_fd >= 0);
021a1e78 1089
e82c9509 1090 r = fd_nonblock(b->input_fd, true);
021a1e78
LP
1091 if (r < 0)
1092 return r;
1093
e82c9509 1094 r = fd_cloexec(b->input_fd, true);
021a1e78
LP
1095 if (r < 0)
1096 return r;
1097
e82c9509
LP
1098 if (b->input_fd != b->output_fd) {
1099 r = fd_nonblock(b->output_fd, true);
1100 if (r < 0)
1101 return r;
1102
1103 r = fd_cloexec(b->output_fd, true);
1104 if (r < 0)
1105 return r;
1106 }
1107
6629161f
LP
1108 if (fstat(b->input_fd, &st) < 0)
1109 return -errno;
1110
1111 if (S_ISCHR(b->input_fd))
1112 return bus_kernel_take_fd(b);
1113 else
1114 return bus_socket_take_fd(b);
021a1e78
LP
1115}
1116
d9f644e2 1117_public_ int sd_bus_start(sd_bus *bus) {
021a1e78
LP
1118 int r;
1119
d6888822
LP
1120 assert_return(bus, -EINVAL);
1121 assert_return(bus->state == BUS_UNSET, -EPERM);
1122 assert_return(!bus_pid_changed(bus), -ECHILD);
021a1e78
LP
1123
1124 bus->state = BUS_OPENING;
1125
2181a7f5
LP
1126 if (bus->is_server && bus->bus_client)
1127 return -EINVAL;
1128
e82c9509 1129 if (bus->input_fd >= 0)
021a1e78 1130 r = bus_start_fd(bus);
a7893c6b 1131 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
a7e3212d 1132 r = bus_start_address(bus);
021a1e78
LP
1133 else
1134 return -EINVAL;
1135
db9bb83f
LP
1136 if (r < 0) {
1137 sd_bus_close(bus);
021a1e78 1138 return r;
db9bb83f 1139 }
021a1e78
LP
1140
1141 return bus_send_hello(bus);
1142}
1143
af08d2f9
LP
1144_public_ int sd_bus_open(sd_bus **ret) {
1145 const char *e;
1146 sd_bus *b;
1147 int r;
1148
1149 assert_return(ret, -EINVAL);
1150
1151 /* Let's connect to the starter bus if it is set, and
1152 * otherwise to the bus that is appropropriate for the scope
1153 * we are running in */
1154
1155 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1156 if (e) {
1157 if (streq(e, "system"))
1158 return sd_bus_open_system(ret);
09365592 1159 else if (STR_IN_SET(e, "session", "user"))
af08d2f9
LP
1160 return sd_bus_open_user(ret);
1161 }
1162
1163 e = secure_getenv("DBUS_STARTER_ADDRESS");
1164 if (!e) {
1165 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1166 return sd_bus_open_user(ret);
1167 else
1168 return sd_bus_open_system(ret);
1169 }
1170
1171 r = sd_bus_new(&b);
1172 if (r < 0)
1173 return r;
1174
1175 r = sd_bus_set_address(b, e);
1176 if (r < 0)
1177 goto fail;
1178
1179 b->bus_client = true;
1180
1181 /* We don't know whether the bus is trusted or not, so better
1182 * be safe, and authenticate everything */
1183 b->trusted = false;
cf226cfc
LP
1184 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1185 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
af08d2f9
LP
1186
1187 r = sd_bus_start(b);
1188 if (r < 0)
1189 goto fail;
1190
1191 *ret = b;
1192 return 0;
1193
1194fail:
1195 bus_free(b);
1196 return r;
1197}
1198
09365592 1199int bus_set_address_system(sd_bus *b) {
de1c301e 1200 const char *e;
09365592
LP
1201 assert(b);
1202
1203 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1204 if (e)
1205 return sd_bus_set_address(b, e);
1206
057171ef 1207 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
09365592
LP
1208}
1209
1210_public_ int sd_bus_open_system(sd_bus **ret) {
de1c301e
LP
1211 sd_bus *b;
1212 int r;
1213
d6888822 1214 assert_return(ret, -EINVAL);
de1c301e 1215
021a1e78
LP
1216 r = sd_bus_new(&b);
1217 if (r < 0)
1218 return r;
1219
09365592 1220 r = bus_set_address_system(b);
e3dd987c
LP
1221 if (r < 0)
1222 goto fail;
de1c301e 1223
94bbf1ba 1224 b->bus_client = true;
5972fe95 1225 b->is_system = true;
021a1e78 1226
adacb957
LP
1227 /* Let's do per-method access control on the system bus. We
1228 * need the caller's UID and capability set for that. */
1229 b->trusted = false;
1230 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
cf226cfc 1231 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
adacb957 1232
021a1e78
LP
1233 r = sd_bus_start(b);
1234 if (r < 0)
1235 goto fail;
de1c301e
LP
1236
1237 *ret = b;
1238 return 0;
021a1e78
LP
1239
1240fail:
1241 bus_free(b);
1242 return r;
de1c301e
LP
1243}
1244
09365592 1245int bus_set_address_user(sd_bus *b) {
de1c301e 1246 const char *e;
64ce4ad7
DH
1247 uid_t uid;
1248 int r;
de1c301e 1249
09365592 1250 assert(b);
021a1e78 1251
6c03089c 1252 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
09365592
LP
1253 if (e)
1254 return sd_bus_set_address(b, e);
1255
64ce4ad7
DH
1256 r = cg_pid_get_owner_uid(0, &uid);
1257 if (r < 0)
1258 uid = getuid();
1259
09365592 1260 e = secure_getenv("XDG_RUNTIME_DIR");
057171ef 1261 if (e) {
09365592 1262 _cleanup_free_ char *ee = NULL;
e3dd987c 1263
09365592
LP
1264 ee = bus_address_escape(e);
1265 if (!ee)
1266 return -ENOMEM;
e3dd987c 1267
64ce4ad7 1268 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, uid, ee);
057171ef 1269 } else
64ce4ad7 1270 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, uid);
de1c301e 1271
09365592
LP
1272 if (!b->address)
1273 return -ENOMEM;
1274
1275 return 0;
1276}
1277
1278_public_ int sd_bus_open_user(sd_bus **ret) {
1279 sd_bus *b;
1280 int r;
1281
1282 assert_return(ret, -EINVAL);
1283
1284 r = sd_bus_new(&b);
1285 if (r < 0)
1286 return r;
1287
1288 r = bus_set_address_user(b);
1289 if (r < 0)
1290 return r;
1291
94bbf1ba 1292 b->bus_client = true;
5972fe95 1293 b->is_user = true;
de1c301e 1294
adacb957
LP
1295 /* We don't do any per-method access control on the user
1296 * bus. */
1297 b->trusted = true;
1298
021a1e78 1299 r = sd_bus_start(b);
2571ead1
LP
1300 if (r < 0)
1301 goto fail;
de1c301e
LP
1302
1303 *ret = b;
1304 return 0;
2571ead1
LP
1305
1306fail:
021a1e78 1307 bus_free(b);
2571ead1 1308 return r;
de1c301e
LP
1309}
1310
09365592 1311int bus_set_address_system_remote(sd_bus *b, const char *host) {
0f8bd8de 1312 _cleanup_free_ char *e = NULL;
7f0d207d 1313 char *m = NULL, *c = NULL;
0f8bd8de 1314
09365592
LP
1315 assert(b);
1316 assert(host);
0f8bd8de 1317
7f0d207d
LP
1318 /* Let's see if we shall enter some container */
1319 m = strchr(host, ':');
1320 if (m) {
1321 m++;
1322
1323 /* Let's make sure this is not a port of some kind,
1324 * and is a valid machine name. */
1325 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1326 char *t;
1327
1328 /* Cut out the host part */
1329 t = strndupa(host, m - host - 1);
1330 e = bus_address_escape(t);
1331 if (!e)
1332 return -ENOMEM;
1333
63c372cb 1334 c = strjoina(",argv4=--machine=", m);
7f0d207d
LP
1335 }
1336 }
1337
1338 if (!e) {
1339 e = bus_address_escape(host);
1340 if (!e)
1341 return -ENOMEM;
1342 }
0f8bd8de 1343
7f0d207d 1344 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
09365592 1345 if (!b->address)
0f8bd8de 1346 return -ENOMEM;
a7893c6b 1347
09365592
LP
1348 return 0;
1349 }
1350
1351_public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1352 sd_bus *bus;
1353 int r;
1354
1355 assert_return(host, -EINVAL);
1356 assert_return(ret, -EINVAL);
1357
a7893c6b 1358 r = sd_bus_new(&bus);
09365592 1359 if (r < 0)
a7893c6b 1360 return r;
a7893c6b 1361
09365592
LP
1362 r = bus_set_address_system_remote(bus, host);
1363 if (r < 0)
1364 goto fail;
1365
a7893c6b 1366 bus->bus_client = true;
09365592 1367 bus->trusted = false;
3acc1daf 1368 bus->is_system = true;
a7893c6b
LP
1369
1370 r = sd_bus_start(bus);
09365592
LP
1371 if (r < 0)
1372 goto fail;
a7893c6b
LP
1373
1374 *ret = bus;
1375 return 0;
09365592
LP
1376
1377fail:
1378 bus_free(bus);
1379 return r;
a7893c6b
LP
1380}
1381
de33fc62 1382int bus_set_address_system_machine(sd_bus *b, const char *machine) {
a7893c6b 1383 _cleanup_free_ char *e = NULL;
a7893c6b 1384
09365592
LP
1385 assert(b);
1386 assert(machine);
a7893c6b
LP
1387
1388 e = bus_address_escape(machine);
1389 if (!e)
1390 return -ENOMEM;
1391
de33fc62 1392 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
09365592 1393 if (!b->address)
a7893c6b 1394 return -ENOMEM;
0f8bd8de 1395
09365592
LP
1396 return 0;
1397}
1398
de33fc62 1399_public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
09365592
LP
1400 sd_bus *bus;
1401 int r;
1402
1403 assert_return(machine, -EINVAL);
1404 assert_return(ret, -EINVAL);
affcf189 1405 assert_return(machine_name_is_valid(machine), -EINVAL);
09365592 1406
0f8bd8de 1407 r = sd_bus_new(&bus);
09365592 1408 if (r < 0)
0f8bd8de 1409 return r;
0f8bd8de 1410
de33fc62 1411 r = bus_set_address_system_machine(bus, machine);
09365592
LP
1412 if (r < 0)
1413 goto fail;
1414
0f8bd8de 1415 bus->bus_client = true;
09365592 1416 bus->trusted = false;
3acc1daf 1417 bus->is_system = true;
0f8bd8de
LP
1418
1419 r = sd_bus_start(bus);
09365592
LP
1420 if (r < 0)
1421 goto fail;
0f8bd8de
LP
1422
1423 *ret = bus;
1424 return 0;
09365592
LP
1425
1426fail:
1427 bus_free(bus);
1428 return r;
0f8bd8de
LP
1429}
1430
d9f644e2 1431_public_ void sd_bus_close(sd_bus *bus) {
0e586eae 1432
de1c301e
LP
1433 if (!bus)
1434 return;
d5a2b9a6
LP
1435 if (bus->state == BUS_CLOSED)
1436 return;
1437 if (bus_pid_changed(bus))
f54514f3
LP
1438 return;
1439
1440 bus->state = BUS_CLOSED;
e82c9509 1441
40ca29a1
LP
1442 sd_bus_detach_event(bus);
1443
0e586eae
LP
1444 /* Drop all queued messages so that they drop references to
1445 * the bus object and the bus may be freed */
1446 bus_reset_queues(bus);
1447
f54514f3
LP
1448 if (!bus->is_kernel)
1449 bus_close_fds(bus);
1450
1451 /* We'll leave the fd open in case this is a kernel bus, since
1452 * there might still be memblocks around that reference this
cd6d5e1c 1453 * bus, and they might need to invoke the KDBUS_CMD_FREE
1d0e3c98 1454 * ioctl on the fd when they are freed. */
de1c301e
LP
1455}
1456
03976f7b
LP
1457_public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1458
1459 if (!bus)
1460 return NULL;
1461
1462 sd_bus_flush(bus);
1463 sd_bus_close(bus);
1464
1465 return sd_bus_unref(bus);
1466}
1467
718db961
LP
1468static void bus_enter_closing(sd_bus *bus) {
1469 assert(bus);
1470
1471 if (bus->state != BUS_OPENING &&
1472 bus->state != BUS_AUTHENTICATING &&
1473 bus->state != BUS_HELLO &&
1474 bus->state != BUS_RUNNING)
1475 return;
1476
1477 bus->state = BUS_CLOSING;
1478}
1479
d9f644e2 1480_public_ sd_bus *sd_bus_ref(sd_bus *bus) {
4afd3348
LP
1481
1482 if (!bus)
1483 return NULL;
de1c301e 1484
e4ee6e5c 1485 assert_se(REFCNT_INC(bus->n_ref) >= 2);
de1c301e 1486
de1c301e
LP
1487 return bus;
1488}
1489
d9f644e2 1490_public_ sd_bus *sd_bus_unref(sd_bus *bus) {
b7fc42e0 1491 unsigned i;
5b1bc83f
LP
1492
1493 if (!bus)
1494 return NULL;
de1c301e 1495
f389bf15
LP
1496 i = REFCNT_DEC(bus->n_ref);
1497 if (i > 0)
1498 return NULL;
1499
1500 bus_free(bus);
de1c301e
LP
1501 return NULL;
1502}
1503
d9f644e2 1504_public_ int sd_bus_is_open(sd_bus *bus) {
d6888822
LP
1505
1506 assert_return(bus, -EINVAL);
1507 assert_return(!bus_pid_changed(bus), -ECHILD);
e3017af9 1508
f54514f3 1509 return BUS_IS_OPEN(bus->state);
e3017af9
LP
1510}
1511
d9f644e2 1512_public_ int sd_bus_can_send(sd_bus *bus, char type) {
d728d708
LP
1513 int r;
1514
d6888822
LP
1515 assert_return(bus, -EINVAL);
1516 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1517 assert_return(!bus_pid_changed(bus), -ECHILD);
de1c301e 1518
09365592
LP
1519 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1520 return 0;
1521
d728d708 1522 if (type == SD_BUS_TYPE_UNIX_FD) {
264ad849 1523 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
021a1e78
LP
1524 return 0;
1525
20902f3e 1526 r = bus_ensure_running(bus);
d728d708
LP
1527 if (r < 0)
1528 return r;
de1c301e 1529
d728d708
LP
1530 return bus->can_fds;
1531 }
1532
1533 return bus_type_is_valid(type);
de1c301e
LP
1534}
1535
5c302692 1536_public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
d728d708 1537 int r;
de1c301e 1538
d6888822 1539 assert_return(bus, -EINVAL);
f7fce345 1540 assert_return(id, -EINVAL);
d6888822 1541 assert_return(!bus_pid_changed(bus), -ECHILD);
de1c301e 1542
20902f3e 1543 r = bus_ensure_running(bus);
d728d708
LP
1544 if (r < 0)
1545 return r;
de1c301e 1546
f7fce345 1547 *id = bus->server_id;
d728d708 1548 return 0;
de1c301e
LP
1549}
1550
3df7a7e6 1551static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
7adc46fc 1552 assert(b);
de1c301e
LP
1553 assert(m);
1554
aea93deb
LP
1555 if (m->sealed) {
1556 /* If we copy the same message to multiple
693eb9a2 1557 * destinations, avoid using the same cookie
aea93deb 1558 * numbers. */
693eb9a2 1559 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
de1c301e 1560 return 0;
aea93deb 1561 }
de1c301e 1562
3df7a7e6
LP
1563 if (timeout == 0)
1564 timeout = BUS_DEFAULT_TIMEOUT;
1565
693eb9a2 1566 return bus_message_seal(m, ++b->cookie, timeout);
de1c301e
LP
1567}
1568
e1c433c6 1569static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
908b8a42
DH
1570 bool remarshal = false;
1571
e1c433c6
LP
1572 assert(b);
1573
908b8a42
DH
1574 /* wrong packet version */
1575 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1576 remarshal = true;
1577
1578 /* wrong packet endianness */
1579 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1580 remarshal = true;
1581
1582 /* TODO: kdbus-messages received from the kernel contain data which is
1583 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1584 * force remarshaling of the message. Technically, we could just
1585 * recreate the kdbus message, but that is non-trivial as other parts of
1586 * the message refer to m->kdbus already. This should be fixed! */
1587 if ((*m)->kdbus && (*m)->release_kdbus)
1588 remarshal = true;
e1c433c6 1589
908b8a42 1590 return remarshal ? bus_message_remarshal(b, m) : 0;
e1c433c6
LP
1591}
1592
7adc46fc
LP
1593int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1594 assert(b);
1595 assert(m);
1596
52cd5877
LP
1597 /* Fake some timestamps, if they were requested, and not
1598 * already initialized */
1599 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1600 if (m->realtime <= 0)
1601 m->realtime = now(CLOCK_REALTIME);
1602
1603 if (m->monotonic <= 0)
1604 m->monotonic = now(CLOCK_MONOTONIC);
1605 }
1606
7adc46fc
LP
1607 /* The bus specification says the serial number cannot be 0,
1608 * hence let's fill something in for synthetic messages. Since
1609 * synthetic messages might have a fake sender and we don't
1610 * want to interfere with the real sender's serial numbers we
6f285378 1611 * pick a fixed, artificial one. We use (uint32_t) -1 rather
7adc46fc
LP
1612 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1613 * even though kdbus can do 64bit. */
3df7a7e6 1614 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
7adc46fc
LP
1615}
1616
069f5e61 1617static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
2e3db52d
LP
1618 int r;
1619
718db961 1620 assert(bus);
2e3db52d 1621 assert(m);
718db961
LP
1622
1623 if (bus->is_kernel)
069f5e61 1624 r = bus_kernel_write_message(bus, m, hint_sync_call);
718db961 1625 else
2e3db52d
LP
1626 r = bus_socket_write_message(bus, m, idx);
1627
1628 if (r <= 0)
1629 return r;
1630
90911bb6 1631 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
42c4ebcb 1632 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
2e3db52d
LP
1633 bus_message_type_to_string(m->header->type),
1634 strna(sd_bus_message_get_sender(m)),
1635 strna(sd_bus_message_get_destination(m)),
1636 strna(sd_bus_message_get_path(m)),
1637 strna(sd_bus_message_get_interface(m)),
1638 strna(sd_bus_message_get_member(m)),
42c4ebcb
LP
1639 BUS_MESSAGE_COOKIE(m),
1640 m->reply_cookie,
2e3db52d
LP
1641 strna(m->error.message));
1642
1643 return r;
718db961
LP
1644}
1645
de1c301e 1646static int dispatch_wqueue(sd_bus *bus) {
e3017af9 1647 int r, ret = 0;
de1c301e
LP
1648
1649 assert(bus);
89ffcd2a 1650 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
de1c301e 1651
de1c301e
LP
1652 while (bus->wqueue_size > 0) {
1653
069f5e61 1654 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
718db961 1655 if (r < 0)
de1c301e 1656 return r;
718db961 1657 else if (r == 0)
e3017af9
LP
1658 /* Didn't do anything this time */
1659 return ret;
6629161f 1660 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
de1c301e
LP
1661 /* Fully written. Let's drop the entry from
1662 * the queue.
1663 *
1664 * This isn't particularly optimized, but
1665 * well, this is supposed to be our worst-case
1666 * buffer only, and the socket buffer is
1667 * supposed to be our primary buffer, and if
1668 * it got full, then all bets are off
1669 * anyway. */
1670
313cefa1 1671 bus->wqueue_size--;
c4e6e242 1672 sd_bus_message_unref(bus->wqueue[0]);
de1c301e
LP
1673 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1674 bus->windex = 0;
1675
e3017af9 1676 ret = 1;
de1c301e
LP
1677 }
1678 }
1679
e3017af9 1680 return ret;
de1c301e
LP
1681}
1682
766c5809 1683static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
7d22c717
LP
1684 assert(bus);
1685
1686 if (bus->is_kernel)
766c5809 1687 return bus_kernel_read_message(bus, hint_priority, priority);
7d22c717
LP
1688 else
1689 return bus_socket_read_message(bus);
1690}
1691
7adc46fc 1692int bus_rqueue_make_room(sd_bus *bus) {
821e0756 1693 assert(bus);
7d22c717 1694
821e0756 1695 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
7d22c717
LP
1696 return -ENOBUFS;
1697
821e0756 1698 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
7d22c717
LP
1699 return -ENOMEM;
1700
7d22c717
LP
1701 return 0;
1702}
1703
766c5809 1704static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
e3017af9 1705 int r, ret = 0;
de1c301e
LP
1706
1707 assert(bus);
1708 assert(m);
89ffcd2a 1709 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
de1c301e 1710
766c5809
LP
1711 /* Note that the priority logic is only available on kdbus,
1712 * where the rqueue is unused. We check the rqueue here
1713 * anyway, because it's simple... */
1714
7d22c717
LP
1715 for (;;) {
1716 if (bus->rqueue_size > 0) {
1717 /* Dispatch a queued message */
de1c301e 1718
7d22c717 1719 *m = bus->rqueue[0];
313cefa1 1720 bus->rqueue_size--;
7d22c717
LP
1721 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1722 return 1;
1723 }
de1c301e 1724
7d22c717 1725 /* Try to read a new message */
766c5809 1726 r = bus_read_message(bus, hint_priority, priority);
718db961 1727 if (r < 0)
e3017af9 1728 return r;
e3017af9
LP
1729 if (r == 0)
1730 return ret;
de1c301e 1731
2e8d788c 1732 ret = 1;
7d22c717 1733 }
de1c301e
LP
1734}
1735
069f5e61 1736static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
4afd3348 1737 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
de1c301e
LP
1738 int r;
1739
d6888822 1740 assert_return(m, -EINVAL);
9030ca46
LP
1741
1742 if (!bus)
1743 bus = m->bus;
1744
d6888822 1745 assert_return(!bus_pid_changed(bus), -ECHILD);
09365592 1746 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
021a1e78 1747
a3d59cd1
LP
1748 if (!BUS_IS_OPEN(bus->state))
1749 return -ENOTCONN;
1750
021a1e78
LP
1751 if (m->n_fds > 0) {
1752 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1753 if (r < 0)
1754 return r;
1755 if (r == 0)
15411c0c 1756 return -EOPNOTSUPP;
021a1e78 1757 }
de1c301e 1758
693eb9a2 1759 /* If the cookie number isn't kept, then we know that no reply
29f6aadd 1760 * is expected */
693eb9a2 1761 if (!cookie && !m->sealed)
0461f8cd 1762 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
29f6aadd 1763
3df7a7e6 1764 r = bus_seal_message(bus, m, 0);
de1c301e
LP
1765 if (r < 0)
1766 return r;
1767
441d56a1 1768 /* Remarshall if we have to. This will possibly unref the
e1c433c6
LP
1769 * message and place a replacement in m */
1770 r = bus_remarshal_message(bus, &m);
1771 if (r < 0)
1772 return r;
1773
5407f2de
LP
1774 /* If this is a reply and no reply was requested, then let's
1775 * suppress this, if we can */
997eadb5
LP
1776 if (m->dont_send)
1777 goto finish;
5407f2de 1778
89ffcd2a 1779 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
de1c301e
LP
1780 size_t idx = 0;
1781
069f5e61 1782 r = bus_write_message(bus, m, hint_sync_call, &idx);
32f46480 1783 if (r < 0) {
441d56a1 1784 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
32f46480 1785 bus_enter_closing(bus);
441d56a1
LP
1786 return -ECONNRESET;
1787 }
32f46480 1788
de1c301e 1789 return r;
997eadb5
LP
1790 }
1791
1792 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
de1c301e
LP
1793 /* Wasn't fully written. So let's remember how
1794 * much was written. Note that the first entry
1795 * of the wqueue array is always allocated so
1796 * that we always can remember how much was
1797 * written. */
1798 bus->wqueue[0] = sd_bus_message_ref(m);
1799 bus->wqueue_size = 1;
1800 bus->windex = idx;
1801 }
997eadb5 1802
de1c301e 1803 } else {
de1c301e
LP
1804 /* Just append it to the queue. */
1805
25220239 1806 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
de1c301e
LP
1807 return -ENOBUFS;
1808
821e0756 1809 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
de1c301e
LP
1810 return -ENOMEM;
1811
313cefa1 1812 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
de1c301e
LP
1813 }
1814
997eadb5 1815finish:
693eb9a2
LP
1816 if (cookie)
1817 *cookie = BUS_MESSAGE_COOKIE(m);
de1c301e 1818
7a37d625 1819 return 1;
de1c301e
LP
1820}
1821
069f5e61
LP
1822_public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1823 return bus_send_internal(bus, m, cookie, false);
1824}
1825
693eb9a2 1826_public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
911121a7
LP
1827 int r;
1828
911121a7 1829 assert_return(m, -EINVAL);
9030ca46
LP
1830
1831 if (!bus)
1832 bus = m->bus;
1833
911121a7
LP
1834 assert_return(!bus_pid_changed(bus), -ECHILD);
1835
a3d59cd1
LP
1836 if (!BUS_IS_OPEN(bus->state))
1837 return -ENOTCONN;
1838
911121a7
LP
1839 if (!streq_ptr(m->destination, destination)) {
1840
1841 if (!destination)
1842 return -EEXIST;
1843
1844 r = sd_bus_message_set_destination(m, destination);
1845 if (r < 0)
1846 return r;
1847 }
1848
693eb9a2 1849 return sd_bus_send(bus, m, cookie);
911121a7
LP
1850}
1851
de1c301e
LP
1852static usec_t calc_elapse(uint64_t usec) {
1853 if (usec == (uint64_t) -1)
1854 return 0;
1855
de1c301e
LP
1856 return now(CLOCK_MONOTONIC) + usec;
1857}
1858
e3017af9
LP
1859static int timeout_compare(const void *a, const void *b) {
1860 const struct reply_callback *x = a, *y = b;
1861
1862 if (x->timeout != 0 && y->timeout == 0)
1863 return -1;
1864
1865 if (x->timeout == 0 && y->timeout != 0)
1866 return 1;
1867
1868 if (x->timeout < y->timeout)
1869 return -1;
1870
1871 if (x->timeout > y->timeout)
1872 return 1;
1873
1874 return 0;
1875}
1876
c49b30a2 1877_public_ int sd_bus_call_async(
de1c301e 1878 sd_bus *bus,
19befb2d 1879 sd_bus_slot **slot,
e1c433c6 1880 sd_bus_message *_m,
52f3ba91 1881 sd_bus_message_handler_t callback,
de1c301e 1882 void *userdata,
19befb2d 1883 uint64_t usec) {
de1c301e 1884
4afd3348
LP
1885 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1886 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
de1c301e
LP
1887 int r;
1888
d6888822 1889 assert_return(m, -EINVAL);
40ca29a1 1890 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
0461f8cd 1891 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
d6888822 1892 assert_return(callback, -EINVAL);
9030ca46
LP
1893
1894 if (!bus)
1895 bus = m->bus;
1896
d6888822 1897 assert_return(!bus_pid_changed(bus), -ECHILD);
09365592 1898 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
89ffcd2a 1899
a3d59cd1
LP
1900 if (!BUS_IS_OPEN(bus->state))
1901 return -ENOTCONN;
1902
c9fe4af7 1903 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
89ffcd2a
LP
1904 if (r < 0)
1905 return r;
de1c301e 1906
3df7a7e6
LP
1907 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1908 if (r < 0)
1909 return r;
e3017af9 1910
3df7a7e6 1911 r = bus_seal_message(bus, m, usec);
de1c301e
LP
1912 if (r < 0)
1913 return r;
1914
e1c433c6
LP
1915 r = bus_remarshal_message(bus, &m);
1916 if (r < 0)
1917 return r;
1918
19befb2d
LP
1919 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1920 if (!s)
de1c301e
LP
1921 return -ENOMEM;
1922
19befb2d 1923 s->reply_callback.callback = callback;
de1c301e 1924
19befb2d 1925 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
c9fe4af7 1926 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
de1c301e 1927 if (r < 0) {
19befb2d 1928 s->reply_callback.cookie = 0;
de1c301e
LP
1929 return r;
1930 }
1931
19befb2d
LP
1932 s->reply_callback.timeout = calc_elapse(m->timeout);
1933 if (s->reply_callback.timeout != 0) {
1934 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
e3017af9 1935 if (r < 0) {
19befb2d 1936 s->reply_callback.timeout = 0;
e3017af9
LP
1937 return r;
1938 }
1939 }
1940
19befb2d
LP
1941 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1942 if (r < 0)
de1c301e 1943 return r;
de1c301e 1944
19befb2d
LP
1945 if (slot)
1946 *slot = s;
1947 s = NULL;
e3017af9 1948
19befb2d 1949 return r;
de1c301e
LP
1950}
1951
20902f3e 1952int bus_ensure_running(sd_bus *bus) {
89ffcd2a
LP
1953 int r;
1954
1955 assert(bus);
1956
718db961 1957 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
021a1e78 1958 return -ENOTCONN;
d728d708
LP
1959 if (bus->state == BUS_RUNNING)
1960 return 1;
89ffcd2a
LP
1961
1962 for (;;) {
1963 r = sd_bus_process(bus, NULL);
1964 if (r < 0)
1965 return r;
d728d708
LP
1966 if (bus->state == BUS_RUNNING)
1967 return 1;
e3017af9
LP
1968 if (r > 0)
1969 continue;
89ffcd2a
LP
1970
1971 r = sd_bus_wait(bus, (uint64_t) -1);
1972 if (r < 0)
1973 return r;
1974 }
1975}
1976
97f82db3 1977_public_ int sd_bus_call(
de1c301e 1978 sd_bus *bus,
97f82db3 1979 sd_bus_message *_m,
de1c301e
LP
1980 uint64_t usec,
1981 sd_bus_error *error,
1982 sd_bus_message **reply) {
1983
4afd3348 1984 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
de1c301e 1985 usec_t timeout;
693eb9a2 1986 uint64_t cookie;
7d22c717
LP
1987 unsigned i;
1988 int r;
de1c301e 1989
759e02e7
LP
1990 bus_assert_return(m, -EINVAL, error);
1991 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
1992 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
1993 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
9030ca46
LP
1994
1995 if (!bus)
1996 bus = m->bus;
1997
759e02e7
LP
1998 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
1999 bus_assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS, error);
97f82db3 2000
759e02e7
LP
2001 if (!BUS_IS_OPEN(bus->state)) {
2002 r = -ENOTCONN;
2003 goto fail;
2004 }
a3d59cd1 2005
97f82db3
KS
2006 r = bus_ensure_running(bus);
2007 if (r < 0)
759e02e7 2008 goto fail;
97f82db3 2009
a43b9ca3 2010 i = bus->rqueue_size;
97f82db3
KS
2011
2012 r = bus_seal_message(bus, m, usec);
2013 if (r < 0)
759e02e7 2014 goto fail;
97f82db3
KS
2015
2016 r = bus_remarshal_message(bus, &m);
2017 if (r < 0)
759e02e7 2018 goto fail;
97f82db3 2019
069f5e61 2020 r = bus_send_internal(bus, m, &cookie, true);
de1c301e 2021 if (r < 0)
759e02e7 2022 goto fail;
de1c301e 2023
3df7a7e6 2024 timeout = calc_elapse(m->timeout);
de1c301e
LP
2025
2026 for (;;) {
2027 usec_t left;
de1c301e 2028
7d22c717
LP
2029 while (i < bus->rqueue_size) {
2030 sd_bus_message *incoming = NULL;
2031
2032 incoming = bus->rqueue[i];
89ffcd2a 2033
693eb9a2 2034 if (incoming->reply_cookie == cookie) {
de1c301e
LP
2035 /* Found a match! */
2036
7d22c717
LP
2037 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2038 bus->rqueue_size--;
f9f97ca6 2039 log_debug_bus_message(incoming);
7d22c717 2040
40ca29a1 2041 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
b7f247e0 2042
2ce97e2b
LP
2043 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2044 if (reply)
2045 *reply = incoming;
2046 else
2047 sd_bus_message_unref(incoming);
2048
2049 return 1;
2050 }
2051
2052 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
759e02e7
LP
2053 sd_bus_message_unref(incoming);
2054 return r;
b7f247e0 2055
759e02e7 2056 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
de1c301e 2057 r = sd_bus_error_copy(error, &incoming->error);
759e02e7
LP
2058 sd_bus_message_unref(incoming);
2059 return r;
2060 } else {
a43b9ca3 2061 r = -EIO;
759e02e7
LP
2062 goto fail;
2063 }
a8a07f89 2064
693eb9a2 2065 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
a8a07f89
LP
2066 bus->unique_name &&
2067 incoming->sender &&
2068 streq(bus->unique_name, incoming->sender)) {
2069
7d22c717
LP
2070 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2071 bus->rqueue_size--;
2072
a8a07f89
LP
2073 /* Our own message? Somebody is trying
2074 * to send its own client a message,
2075 * let's not dead-lock, let's fail
2076 * immediately. */
2077
2078 sd_bus_message_unref(incoming);
759e02e7
LP
2079 r = -ELOOP;
2080 goto fail;
de1c301e
LP
2081 }
2082
de1c301e 2083 /* Try to read more, right-away */
7d22c717 2084 i++;
de1c301e 2085 }
7d22c717 2086
766c5809 2087 r = bus_read_message(bus, false, 0);
32f46480 2088 if (r < 0) {
441d56a1 2089 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
32f46480 2090 bus_enter_closing(bus);
759e02e7 2091 r = -ECONNRESET;
441d56a1 2092 }
32f46480 2093
759e02e7 2094 goto fail;
32f46480 2095 }
7d22c717 2096 if (r > 0)
e3017af9 2097 continue;
de1c301e
LP
2098
2099 if (timeout > 0) {
2100 usec_t n;
2101
2102 n = now(CLOCK_MONOTONIC);
759e02e7
LP
2103 if (n >= timeout) {
2104 r = -ETIMEDOUT;
2105 goto fail;
2106 }
de1c301e
LP
2107
2108 left = timeout - n;
2109 } else
2110 left = (uint64_t) -1;
2111
e3017af9 2112 r = bus_poll(bus, true, left);
de1c301e 2113 if (r < 0)
759e02e7
LP
2114 goto fail;
2115 if (r == 0) {
2116 r = -ETIMEDOUT;
2117 goto fail;
2118 }
de1c301e
LP
2119
2120 r = dispatch_wqueue(bus);
32f46480 2121 if (r < 0) {
441d56a1 2122 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
32f46480 2123 bus_enter_closing(bus);
759e02e7 2124 r = -ECONNRESET;
441d56a1 2125 }
32f46480 2126
759e02e7 2127 goto fail;
32f46480 2128 }
de1c301e 2129 }
759e02e7
LP
2130
2131fail:
2132 return sd_bus_error_set_errno(error, r);
de1c301e
LP
2133}
2134
d9f644e2 2135_public_ int sd_bus_get_fd(sd_bus *bus) {
d6888822
LP
2136
2137 assert_return(bus, -EINVAL);
d6888822
LP
2138 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2139 assert_return(!bus_pid_changed(bus), -ECHILD);
de1c301e 2140
e82c9509 2141 return bus->input_fd;
de1c301e
LP
2142}
2143
d9f644e2 2144_public_ int sd_bus_get_events(sd_bus *bus) {
de1c301e
LP
2145 int flags = 0;
2146
d6888822 2147 assert_return(bus, -EINVAL);
d6888822 2148 assert_return(!bus_pid_changed(bus), -ECHILD);
de1c301e 2149
a3d59cd1
LP
2150 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2151 return -ENOTCONN;
2152
de1c301e
LP
2153 if (bus->state == BUS_OPENING)
2154 flags |= POLLOUT;
89ffcd2a
LP
2155 else if (bus->state == BUS_AUTHENTICATING) {
2156
2181a7f5 2157 if (bus_socket_auth_needs_write(bus))
89ffcd2a
LP
2158 flags |= POLLOUT;
2159
2160 flags |= POLLIN;
2161
2162 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
de1c301e
LP
2163 if (bus->rqueue_size <= 0)
2164 flags |= POLLIN;
2165 if (bus->wqueue_size > 0)
2166 flags |= POLLOUT;
2167 }
2168
2169 return flags;
2170}
2171
d9f644e2 2172_public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
e3017af9
LP
2173 struct reply_callback *c;
2174
d6888822
LP
2175 assert_return(bus, -EINVAL);
2176 assert_return(timeout_usec, -EINVAL);
d6888822 2177 assert_return(!bus_pid_changed(bus), -ECHILD);
e3017af9 2178
a3d59cd1
LP
2179 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2180 return -ENOTCONN;
2181
8f8f05a9
LP
2182 if (bus->track_queue) {
2183 *timeout_usec = 0;
2184 return 1;
2185 }
2186
718db961
LP
2187 if (bus->state == BUS_CLOSING) {
2188 *timeout_usec = 0;
2189 return 1;
2190 }
2191
e3017af9
LP
2192 if (bus->state == BUS_AUTHENTICATING) {
2193 *timeout_usec = bus->auth_timeout;
2194 return 1;
2195 }
2196
adee69fa
LP
2197 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2198 *timeout_usec = (uint64_t) -1;
e3017af9 2199 return 0;
adee69fa 2200 }
e3017af9 2201
8efd6381
LP
2202 if (bus->rqueue_size > 0) {
2203 *timeout_usec = 0;
2204 return 1;
2205 }
2206
e3017af9 2207 c = prioq_peek(bus->reply_callbacks_prioq);
adee69fa
LP
2208 if (!c) {
2209 *timeout_usec = (uint64_t) -1;
e3017af9 2210 return 0;
adee69fa 2211 }
e3017af9 2212
19befb2d
LP
2213 if (c->timeout == 0) {
2214 *timeout_usec = (uint64_t) -1;
2215 return 0;
2216 }
2217
e3017af9
LP
2218 *timeout_usec = c->timeout;
2219 return 1;
2220}
2221
2222static int process_timeout(sd_bus *bus) {
4afd3348
LP
2223 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2224 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
e3017af9 2225 struct reply_callback *c;
1b64f838 2226 sd_bus_slot *slot;
e3017af9
LP
2227 usec_t n;
2228 int r;
2229
2230 assert(bus);
2231
2232 c = prioq_peek(bus->reply_callbacks_prioq);
2233 if (!c)
2234 return 0;
2235
2236 n = now(CLOCK_MONOTONIC);
2237 if (c->timeout > n)
2238 return 0;
2239
eb01ba5d
LP
2240 r = bus_message_new_synthetic_error(
2241 bus,
693eb9a2 2242 c->cookie,
14c24659 2243 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
eb01ba5d
LP
2244 &m);
2245 if (r < 0)
2246 return r;
2247
7adc46fc 2248 r = bus_seal_synthetic_message(bus, m);
718db961
LP
2249 if (r < 0)
2250 return r;
2251
e3017af9 2252 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
19befb2d
LP
2253 c->timeout = 0;
2254
c9fe4af7 2255 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
19befb2d
LP
2256 c->cookie = 0;
2257
1b64f838 2258 slot = container_of(c, sd_bus_slot, reply_callback);
e3017af9 2259
313cefa1 2260 bus->iteration_counter++;
718db961 2261
1b64f838
LP
2262 bus->current_message = m;
2263 bus->current_slot = sd_bus_slot_ref(slot);
caa82984
LP
2264 bus->current_handler = c->callback;
2265 bus->current_userdata = slot->userdata;
19070062 2266 r = c->callback(m, slot->userdata, &error_buffer);
caa82984
LP
2267 bus->current_userdata = NULL;
2268 bus->current_handler = NULL;
d974ad05 2269 bus->current_slot = NULL;
19befb2d 2270 bus->current_message = NULL;
718db961 2271
1b64f838
LP
2272 if (slot->floating) {
2273 bus_slot_disconnect(slot);
2274 sd_bus_slot_unref(slot);
2275 }
2276
d974ad05
DH
2277 sd_bus_slot_unref(slot);
2278
1b64f838 2279 return bus_maybe_reply_error(m, r, &error_buffer);
e3017af9
LP
2280}
2281
9d373862
LP
2282static int process_hello(sd_bus *bus, sd_bus_message *m) {
2283 assert(bus);
2284 assert(m);
2285
2286 if (bus->state != BUS_HELLO)
2287 return 0;
2288
2289 /* Let's make sure the first message on the bus is the HELLO
2290 * reply. But note that we don't actually parse the message
2181a7f5
LP
2291 * here (we leave that to the usual handling), we just verify
2292 * we don't let any earlier msg through. */
9d373862 2293
40ca29a1
LP
2294 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2295 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
9d373862
LP
2296 return -EIO;
2297
19befb2d 2298 if (m->reply_cookie != 1)
9d373862
LP
2299 return -EIO;
2300
2301 return 0;
2302}
2303
a652755d 2304static int process_reply(sd_bus *bus, sd_bus_message *m) {
4afd3348
LP
2305 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2306 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
19befb2d 2307 struct reply_callback *c;
1b64f838 2308 sd_bus_slot *slot;
a652755d
LP
2309 int r;
2310
2311 assert(bus);
2312 assert(m);
2313
40ca29a1
LP
2314 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2315 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
a652755d
LP
2316 return 0;
2317
09365592
LP
2318 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2319 return 0;
2320
2321 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2322 return 0;
2323
c9fe4af7 2324 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
a652755d
LP
2325 if (!c)
2326 return 0;
2327
19befb2d 2328 c->cookie = 0;
19befb2d 2329
1b64f838 2330 slot = container_of(c, sd_bus_slot, reply_callback);
a652755d 2331
2ce97e2b
LP
2332 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2333
2334 /* If the reply contained a file descriptor which we
2335 * didn't want we pass an error instead. */
2336
2337 r = bus_message_new_synthetic_error(
2338 bus,
2339 m->reply_cookie,
2340 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2341 &synthetic_reply);
2342 if (r < 0)
1b64f838 2343 return r;
2ce97e2b 2344
52cd5877
LP
2345 /* Copy over original timestamp */
2346 synthetic_reply->realtime = m->realtime;
2347 synthetic_reply->monotonic = m->monotonic;
2348 synthetic_reply->seqnum = m->seqnum;
2349
2ce97e2b
LP
2350 r = bus_seal_synthetic_message(bus, synthetic_reply);
2351 if (r < 0)
1b64f838 2352 return r;
2ce97e2b
LP
2353
2354 m = synthetic_reply;
2355 } else {
2356 r = sd_bus_message_rewind(m, true);
2357 if (r < 0)
1b64f838 2358 return r;
2ce97e2b 2359 }
88fe224c 2360
1b64f838
LP
2361 if (c->timeout != 0) {
2362 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2363 c->timeout = 0;
2364 }
19befb2d 2365
1b64f838 2366 bus->current_slot = sd_bus_slot_ref(slot);
caa82984
LP
2367 bus->current_handler = c->callback;
2368 bus->current_userdata = slot->userdata;
19070062 2369 r = c->callback(m, slot->userdata, &error_buffer);
caa82984
LP
2370 bus->current_userdata = NULL;
2371 bus->current_handler = NULL;
d974ad05 2372 bus->current_slot = NULL;
a652755d 2373
19befb2d
LP
2374 if (slot->floating) {
2375 bus_slot_disconnect(slot);
2376 sd_bus_slot_unref(slot);
2377 }
2378
d974ad05
DH
2379 sd_bus_slot_unref(slot);
2380
1b64f838 2381 return bus_maybe_reply_error(m, r, &error_buffer);
a652755d
LP
2382}
2383
2384static int process_filter(sd_bus *bus, sd_bus_message *m) {
4afd3348 2385 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
a652755d
LP
2386 struct filter_callback *l;
2387 int r;
2388
392d5b37
LP
2389 assert(bus);
2390 assert(m);
2391
7286037f
LP
2392 do {
2393 bus->filter_callbacks_modified = false;
2394
2395 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
1b64f838 2396 sd_bus_slot *slot;
7286037f
LP
2397
2398 if (bus->filter_callbacks_modified)
2399 break;
2400
2401 /* Don't run this more than once per iteration */
2402 if (l->last_iteration == bus->iteration_counter)
2403 continue;
2404
2405 l->last_iteration = bus->iteration_counter;
2406
88fe224c
LP
2407 r = sd_bus_message_rewind(m, true);
2408 if (r < 0)
2409 return r;
2410
1b64f838
LP
2411 slot = container_of(l, sd_bus_slot, filter_callback);
2412
2413 bus->current_slot = sd_bus_slot_ref(slot);
caa82984
LP
2414 bus->current_handler = l->callback;
2415 bus->current_userdata = slot->userdata;
19070062 2416 r = l->callback(m, slot->userdata, &error_buffer);
caa82984
LP
2417 bus->current_userdata = NULL;
2418 bus->current_handler = NULL;
1b64f838 2419 bus->current_slot = sd_bus_slot_unref(slot);
19befb2d 2420
ebcf1f97 2421 r = bus_maybe_reply_error(m, r, &error_buffer);
7286037f
LP
2422 if (r != 0)
2423 return r;
2424
2425 }
2426
2427 } while (bus->filter_callbacks_modified);
a652755d
LP
2428
2429 return 0;
2430}
2431
392d5b37 2432static int process_match(sd_bus *bus, sd_bus_message *m) {
7286037f
LP
2433 int r;
2434
392d5b37
LP
2435 assert(bus);
2436 assert(m);
2437
7286037f
LP
2438 do {
2439 bus->match_callbacks_modified = false;
2440
eb01ba5d 2441 r = bus_match_run(bus, &bus->match_callbacks, m);
7286037f
LP
2442 if (r != 0)
2443 return r;
2444
2445 } while (bus->match_callbacks_modified);
2446
2447 return 0;
392d5b37
LP
2448}
2449
b9bf7e2b 2450static int process_builtin(sd_bus *bus, sd_bus_message *m) {
4afd3348 2451 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
b9bf7e2b
LP
2452 int r;
2453
2454 assert(bus);
2455 assert(m);
2456
09365592
LP
2457 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2458 return 0;
2459
758bf0c7
LP
2460 if (bus->manual_peer_interface)
2461 return 0;
2462
40ca29a1 2463 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
b9bf7e2b
LP
2464 return 0;
2465
2466 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2467 return 0;
2468
0461f8cd 2469 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
b9bf7e2b
LP
2470 return 1;
2471
2472 if (streq_ptr(m->member, "Ping"))
df2d202e 2473 r = sd_bus_message_new_method_return(m, &reply);
b9bf7e2b
LP
2474 else if (streq_ptr(m->member, "GetMachineId")) {
2475 sd_id128_t id;
2476 char sid[33];
2477
2478 r = sd_id128_get_machine(&id);
2479 if (r < 0)
2480 return r;
2481
df2d202e 2482 r = sd_bus_message_new_method_return(m, &reply);
b9bf7e2b
LP
2483 if (r < 0)
2484 return r;
2485
2486 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2487 } else {
29ddb38f 2488 r = sd_bus_message_new_method_errorf(
df2d202e 2489 m, &reply,
40ca29a1 2490 SD_BUS_ERROR_UNKNOWN_METHOD,
b9bf7e2b 2491 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
b9bf7e2b
LP
2492 }
2493
2494 if (r < 0)
2495 return r;
2496
2497 r = sd_bus_send(bus, reply, NULL);
2498 if (r < 0)
2499 return r;
2500
2501 return 1;
2502}
2503
2ce97e2b
LP
2504static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2505 assert(bus);
2506 assert(m);
2507
2508 /* If we got a message with a file descriptor which we didn't
2509 * want to accept, then let's drop it. How can this even
2510 * happen? For example, when the kernel queues a message into
2511 * an activatable names's queue which allows fds, and then is
2512 * delivered to us later even though we ourselves did not
2513 * negotiate it. */
2514
09365592
LP
2515 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2516 return 0;
2517
2ce97e2b
LP
2518 if (m->n_fds <= 0)
2519 return 0;
2520
2521 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2522 return 0;
2523
2524 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2525 return 1; /* just eat it up */
2526
2527 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2528}
2529
992c052c 2530static int process_message(sd_bus *bus, sd_bus_message *m) {
e3017af9
LP
2531 int r;
2532
2533 assert(bus);
992c052c 2534 assert(m);
e3017af9 2535
19befb2d 2536 bus->current_message = m;
992c052c 2537 bus->iteration_counter++;
e3017af9 2538
f9f97ca6 2539 log_debug_bus_message(m);
40ca29a1 2540
992c052c
LP
2541 r = process_hello(bus, m);
2542 if (r != 0)
affff0b6 2543 goto finish;
a652755d 2544
992c052c
LP
2545 r = process_reply(bus, m);
2546 if (r != 0)
affff0b6 2547 goto finish;
e3017af9 2548
2ce97e2b
LP
2549 r = process_fd_check(bus, m);
2550 if (r != 0)
2551 goto finish;
2552
992c052c
LP
2553 r = process_filter(bus, m);
2554 if (r != 0)
affff0b6 2555 goto finish;
a652755d 2556
992c052c
LP
2557 r = process_match(bus, m);
2558 if (r != 0)
affff0b6 2559 goto finish;
a652755d 2560
992c052c
LP
2561 r = process_builtin(bus, m);
2562 if (r != 0)
affff0b6
LP
2563 goto finish;
2564
2565 r = bus_process_object(bus, m);
a652755d 2566
affff0b6 2567finish:
19befb2d 2568 bus->current_message = NULL;
affff0b6 2569 return r;
29ddb38f 2570}
88fe224c 2571
8f8f05a9
LP
2572static int dispatch_track(sd_bus *bus) {
2573 assert(bus);
2574
2575 if (!bus->track_queue)
2576 return 0;
2577
2578 bus_track_dispatch(bus->track_queue);
2579 return 1;
2580}
2581
766c5809 2582static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
4afd3348 2583 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
29ddb38f 2584 int r;
a652755d 2585
29ddb38f 2586 assert(bus);
992c052c 2587 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
7286037f 2588
992c052c
LP
2589 r = process_timeout(bus);
2590 if (r != 0)
2591 goto null_message;
7286037f 2592
992c052c
LP
2593 r = dispatch_wqueue(bus);
2594 if (r != 0)
2595 goto null_message;
7286037f 2596
8f8f05a9
LP
2597 r = dispatch_track(bus);
2598 if (r != 0)
2599 goto null_message;
2600
766c5809 2601 r = dispatch_rqueue(bus, hint_priority, priority, &m);
992c052c
LP
2602 if (r < 0)
2603 return r;
2604 if (!m)
2605 goto null_message;
7286037f 2606
992c052c
LP
2607 r = process_message(bus, m);
2608 if (r != 0)
2609 goto null_message;
7286037f 2610
992c052c
LP
2611 if (ret) {
2612 r = sd_bus_message_rewind(m, true);
29ddb38f
LP
2613 if (r < 0)
2614 return r;
e3017af9 2615
992c052c
LP
2616 *ret = m;
2617 m = NULL;
2618 return 1;
2619 }
a652755d 2620
40ca29a1 2621 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
a652755d 2622
dc74ce9b
LP
2623 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2624 strna(sd_bus_message_get_sender(m)),
2625 strna(sd_bus_message_get_path(m)),
2626 strna(sd_bus_message_get_interface(m)),
2627 strna(sd_bus_message_get_member(m)));
2628
992c052c 2629 r = sd_bus_reply_method_errorf(
df2d202e 2630 m,
40ca29a1 2631 SD_BUS_ERROR_UNKNOWN_OBJECT,
992c052c 2632 "Unknown object '%s'.", m->path);
29ddb38f
LP
2633 if (r < 0)
2634 return r;
2635 }
e3017af9 2636
992c052c 2637 return 1;
0a72c2bd 2638
992c052c
LP
2639null_message:
2640 if (r >= 0 && ret)
2641 *ret = NULL;
0a72c2bd 2642
992c052c 2643 return r;
29ddb38f 2644}
0a72c2bd 2645
718db961 2646static int process_closing(sd_bus *bus, sd_bus_message **ret) {
4afd3348 2647 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
718db961
LP
2648 struct reply_callback *c;
2649 int r;
2650
2651 assert(bus);
2652 assert(bus->state == BUS_CLOSING);
2653
c9fe4af7 2654 c = ordered_hashmap_first(bus->reply_callbacks);
718db961 2655 if (c) {
4afd3348 2656 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
1b64f838 2657 sd_bus_slot *slot;
ebcf1f97 2658
718db961
LP
2659 /* First, fail all outstanding method calls */
2660 r = bus_message_new_synthetic_error(
2661 bus,
693eb9a2 2662 c->cookie,
14c24659 2663 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
718db961
LP
2664 &m);
2665 if (r < 0)
2666 return r;
2667
7adc46fc 2668 r = bus_seal_synthetic_message(bus, m);
718db961
LP
2669 if (r < 0)
2670 return r;
2671
19befb2d 2672 if (c->timeout != 0) {
718db961 2673 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
19befb2d
LP
2674 c->timeout = 0;
2675 }
718db961 2676
c9fe4af7 2677 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
19befb2d
LP
2678 c->cookie = 0;
2679
1b64f838 2680 slot = container_of(c, sd_bus_slot, reply_callback);
718db961 2681
718db961
LP
2682 bus->iteration_counter++;
2683
1b64f838
LP
2684 bus->current_message = m;
2685 bus->current_slot = sd_bus_slot_ref(slot);
caa82984
LP
2686 bus->current_handler = c->callback;
2687 bus->current_userdata = slot->userdata;
19070062 2688 r = c->callback(m, slot->userdata, &error_buffer);
caa82984
LP
2689 bus->current_userdata = NULL;
2690 bus->current_handler = NULL;
d974ad05 2691 bus->current_slot = NULL;
1b64f838
LP
2692 bus->current_message = NULL;
2693
2694 if (slot->floating) {
2695 bus_slot_disconnect(slot);
2696 sd_bus_slot_unref(slot);
2697 }
718db961 2698
d974ad05
DH
2699 sd_bus_slot_unref(slot);
2700
1b64f838 2701 return bus_maybe_reply_error(m, r, &error_buffer);
718db961
LP
2702 }
2703
2704 /* Then, synthesize a Disconnected message */
2705 r = sd_bus_message_new_signal(
2706 bus,
151b9b96 2707 &m,
718db961
LP
2708 "/org/freedesktop/DBus/Local",
2709 "org.freedesktop.DBus.Local",
151b9b96 2710 "Disconnected");
718db961
LP
2711 if (r < 0)
2712 return r;
2713
fb6d9b77 2714 bus_message_set_sender_local(bus, m);
34a2c9e8 2715
7adc46fc 2716 r = bus_seal_synthetic_message(bus, m);
718db961
LP
2717 if (r < 0)
2718 return r;
2719
2720 sd_bus_close(bus);
2721
19befb2d 2722 bus->current_message = m;
718db961
LP
2723 bus->iteration_counter++;
2724
2725 r = process_filter(bus, m);
2726 if (r != 0)
2727 goto finish;
2728
2729 r = process_match(bus, m);
2730 if (r != 0)
2731 goto finish;
2732
2733 if (ret) {
2734 *ret = m;
2735 m = NULL;
2736 }
2737
2738 r = 1;
2739
2740finish:
19befb2d
LP
2741 bus->current_message = NULL;
2742
718db961
LP
2743 return r;
2744}
2745
766c5809 2746static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
8ce2afd6 2747 BUS_DONT_DESTROY(bus);
29ddb38f 2748 int r;
0a72c2bd 2749
992c052c
LP
2750 /* Returns 0 when we didn't do anything. This should cause the
2751 * caller to invoke sd_bus_wait() before returning the next
2752 * time. Returns > 0 when we did something, which possibly
2753 * means *ret is filled in with an unprocessed message. */
0a72c2bd 2754
d6888822
LP
2755 assert_return(bus, -EINVAL);
2756 assert_return(!bus_pid_changed(bus), -ECHILD);
0a72c2bd 2757
992c052c 2758 /* We don't allow recursively invoking sd_bus_process(). */
19befb2d
LP
2759 assert_return(!bus->current_message, -EBUSY);
2760 assert(!bus->current_slot);
0a72c2bd 2761
992c052c 2762 switch (bus->state) {
0a72c2bd 2763
992c052c 2764 case BUS_UNSET:
992c052c 2765 return -ENOTCONN;
0a72c2bd 2766
6d6f4904
LP
2767 case BUS_CLOSED:
2768 return -ECONNRESET;
2769
992c052c
LP
2770 case BUS_OPENING:
2771 r = bus_socket_process_opening(bus);
441d56a1 2772 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
718db961
LP
2773 bus_enter_closing(bus);
2774 r = 1;
2775 } else if (r < 0)
29ddb38f 2776 return r;
992c052c
LP
2777 if (ret)
2778 *ret = NULL;
a652755d
LP
2779 return r;
2780
992c052c 2781 case BUS_AUTHENTICATING:
992c052c 2782 r = bus_socket_process_authenticating(bus);
441d56a1 2783 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
718db961
LP
2784 bus_enter_closing(bus);
2785 r = 1;
2786 } else if (r < 0)
29ddb38f 2787 return r;
718db961 2788
992c052c
LP
2789 if (ret)
2790 *ret = NULL;
718db961 2791
992c052c 2792 return r;
a652755d 2793
992c052c
LP
2794 case BUS_RUNNING:
2795 case BUS_HELLO:
766c5809 2796 r = process_running(bus, hint_priority, priority, ret);
441d56a1 2797 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
718db961
LP
2798 bus_enter_closing(bus);
2799 r = 1;
2800
2801 if (ret)
2802 *ret = NULL;
2803 }
43a43f50 2804
43a43f50 2805 return r;
718db961
LP
2806
2807 case BUS_CLOSING:
2808 return process_closing(bus, ret);
992c052c 2809 }
43a43f50 2810
992c052c 2811 assert_not_reached("Unknown state");
e3017af9
LP
2812}
2813
766c5809
LP
2814_public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2815 return bus_process_internal(bus, false, 0, ret);
2816}
2817
2818_public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2819 return bus_process_internal(bus, true, priority, ret);
2820}
2821
992c052c
LP
2822static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2823 struct pollfd p[2] = {};
2824 int r, e, n;
2825 struct timespec ts;
3a43da28 2826 usec_t m = USEC_INFINITY;
adcdb374
LP
2827
2828 assert(bus);
718db961
LP
2829
2830 if (bus->state == BUS_CLOSING)
2831 return 1;
2832
a3d59cd1
LP
2833 if (!BUS_IS_OPEN(bus->state))
2834 return -ENOTCONN;
adcdb374 2835
992c052c
LP
2836 e = sd_bus_get_events(bus);
2837 if (e < 0)
2838 return e;
adcdb374 2839
992c052c 2840 if (need_more)
8efd6381
LP
2841 /* The caller really needs some more data, he doesn't
2842 * care about what's already read, or any timeouts
ad67ef27 2843 * except its own. */
992c052c 2844 e |= POLLIN;
992c052c 2845 else {
8efd6381
LP
2846 usec_t until;
2847 /* The caller wants to process if there's something to
2848 * process, but doesn't care otherwise */
2849
2850 r = sd_bus_get_timeout(bus, &until);
2851 if (r < 0)
2852 return r;
2853 if (r > 0) {
2854 usec_t nw;
2855 nw = now(CLOCK_MONOTONIC);
2856 m = until > nw ? until - nw : 0;
2857 }
992c052c 2858 }
adcdb374 2859
992c052c
LP
2860 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2861 m = timeout_usec;
adcdb374 2862
992c052c
LP
2863 p[0].fd = bus->input_fd;
2864 if (bus->output_fd == bus->input_fd) {
2865 p[0].events = e;
2866 n = 1;
2867 } else {
2868 p[0].events = e & POLLIN;
2869 p[1].fd = bus->output_fd;
2870 p[1].events = e & POLLOUT;
2871 n = 2;
adcdb374
LP
2872 }
2873
992c052c 2874 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
adcdb374 2875 if (r < 0)
992c052c 2876 return -errno;
adcdb374 2877
992c052c 2878 return r > 0 ? 1 : 0;
adcdb374
LP
2879}
2880
d9f644e2 2881_public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
9db76355 2882
d6888822 2883 assert_return(bus, -EINVAL);
d6888822 2884 assert_return(!bus_pid_changed(bus), -ECHILD);
9db76355 2885
718db961
LP
2886 if (bus->state == BUS_CLOSING)
2887 return 0;
2888
a3d59cd1
LP
2889 if (!BUS_IS_OPEN(bus->state))
2890 return -ENOTCONN;
718db961 2891
992c052c
LP
2892 if (bus->rqueue_size > 0)
2893 return 0;
9db76355 2894
992c052c
LP
2895 return bus_poll(bus, false, timeout_usec);
2896}
9db76355 2897
d9f644e2 2898_public_ int sd_bus_flush(sd_bus *bus) {
992c052c 2899 int r;
9db76355 2900
d6888822 2901 assert_return(bus, -EINVAL);
d6888822 2902 assert_return(!bus_pid_changed(bus), -ECHILD);
9db76355 2903
718db961
LP
2904 if (bus->state == BUS_CLOSING)
2905 return 0;
2906
a3d59cd1
LP
2907 if (!BUS_IS_OPEN(bus->state))
2908 return -ENOTCONN;
718db961 2909
992c052c
LP
2910 r = bus_ensure_running(bus);
2911 if (r < 0)
2912 return r;
9db76355 2913
992c052c
LP
2914 if (bus->wqueue_size <= 0)
2915 return 0;
9db76355 2916
992c052c
LP
2917 for (;;) {
2918 r = dispatch_wqueue(bus);
32f46480 2919 if (r < 0) {
441d56a1 2920 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
32f46480 2921 bus_enter_closing(bus);
441d56a1
LP
2922 return -ECONNRESET;
2923 }
32f46480 2924
9db76355 2925 return r;
32f46480 2926 }
9db76355 2927
992c052c
LP
2928 if (bus->wqueue_size <= 0)
2929 return 0;
9db76355 2930
992c052c 2931 r = bus_poll(bus, false, (uint64_t) -1);
9db76355
LP
2932 if (r < 0)
2933 return r;
9db76355 2934 }
9db76355
LP
2935}
2936
19befb2d
LP
2937_public_ int sd_bus_add_filter(
2938 sd_bus *bus,
2939 sd_bus_slot **slot,
2940 sd_bus_message_handler_t callback,
2941 void *userdata) {
d9f644e2 2942
19befb2d 2943 sd_bus_slot *s;
de1c301e 2944
d6888822
LP
2945 assert_return(bus, -EINVAL);
2946 assert_return(callback, -EINVAL);
2947 assert_return(!bus_pid_changed(bus), -ECHILD);
de1c301e 2948
19befb2d
LP
2949 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2950 if (!s)
29ddb38f
LP
2951 return -ENOMEM;
2952
19befb2d 2953 s->filter_callback.callback = callback;
a652755d 2954
19befb2d
LP
2955 bus->filter_callbacks_modified = true;
2956 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
a652755d 2957
19befb2d
LP
2958 if (slot)
2959 *slot = s;
29ddb38f 2960
992c052c 2961 return 0;
a652755d 2962}
392d5b37 2963
19befb2d
LP
2964_public_ int sd_bus_add_match(
2965 sd_bus *bus,
2966 sd_bus_slot **slot,
2967 const char *match,
2968 sd_bus_message_handler_t callback,
2969 void *userdata) {
d9f644e2 2970
992c052c
LP
2971 struct bus_match_component *components = NULL;
2972 unsigned n_components = 0;
2915234d 2973 sd_bus_slot *s = NULL;
992c052c 2974 int r = 0;
392d5b37 2975
d6888822
LP
2976 assert_return(bus, -EINVAL);
2977 assert_return(match, -EINVAL);
2978 assert_return(!bus_pid_changed(bus), -ECHILD);
392d5b37 2979
992c052c
LP
2980 r = bus_match_parse(match, &components, &n_components);
2981 if (r < 0)
2982 goto finish;
29ddb38f 2983
19befb2d
LP
2984 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2985 if (!s) {
2986 r = -ENOMEM;
2987 goto finish;
2988 }
2989
2990 s->match_callback.callback = callback;
2991 s->match_callback.cookie = ++bus->match_cookie;
2992
992c052c 2993 if (bus->bus_client) {
cc65fe5e 2994 enum bus_match_scope scope;
29ddb38f 2995
cc65fe5e 2996 scope = bus_match_get_scope(components, n_components);
19befb2d 2997
cc65fe5e
LP
2998 /* Do not install server-side matches for matches
2999 * against the local service, interface or bus
9ee7a50c
DH
3000 * path. */
3001 if (scope != BUS_MATCH_LOCAL) {
cc65fe5e
LP
3002
3003 if (!bus->is_kernel) {
3004 /* When this is not a kernel transport, we
3005 * store the original match string, so that we
3006 * can use it to remove the match again */
3007
3008 s->match_callback.match_string = strdup(match);
3009 if (!s->match_callback.match_string) {
3010 r = -ENOMEM;
3011 goto finish;
3012 }
19befb2d 3013 }
19befb2d 3014
cc65fe5e
LP
3015 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
3016 if (r < 0)
3017 goto finish;
3018
3019 s->match_added = true;
3020 }
392d5b37
LP
3021 }
3022
992c052c 3023 bus->match_callbacks_modified = true;
19befb2d
LP
3024 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3025 if (r < 0)
3026 goto finish;
3027
3028 if (slot)
3029 *slot = s;
3030 s = NULL;
917b5dc7 3031
992c052c
LP
3032finish:
3033 bus_match_parse_free(components, n_components);
19befb2d
LP
3034 sd_bus_slot_unref(s);
3035
992c052c 3036 return r;
917b5dc7
LP
3037}
3038
19befb2d
LP
3039int bus_remove_match_by_string(
3040 sd_bus *bus,
3041 const char *match,
3042 sd_bus_message_handler_t callback,
3043 void *userdata) {
d9f644e2 3044
992c052c
LP
3045 struct bus_match_component *components = NULL;
3046 unsigned n_components = 0;
19befb2d
LP
3047 struct match_callback *c;
3048 int r = 0;
917b5dc7 3049
d6888822
LP
3050 assert_return(bus, -EINVAL);
3051 assert_return(match, -EINVAL);
3052 assert_return(!bus_pid_changed(bus), -ECHILD);
917b5dc7 3053
992c052c 3054 r = bus_match_parse(match, &components, &n_components);
29ddb38f 3055 if (r < 0)
19befb2d 3056 goto finish;
f10dda3b 3057
19befb2d
LP
3058 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3059 if (r <= 0)
3060 goto finish;
f10dda3b 3061
19befb2d 3062 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
f10dda3b 3063
19befb2d 3064finish:
992c052c 3065 bus_match_parse_free(components, n_components);
f10dda3b 3066
19befb2d 3067 return r;
f10dda3b
LP
3068}
3069
992c052c
LP
3070bool bus_pid_changed(sd_bus *bus) {
3071 assert(bus);
f10dda3b 3072
992c052c
LP
3073 /* We don't support people creating a bus connection and
3074 * keeping it around over a fork(). Let's complain. */
d5a2b9a6 3075
992c052c 3076 return bus->original_pid != getpid();
d5a2b9a6 3077}
40ca29a1
LP
3078
3079static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
0927756b 3080 sd_bus *bus = userdata;
40ca29a1
LP
3081 int r;
3082
3083 assert(bus);
3084
3085 r = sd_bus_process(bus, NULL);
3086 if (r < 0)
3087 return r;
3088
3089 return 1;
3090}
3091
3092static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
0927756b 3093 sd_bus *bus = userdata;
40ca29a1
LP
3094 int r;
3095
3096 assert(bus);
3097
3098 r = sd_bus_process(bus, NULL);
3099 if (r < 0)
3100 return r;
3101
3102 return 1;
3103}
3104
3105static int prepare_callback(sd_event_source *s, void *userdata) {
3106 sd_bus *bus = userdata;
3107 int r, e;
3108 usec_t until;
3109
3110 assert(s);
3111 assert(bus);
3112
3113 e = sd_bus_get_events(bus);
3114 if (e < 0)
3115 return e;
3116
3117 if (bus->output_fd != bus->input_fd) {
3118
3119 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3120 if (r < 0)
3121 return r;
3122
3123 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3124 if (r < 0)
3125 return r;
3126 } else {
3127 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3128 if (r < 0)
3129 return r;
3130 }
3131
3132 r = sd_bus_get_timeout(bus, &until);
3133 if (r < 0)
3134 return r;
3135 if (r > 0) {
3136 int j;
3137
3138 j = sd_event_source_set_time(bus->time_event_source, until);
3139 if (j < 0)
3140 return j;
3141 }
3142
3143 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3144 if (r < 0)
3145 return r;
3146
3147 return 1;
3148}
3149
abc5fe72
LP
3150static int quit_callback(sd_event_source *event, void *userdata) {
3151 sd_bus *bus = userdata;
3152
3153 assert(event);
3154
3155 sd_bus_flush(bus);
7bb4d371 3156 sd_bus_close(bus);
abc5fe72
LP
3157
3158 return 1;
3159}
3160
1e05d493
LP
3161static int attach_io_events(sd_bus *bus) {
3162 int r;
3163
3164 assert(bus);
3165
3166 if (bus->input_fd < 0)
3167 return 0;
3168
3169 if (!bus->event)
3170 return 0;
3171
3172 if (!bus->input_io_event_source) {
151b9b96 3173 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
1e05d493
LP
3174 if (r < 0)
3175 return r;
3176
3177 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3178 if (r < 0)
3179 return r;
3180
3181 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
9021bb9f
TG
3182 if (r < 0)
3183 return r;
3184
356779df 3185 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
1e05d493
LP
3186 } else
3187 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3188
3189 if (r < 0)
3190 return r;
3191
3192 if (bus->output_fd != bus->input_fd) {
3193 assert(bus->output_fd >= 0);
3194
3195 if (!bus->output_io_event_source) {
151b9b96 3196 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
1e05d493
LP
3197 if (r < 0)
3198 return r;
3199
3200 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
9021bb9f
TG
3201 if (r < 0)
3202 return r;
3203
356779df 3204 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
1e05d493
LP
3205 } else
3206 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3207
3208 if (r < 0)
3209 return r;
3210 }
3211
3212 return 0;
3213}
3214
3215static void detach_io_events(sd_bus *bus) {
3216 assert(bus);
3217
3218 if (bus->input_io_event_source) {
3219 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3220 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3221 }
3222
3223 if (bus->output_io_event_source) {
3224 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3225 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3226 }
3227}
3228
d9f644e2 3229_public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
40ca29a1
LP
3230 int r;
3231
3232 assert_return(bus, -EINVAL);
40ca29a1
LP
3233 assert_return(!bus->event, -EBUSY);
3234
3235 assert(!bus->input_io_event_source);
3236 assert(!bus->output_io_event_source);
3237 assert(!bus->time_event_source);
3238
76b54375
LP
3239 if (event)
3240 bus->event = sd_event_ref(event);
3241 else {
3242 r = sd_event_default(&bus->event);
3243 if (r < 0)
3244 return r;
3245 }
40ca29a1 3246
1e05d493 3247 bus->event_priority = priority;
40ca29a1 3248
6a0f1f6d 3249 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
40ca29a1
LP
3250 if (r < 0)
3251 goto fail;
3252
3253 r = sd_event_source_set_priority(bus->time_event_source, priority);
3254 if (r < 0)
3255 goto fail;
3256
356779df 3257 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
9021bb9f
TG
3258 if (r < 0)
3259 goto fail;
3260
151b9b96 3261 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
abc5fe72
LP
3262 if (r < 0)
3263 goto fail;
3264
356779df 3265 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
9021bb9f
TG
3266 if (r < 0)
3267 goto fail;
3268
1e05d493
LP
3269 r = attach_io_events(bus);
3270 if (r < 0)
3271 goto fail;
3272
40ca29a1
LP
3273 return 0;
3274
3275fail:
3276 sd_bus_detach_event(bus);
3277 return r;
3278}
3279
d9f644e2 3280_public_ int sd_bus_detach_event(sd_bus *bus) {
40ca29a1 3281 assert_return(bus, -EINVAL);
a82cafb9
LP
3282
3283 if (!bus->event)
3284 return 0;
40ca29a1 3285
1e05d493 3286 detach_io_events(bus);
40ca29a1 3287
86befb40
LP
3288 if (bus->time_event_source) {
3289 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
40ca29a1 3290 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
86befb40 3291 }
40ca29a1 3292
86befb40
LP
3293 if (bus->quit_event_source) {
3294 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
abc5fe72 3295 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
86befb40 3296 }
abc5fe72 3297
93f1bcf4 3298 bus->event = sd_event_unref(bus->event);
a82cafb9 3299 return 1;
40ca29a1 3300}
affff0b6 3301
2be44176
LP
3302_public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3303 assert_return(bus, NULL);
3304
3305 return bus->event;
3306}
3307
19befb2d
LP
3308_public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3309 assert_return(bus, NULL);
3310
3311 return bus->current_message;
3312}
3313
3314_public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
affff0b6
LP
3315 assert_return(bus, NULL);
3316
19befb2d 3317 return bus->current_slot;
affff0b6 3318}
76b54375 3319
caa82984
LP
3320_public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3321 assert_return(bus, NULL);
3322
3323 return bus->current_handler;
3324}
3325
3326_public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3327 assert_return(bus, NULL);
3328
3329 return bus->current_userdata;
3330}
3331
76b54375
LP
3332static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3333 sd_bus *b = NULL;
3334 int r;
3335
3336 assert(bus_open);
3337 assert(default_bus);
3338
3339 if (!ret)
3340 return !!*default_bus;
3341
3342 if (*default_bus) {
3343 *ret = sd_bus_ref(*default_bus);
3344 return 0;
3345 }
3346
3347 r = bus_open(&b);
3348 if (r < 0)
3349 return r;
3350
3351 b->default_bus_ptr = default_bus;
3352 b->tid = gettid();
3353 *default_bus = b;
3354
3355 *ret = b;
3356 return 1;
3357}
3358
3359_public_ int sd_bus_default_system(sd_bus **ret) {
76b54375
LP
3360 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3361}
3362
76b54375 3363
fa2f8973 3364_public_ int sd_bus_default_user(sd_bus **ret) {
76b54375
LP
3365 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3366}
3367
af08d2f9
LP
3368_public_ int sd_bus_default(sd_bus **ret) {
3369
3370 const char *e;
3371
3372 /* Let's try our best to reuse another cached connection. If
3373 * the starter bus type is set, connect via our normal
3374 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3375 * we can share the connection with the user/system default
3376 * bus. */
3377
3378 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3379 if (e) {
3380 if (streq(e, "system"))
3381 return sd_bus_default_system(ret);
09365592 3382 else if (STR_IN_SET(e, "user", "session"))
af08d2f9
LP
3383 return sd_bus_default_user(ret);
3384 }
3385
3386 /* No type is specified, so we have not other option than to
3387 * use the starter address if it is set. */
3388
3389 e = secure_getenv("DBUS_STARTER_ADDRESS");
3390 if (e) {
af08d2f9
LP
3391
3392 return bus_default(sd_bus_open, &default_starter_bus, ret);
3393 }
3394
3395 /* Finally, if nothing is set use the cached connection for
3396 * the right scope */
3397
3398 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3399 return sd_bus_default_user(ret);
3400 else
3401 return sd_bus_default_system(ret);
3402}
3403
76b54375
LP
3404_public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3405 assert_return(b, -EINVAL);
3406 assert_return(tid, -EINVAL);
3407 assert_return(!bus_pid_changed(b), -ECHILD);
3408
3409 if (b->tid != 0) {
3410 *tid = b->tid;
3411 return 0;
3412 }
3413
3414 if (b->event)
3415 return sd_event_get_tid(b->event, tid);
3416
3417 return -ENXIO;
3418}
28383ba1 3419
a6278b88
LP
3420_public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3421 _cleanup_free_ char *e = NULL;
3422 char *ret;
3423
3424 assert_return(object_path_is_valid(prefix), -EINVAL);
3425 assert_return(external_id, -EINVAL);
3426 assert_return(ret_path, -EINVAL);
3427
3428 e = bus_label_escape(external_id);
3429 if (!e)
3430 return -ENOMEM;
3431
3432 ret = strjoin(prefix, "/", e, NULL);
3433 if (!ret)
3434 return -ENOMEM;
3435
3436 *ret_path = ret;
3437 return 0;
28383ba1
LP
3438}
3439
a6278b88
LP
3440_public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3441 const char *e;
3442 char *ret;
3443
3444 assert_return(object_path_is_valid(path), -EINVAL);
3445 assert_return(object_path_is_valid(prefix), -EINVAL);
3446 assert_return(external_id, -EINVAL);
3447
3448 e = object_path_startswith(path, prefix);
3449 if (!e) {
3450 *external_id = NULL;
3451 return 0;
3452 }
3453
3454 ret = bus_label_unescape(e);
3455 if (!ret)
3456 return -ENOMEM;
3457
3458 *external_id = ret;
3459 return 1;
28383ba1 3460}
5b12334d 3461
dfb815c3
DH
3462_public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3463 _cleanup_strv_free_ char **labels = NULL;
3464 char *path, *path_pos, **label_pos;
3465 const char *sep, *template_pos;
3466 size_t path_length;
3467 va_list list;
3468 int r;
3469
3470 assert_return(out, -EINVAL);
3471 assert_return(path_template, -EINVAL);
3472
3473 path_length = strlen(path_template);
3474
19932084 3475 va_start(list, path_template);
dfb815c3
DH
3476 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3477 const char *arg;
3478 char *label;
3479
3480 arg = va_arg(list, const char *);
3481 if (!arg) {
3482 va_end(list);
3483 return -EINVAL;
3484 }
3485
3486 label = bus_label_escape(arg);
3487 if (!label) {
3488 va_end(list);
3489 return -ENOMEM;
3490 }
3491
3492 r = strv_consume(&labels, label);
3493 if (r < 0) {
3494 va_end(list);
3495 return r;
3496 }
3497
3498 /* add label length, but account for the format character */
3499 path_length += strlen(label) - 1;
3500 }
3501 va_end(list);
3502
3503 path = malloc(path_length + 1);
3504 if (!path)
3505 return -ENOMEM;
3506
3507 path_pos = path;
3508 label_pos = labels;
3509
3510 for (template_pos = path_template; *template_pos; ) {
3511 sep = strchrnul(template_pos, '%');
3512 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3513 if (!*sep)
3514 break;
3515
3516 path_pos = stpcpy(path_pos, *label_pos++);
3517 template_pos = sep + 1;
3518 }
3519
3520 *path_pos = 0;
3521 *out = path;
3522 return 0;
3523}
3524
3525_public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3526 _cleanup_strv_free_ char **labels = NULL;
3527 const char *template_pos, *path_pos;
3528 char **label_pos;
3529 va_list list;
3530 int r;
3531
3532 /*
3533 * This decodes an object-path based on a template argument. The
3534 * template consists of a verbatim path, optionally including special
3535 * directives:
3536 *
3537 * - Each occurrence of '%' in the template matches an arbitrary
3538 * substring of a label in the given path. At most one such
3539 * directive is allowed per label. For each such directive, the
3540 * caller must provide an output parameter (char **) via va_arg. If
3541 * NULL is passed, the given label is verified, but not returned.
3542 * For each matched label, the *decoded* label is stored in the
3543 * passed output argument, and the caller is responsible to free
3544 * it. Note that the output arguments are only modified if the
3545 * actualy path matched the template. Otherwise, they're left
3546 * untouched.
3547 *
3548 * This function returns <0 on error, 0 if the path does not match the
3549 * template, 1 if it matched.
3550 */
3551
3552 assert_return(path, -EINVAL);
3553 assert_return(path_template, -EINVAL);
3554
3555 path_pos = path;
3556
3557 for (template_pos = path_template; *template_pos; ) {
3558 const char *sep;
3559 size_t length;
3560 char *label;
3561
3562 /* verify everything until the next '%' matches verbatim */
3563 sep = strchrnul(template_pos, '%');
3564 length = sep - template_pos;
3565 if (strncmp(path_pos, template_pos, length))
3566 return 0;
3567
3568 path_pos += length;
3569 template_pos += length;
3570
3571 if (!*template_pos)
3572 break;
3573
3574 /* We found the next '%' character. Everything up until here
3575 * matched. We now skip ahead to the end of this label and make
3576 * sure it matches the tail of the label in the path. Then we
3577 * decode the string in-between and save it for later use. */
3578
3579 ++template_pos; /* skip over '%' */
3580
3581 sep = strchrnul(template_pos, '/');
3582 length = sep - template_pos; /* length of suffix to match verbatim */
3583
3584 /* verify the suffixes match */
3585 sep = strchrnul(path_pos, '/');
3586 if (sep - path_pos < (ssize_t)length ||
3587 strncmp(sep - length, template_pos, length))
3588 return 0;
3589
3590 template_pos += length; /* skip over matched label */
3591 length = sep - path_pos - length; /* length of sub-label to decode */
3592
3593 /* store unescaped label for later use */
3594 label = bus_label_unescape_n(path_pos, length);
3595 if (!label)
3596 return -ENOMEM;
3597
3598 r = strv_consume(&labels, label);
3599 if (r < 0)
3600 return r;
3601
3602 path_pos = sep; /* skip decoded label and suffix */
3603 }
3604
3605 /* end of template must match end of path */
3606 if (*path_pos)
3607 return 0;
3608
3609 /* copy the labels over to the caller */
19932084 3610 va_start(list, path_template);
dfb815c3
DH
3611 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3612 char **arg;
3613
3614 arg = va_arg(list, char **);
3615 if (arg)
3616 *arg = *label_pos;
3617 else
3618 free(*label_pos);
3619 }
3620 va_end(list);
3621
3622 free(labels);
3623 labels = NULL;
3624 return 1;
3625}
3626
ae095f86
LP
3627_public_ int sd_bus_try_close(sd_bus *bus) {
3628 int r;
3629
3630 assert_return(bus, -EINVAL);
ae095f86 3631 assert_return(!bus_pid_changed(bus), -ECHILD);
a3d59cd1
LP
3632
3633 if (!bus->is_kernel)
15411c0c 3634 return -EOPNOTSUPP;
a3d59cd1
LP
3635
3636 if (!BUS_IS_OPEN(bus->state))
3637 return -ENOTCONN;
ae095f86 3638
bd746b8b
LP
3639 if (bus->rqueue_size > 0)
3640 return -EBUSY;
3641
14f862a5
LP
3642 if (bus->wqueue_size > 0)
3643 return -EBUSY;
3644
ae095f86
LP
3645 r = bus_kernel_try_close(bus);
3646 if (r < 0)
3647 return r;
3648
3649 sd_bus_close(bus);
3650 return 0;
3651}
5972fe95 3652
455971c1 3653_public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
5972fe95 3654 assert_return(bus, -EINVAL);
455971c1 3655 assert_return(description, -EINVAL);
f4b2933e 3656 assert_return(bus->description, -ENXIO);
5972fe95
LP
3657 assert_return(!bus_pid_changed(bus), -ECHILD);
3658
455971c1 3659 *description = bus->description;
5972fe95
LP
3660 return 0;
3661}
fe3f22d1
DK
3662
3663int bus_get_root_path(sd_bus *bus) {
3664 int r;
3665
3666 if (bus->cgroup_root)
3667 return 0;
3668
3669 r = cg_get_root_path(&bus->cgroup_root);
3670 if (r == -ENOENT) {
3671 bus->cgroup_root = strdup("/");
3672 if (!bus->cgroup_root)
3673 return -ENOMEM;
3674
3675 r = 0;
3676 }
3677
3678 return r;
3679}
3acc1daf
LP
3680
3681_public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3682 int r;
3683
3684 assert_return(bus, -EINVAL);
3685 assert_return(scope, -EINVAL);
3686 assert_return(!bus_pid_changed(bus), -ECHILD);
3687
3688 if (bus->is_kernel) {
3689 _cleanup_free_ char *n = NULL;
3690 const char *dash;
3691
3692 r = bus_kernel_get_bus_name(bus, &n);
3693 if (r < 0)
3694 return r;
3695
3696 if (streq(n, "0-system")) {
3697 *scope = "system";
5b820358 3698 return 0;
3acc1daf
LP
3699 }
3700
3701 dash = strchr(n, '-');
d2df88ff 3702 if (streq_ptr(dash, "-user")) {
3acc1daf 3703 *scope = "user";
5b820358 3704 return 0;
3acc1daf
LP
3705 }
3706 }
3707
3708 if (bus->is_user) {
3709 *scope = "user";
5b820358 3710 return 0;
3acc1daf
LP
3711 }
3712
3713 if (bus->is_system) {
3714 *scope = "system";
5b820358
LP
3715 return 0;
3716 }
3717
3718 return -ENODATA;
3719}
3720
3721_public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3722
3723 assert_return(bus, -EINVAL);
3724 assert_return(address, -EINVAL);
3725 assert_return(!bus_pid_changed(bus), -ECHILD);
3726
3727 if (bus->address) {
3728 *address = bus->address;
3729 return 0;
3acc1daf
LP
3730 }
3731
3732 return -ENODATA;
3733}
224b3787 3734
882897af 3735_public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
224b3787
LP
3736 assert_return(bus, -EINVAL);
3737 assert_return(mask, -EINVAL);
3738 assert_return(!bus_pid_changed(bus), -ECHILD);
3739
3740 *mask = bus->creds_mask;
3741 return 0;
3742}
3743
882897af 3744_public_ int sd_bus_is_bus_client(sd_bus *bus) {
224b3787
LP
3745 assert_return(bus, -EINVAL);
3746 assert_return(!bus_pid_changed(bus), -ECHILD);
3747
3748 return bus->bus_client;
3749}
3750
882897af 3751_public_ int sd_bus_is_server(sd_bus *bus) {
224b3787
LP
3752 assert_return(bus, -EINVAL);
3753 assert_return(!bus_pid_changed(bus), -ECHILD);
3754
3755 return bus->is_server;
3756}
3757
882897af 3758_public_ int sd_bus_is_anonymous(sd_bus *bus) {
224b3787
LP
3759 assert_return(bus, -EINVAL);
3760 assert_return(!bus_pid_changed(bus), -ECHILD);
3761
3762 return bus->anonymous_auth;
3763}
3764
882897af 3765_public_ int sd_bus_is_trusted(sd_bus *bus) {
224b3787
LP
3766 assert_return(bus, -EINVAL);
3767 assert_return(!bus_pid_changed(bus), -ECHILD);
3768
3769 return bus->trusted;
3770}
3771
882897af 3772_public_ int sd_bus_is_monitor(sd_bus *bus) {
224b3787
LP
3773 assert_return(bus, -EINVAL);
3774 assert_return(!bus_pid_changed(bus), -ECHILD);
3775
3776 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);
3777}
fa2f8973
LP
3778
3779static void flush_close(sd_bus *bus) {
3780 if (!bus)
3781 return;
3782
3783 /* Flushes and closes the specified bus. We take a ref before,
3784 * to ensure the flushing does not cause the bus to be
3785 * unreferenced. */
3786
3787 sd_bus_flush_close_unref(sd_bus_ref(bus));
3788}
3789
3790_public_ void sd_bus_default_flush_close(void) {
3791 flush_close(default_starter_bus);
3792 flush_close(default_user_bus);
3793 flush_close(default_system_bus);
3794}