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