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