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