1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
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.
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.
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/>.
38 #include "cgroup-util.h"
39 #include "bus-label.h"
42 #include "bus-internal.h"
43 #include "bus-message.h"
45 #include "bus-socket.h"
46 #include "bus-kernel.h"
47 #include "bus-control.h"
48 #include "bus-introspect.h"
49 #include "bus-signature.h"
50 #include "bus-objects.h"
52 #include "bus-container.h"
53 #include "bus-protocol.h"
54 #include "bus-track.h"
56 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
57 static int attach_io_events(sd_bus *b);
58 static void detach_io_events(sd_bus *b);
60 static void bus_close_fds(sd_bus *b) {
66 safe_close(b->input_fd);
68 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
69 safe_close(b->output_fd);
71 b->input_fd = b->output_fd = -1;
74 static void bus_node_destroy(sd_bus *b, struct node *n) {
75 struct node_callback *c;
76 struct node_vtable *v;
77 struct node_enumerator *e;
85 bus_node_destroy(b, n->child);
87 while ((c = n->callbacks)) {
88 LIST_REMOVE(callbacks, n->callbacks, c);
92 while ((v = n->vtables)) {
93 LIST_REMOVE(vtables, n->vtables, v);
98 while ((e = n->enumerators)) {
99 LIST_REMOVE(enumerators, n->enumerators, e);
104 LIST_REMOVE(siblings, n->parent->child, n);
106 assert_se(hashmap_remove(b->nodes, n->path) == n);
111 static void bus_reset_queues(sd_bus *b) {
114 while (b->rqueue_size > 0)
115 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
119 b->rqueue_allocated = 0;
121 while (b->wqueue_size > 0)
122 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
126 b->wqueue_allocated = 0;
129 static void bus_free(sd_bus *b) {
130 struct filter_callback *f;
135 assert(!b->track_queue);
137 sd_bus_detach_event(b);
139 if (b->default_bus_ptr)
140 *b->default_bus_ptr = NULL;
145 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
148 free(b->unique_name);
149 free(b->auth_buffer);
154 free(b->cgroup_root);
155 free(b->connection_name);
158 strv_free(b->exec_argv);
160 close_many(b->fds, b->n_fds);
165 hashmap_free_free(b->reply_callbacks);
166 prioq_free(b->reply_callbacks_prioq);
168 while ((f = b->filter_callbacks)) {
169 LIST_REMOVE(callbacks, b->filter_callbacks, f);
173 bus_match_free(&b->match_callbacks);
175 hashmap_free_free(b->vtable_methods);
176 hashmap_free_free(b->vtable_properties);
178 while ((n = hashmap_first(b->nodes)))
179 bus_node_destroy(b, n);
181 hashmap_free(b->nodes);
183 bus_kernel_flush_memfd(b);
185 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
190 _public_ int sd_bus_new(sd_bus **ret) {
193 assert_return(ret, -EINVAL);
199 r->n_ref = REFCNT_INIT;
200 r->input_fd = r->output_fd = -1;
201 r->message_version = 1;
202 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
203 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
204 r->attach_flags |= KDBUS_ATTACH_NAMES;
205 r->original_pid = getpid();
207 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
209 /* We guarantee that wqueue always has space for at least one
211 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
220 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
223 assert_return(bus, -EINVAL);
224 assert_return(bus->state == BUS_UNSET, -EPERM);
225 assert_return(address, -EINVAL);
226 assert_return(!bus_pid_changed(bus), -ECHILD);
238 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
239 assert_return(bus, -EINVAL);
240 assert_return(bus->state == BUS_UNSET, -EPERM);
241 assert_return(input_fd >= 0, -EINVAL);
242 assert_return(output_fd >= 0, -EINVAL);
243 assert_return(!bus_pid_changed(bus), -ECHILD);
245 bus->input_fd = input_fd;
246 bus->output_fd = output_fd;
250 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
253 assert_return(bus, -EINVAL);
254 assert_return(bus->state == BUS_UNSET, -EPERM);
255 assert_return(path, -EINVAL);
256 assert_return(!strv_isempty(argv), -EINVAL);
257 assert_return(!bus_pid_changed(bus), -ECHILD);
269 free(bus->exec_path);
270 strv_free(bus->exec_argv);
278 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
279 assert_return(bus, -EINVAL);
280 assert_return(bus->state == BUS_UNSET, -EPERM);
281 assert_return(!bus_pid_changed(bus), -ECHILD);
283 bus->bus_client = !!b;
287 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
288 assert_return(bus, -EINVAL);
289 assert_return(bus->state == BUS_UNSET, -EPERM);
290 assert_return(!bus_pid_changed(bus), -ECHILD);
292 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
296 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
297 assert_return(bus, -EINVAL);
298 assert_return(bus->state == BUS_UNSET, -EPERM);
299 assert_return(!bus_pid_changed(bus), -ECHILD);
301 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
305 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
306 assert_return(bus, -EINVAL);
307 assert_return(bus->state == BUS_UNSET, -EPERM);
308 assert_return(!bus_pid_changed(bus), -ECHILD);
310 SET_FLAG(bus->attach_flags, KDBUS_ATTACH_TIMESTAMP, b);
314 _public_ int sd_bus_negotiate_creds(sd_bus *bus, uint64_t mask) {
315 assert_return(bus, -EINVAL);
316 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
317 assert_return(bus->state == BUS_UNSET, -EPERM);
318 assert_return(!bus_pid_changed(bus), -ECHILD);
320 /* The well knowns we need unconditionally, so that matches can work */
321 bus->creds_mask = mask | SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
323 return kdbus_translate_attach_flags(bus->creds_mask, &bus->attach_flags);
326 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
327 assert_return(bus, -EINVAL);
328 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
329 assert_return(bus->state == BUS_UNSET, -EPERM);
330 assert_return(!bus_pid_changed(bus), -ECHILD);
332 bus->is_server = !!b;
333 bus->server_id = server_id;
337 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
338 assert_return(bus, -EINVAL);
339 assert_return(bus->state == BUS_UNSET, -EPERM);
340 assert_return(!bus_pid_changed(bus), -ECHILD);
342 bus->anonymous_auth = !!b;
346 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
347 assert_return(bus, -EINVAL);
348 assert_return(bus->state == BUS_UNSET, -EPERM);
349 assert_return(!bus_pid_changed(bus), -ECHILD);
355 _public_ int sd_bus_set_name(sd_bus *bus, const char *name) {
358 assert_return(bus, -EINVAL);
359 assert_return(name, -EINVAL);
360 assert_return(bus->state == BUS_UNSET, -EPERM);
361 assert_return(!bus_pid_changed(bus), -ECHILD);
367 free(bus->connection_name);
368 bus->connection_name = n;
373 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
378 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
381 r = sd_bus_message_get_errno(reply);
387 r = sd_bus_message_read(reply, "s", &s);
391 if (!service_name_is_valid(s) || s[0] != ':')
394 bus->unique_name = strdup(s);
395 if (!bus->unique_name)
398 if (bus->state == BUS_HELLO)
399 bus->state = BUS_RUNNING;
404 static int bus_send_hello(sd_bus *bus) {
405 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
410 if (!bus->bus_client || bus->is_kernel)
413 r = sd_bus_message_new_method_call(
416 "org.freedesktop.DBus",
417 "/org/freedesktop/DBus",
418 "org.freedesktop.DBus",
423 return sd_bus_call_async(bus, m, hello_callback, NULL, 0, &bus->hello_cookie);
426 int bus_start_running(sd_bus *bus) {
429 if (bus->bus_client && !bus->is_kernel) {
430 bus->state = BUS_HELLO;
434 bus->state = BUS_RUNNING;
438 static int parse_address_key(const char **p, const char *key, char **value) {
439 size_t l, n = 0, allocated = 0;
449 if (strncmp(*p, key, l) != 0)
462 while (*a != ';' && *a != ',' && *a != 0) {
480 c = (char) ((x << 4) | y);
487 if (!GREEDY_REALLOC(r, allocated, n + 2))
511 static void skip_address_key(const char **p) {
515 *p += strcspn(*p, ",");
521 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
522 _cleanup_free_ char *path = NULL, *abstract = NULL;
531 while (**p != 0 && **p != ';') {
532 r = parse_address_key(p, "guid", guid);
538 r = parse_address_key(p, "path", &path);
544 r = parse_address_key(p, "abstract", &abstract);
553 if (!path && !abstract)
556 if (path && abstract)
561 if (l > sizeof(b->sockaddr.un.sun_path))
564 b->sockaddr.un.sun_family = AF_UNIX;
565 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
566 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
567 } else if (abstract) {
568 l = strlen(abstract);
569 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
572 b->sockaddr.un.sun_family = AF_UNIX;
573 b->sockaddr.un.sun_path[0] = 0;
574 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
575 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
581 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
582 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
584 struct addrinfo *result, hints = {
585 .ai_socktype = SOCK_STREAM,
586 .ai_flags = AI_ADDRCONFIG,
594 while (**p != 0 && **p != ';') {
595 r = parse_address_key(p, "guid", guid);
601 r = parse_address_key(p, "host", &host);
607 r = parse_address_key(p, "port", &port);
613 r = parse_address_key(p, "family", &family);
626 if (streq(family, "ipv4"))
627 hints.ai_family = AF_INET;
628 else if (streq(family, "ipv6"))
629 hints.ai_family = AF_INET6;
634 r = getaddrinfo(host, port, &hints, &result);
638 return -EADDRNOTAVAIL;
640 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
641 b->sockaddr_size = result->ai_addrlen;
643 freeaddrinfo(result);
648 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
650 unsigned n_argv = 0, j;
652 size_t allocated = 0;
660 while (**p != 0 && **p != ';') {
661 r = parse_address_key(p, "guid", guid);
667 r = parse_address_key(p, "path", &path);
673 if (startswith(*p, "argv")) {
677 ul = strtoul(*p + 4, (char**) p, 10);
678 if (errno > 0 || **p != '=' || ul > 256) {
686 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
694 r = parse_address_key(p, NULL, argv + ul);
709 /* Make sure there are no holes in the array, with the
710 * exception of argv[0] */
711 for (j = 1; j < n_argv; j++)
717 if (argv && argv[0] == NULL) {
718 argv[0] = strdup(path);
730 for (j = 0; j < n_argv; j++)
738 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
739 _cleanup_free_ char *path = NULL;
747 while (**p != 0 && **p != ';') {
748 r = parse_address_key(p, "guid", guid);
754 r = parse_address_key(p, "path", &path);
773 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
774 _cleanup_free_ char *machine = NULL;
782 while (**p != 0 && **p != ';') {
783 r = parse_address_key(p, "guid", guid);
789 r = parse_address_key(p, "machine", &machine);
801 if (!filename_is_safe(machine))
805 b->machine = machine;
808 b->sockaddr.un.sun_family = AF_UNIX;
809 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
810 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
815 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
816 _cleanup_free_ char *machine = NULL;
824 while (**p != 0 && **p != ';') {
825 r = parse_address_key(p, "guid", guid);
831 r = parse_address_key(p, "machine", &machine);
843 if (!filename_is_safe(machine))
847 b->machine = machine;
851 b->kernel = strdup("/dev/kdbus/0-system/bus");
858 static void bus_reset_parsed_address(sd_bus *b) {
862 b->sockaddr_size = 0;
863 strv_free(b->exec_argv);
867 b->server_id = SD_ID128_NULL;
874 static int bus_parse_next_address(sd_bus *b) {
875 _cleanup_free_ char *guid = NULL;
883 if (b->address[b->address_index] == 0)
886 bus_reset_parsed_address(b);
888 a = b->address + b->address_index;
897 if (startswith(a, "unix:")) {
900 r = parse_unix_address(b, &a, &guid);
905 } else if (startswith(a, "tcp:")) {
908 r = parse_tcp_address(b, &a, &guid);
914 } else if (startswith(a, "unixexec:")) {
917 r = parse_exec_address(b, &a, &guid);
923 } else if (startswith(a, "kernel:")) {
926 r = parse_kernel_address(b, &a, &guid);
931 } else if (startswith(a, "x-container-unix:")) {
934 r = parse_container_unix_address(b, &a, &guid);
939 } else if (startswith(a, "x-container-kernel:")) {
942 r = parse_container_kernel_address(b, &a, &guid);
955 r = sd_id128_from_string(guid, &b->server_id);
960 b->address_index = a - b->address;
964 static int bus_start_address(sd_bus *b) {
970 bool skipped = false;
975 r = bus_socket_exec(b);
976 else if (b->machine && b->kernel)
977 r = bus_container_connect_kernel(b);
978 else if (b->machine && b->sockaddr.sa.sa_family != AF_UNSPEC)
979 r = bus_container_connect_socket(b);
981 r = bus_kernel_connect(b);
982 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
983 r = bus_socket_connect(b);
989 r = attach_io_events(b);
994 b->last_connect_error = -r;
997 r = bus_parse_next_address(b);
1001 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1005 int bus_next_address(sd_bus *b) {
1008 bus_reset_parsed_address(b);
1009 return bus_start_address(b);
1012 static int bus_start_fd(sd_bus *b) {
1017 assert(b->input_fd >= 0);
1018 assert(b->output_fd >= 0);
1020 r = fd_nonblock(b->input_fd, true);
1024 r = fd_cloexec(b->input_fd, true);
1028 if (b->input_fd != b->output_fd) {
1029 r = fd_nonblock(b->output_fd, true);
1033 r = fd_cloexec(b->output_fd, true);
1038 if (fstat(b->input_fd, &st) < 0)
1041 if (S_ISCHR(b->input_fd))
1042 return bus_kernel_take_fd(b);
1044 return bus_socket_take_fd(b);
1047 _public_ int sd_bus_start(sd_bus *bus) {
1050 assert_return(bus, -EINVAL);
1051 assert_return(bus->state == BUS_UNSET, -EPERM);
1052 assert_return(!bus_pid_changed(bus), -ECHILD);
1054 bus->state = BUS_OPENING;
1056 if (bus->is_server && bus->bus_client)
1059 if (bus->input_fd >= 0)
1060 r = bus_start_fd(bus);
1061 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1062 r = bus_start_address(bus);
1069 return bus_send_hello(bus);
1072 _public_ int sd_bus_open(sd_bus **ret) {
1077 assert_return(ret, -EINVAL);
1079 /* Let's connect to the starter bus if it is set, and
1080 * otherwise to the bus that is appropropriate for the scope
1081 * we are running in */
1083 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1085 if (streq(e, "system"))
1086 return sd_bus_open_system(ret);
1087 else if (STR_IN_SET(e, "session", "user"))
1088 return sd_bus_open_user(ret);
1091 e = secure_getenv("DBUS_STARTER_ADDRESS");
1093 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1094 return sd_bus_open_user(ret);
1096 return sd_bus_open_system(ret);
1103 r = sd_bus_set_address(b, e);
1107 b->bus_client = true;
1109 /* We don't know whether the bus is trusted or not, so better
1110 * be safe, and authenticate everything */
1112 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1114 r = sd_bus_start(b);
1126 int bus_set_address_system(sd_bus *b) {
1130 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1132 return sd_bus_set_address(b, e);
1134 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_PATH);
1137 _public_ int sd_bus_open_system(sd_bus **ret) {
1141 assert_return(ret, -EINVAL);
1147 r = bus_set_address_system(b);
1151 b->bus_client = true;
1152 b->is_system = true;
1154 /* Let's do per-method access control on the system bus. We
1155 * need the caller's UID and capability set for that. */
1157 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1159 r = sd_bus_start(b);
1171 int bus_set_address_user(sd_bus *b) {
1176 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1178 return sd_bus_set_address(b, e);
1180 e = secure_getenv("XDG_RUNTIME_DIR");
1182 _cleanup_free_ char *ee = NULL;
1184 ee = bus_address_escape(e);
1189 asprintf(&b->address, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, (unsigned long) getuid(), ee);
1191 asprintf(&b->address, UNIX_USER_BUS_FMT, ee);
1195 asprintf(&b->address, KERNEL_USER_BUS_FMT, (unsigned long) getuid());
1197 return -ECONNREFUSED;
1207 _public_ int sd_bus_open_user(sd_bus **ret) {
1211 assert_return(ret, -EINVAL);
1217 r = bus_set_address_user(b);
1221 b->bus_client = true;
1224 /* We don't do any per-method access control on the user
1228 r = sd_bus_start(b);
1240 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1241 _cleanup_free_ char *e = NULL;
1246 e = bus_address_escape(host);
1250 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", NULL);
1257 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1261 assert_return(host, -EINVAL);
1262 assert_return(ret, -EINVAL);
1264 r = sd_bus_new(&bus);
1268 r = bus_set_address_system_remote(bus, host);
1272 bus->bus_client = true;
1273 bus->trusted = false;
1275 r = sd_bus_start(bus);
1287 int bus_set_address_system_container(sd_bus *b, const char *machine) {
1288 _cleanup_free_ char *e = NULL;
1293 e = bus_address_escape(machine);
1298 b->address = strjoin("x-container-kernel:machine=", e, ";x-container-unix:machine=", e, NULL);
1300 b->address = strjoin("x-container-unix:machine=", e, NULL);
1308 _public_ int sd_bus_open_system_container(sd_bus **ret, const char *machine) {
1312 assert_return(machine, -EINVAL);
1313 assert_return(ret, -EINVAL);
1314 assert_return(filename_is_safe(machine), -EINVAL);
1316 r = sd_bus_new(&bus);
1320 r = bus_set_address_system_container(bus, machine);
1324 bus->bus_client = true;
1325 bus->trusted = false;
1327 r = sd_bus_start(bus);
1339 _public_ void sd_bus_close(sd_bus *bus) {
1343 if (bus->state == BUS_CLOSED)
1345 if (bus_pid_changed(bus))
1348 bus->state = BUS_CLOSED;
1350 sd_bus_detach_event(bus);
1352 /* Drop all queued messages so that they drop references to
1353 * the bus object and the bus may be freed */
1354 bus_reset_queues(bus);
1356 if (!bus->is_kernel)
1359 /* We'll leave the fd open in case this is a kernel bus, since
1360 * there might still be memblocks around that reference this
1361 * bus, and they might need to invoke the KDBUS_CMD_FREE
1362 * ioctl on the fd when they are freed. */
1365 static void bus_enter_closing(sd_bus *bus) {
1368 if (bus->state != BUS_OPENING &&
1369 bus->state != BUS_AUTHENTICATING &&
1370 bus->state != BUS_HELLO &&
1371 bus->state != BUS_RUNNING)
1374 bus->state = BUS_CLOSING;
1377 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1378 assert_return(bus, NULL);
1380 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1385 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1391 if (REFCNT_GET(bus->n_ref) == bus->rqueue_size + bus->wqueue_size + 1) {
1394 for (i = 0; i < bus->rqueue_size; i++)
1395 if (bus->rqueue[i]->n_ref > 1) {
1401 for (i = 0; i < bus->wqueue_size; i++)
1402 if (bus->wqueue[i]->n_ref > 1) {
1408 /* We are the only holders on the messages, and the
1409 * messages are the only holders on us, so let's drop
1410 * the messages and thus implicitly also kill our own
1411 * last references */
1414 bus_reset_queues(bus);
1417 i = REFCNT_DEC(bus->n_ref);
1425 _public_ int sd_bus_is_open(sd_bus *bus) {
1427 assert_return(bus, -EINVAL);
1428 assert_return(!bus_pid_changed(bus), -ECHILD);
1430 return BUS_IS_OPEN(bus->state);
1433 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1436 assert_return(bus, -EINVAL);
1437 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1438 assert_return(!bus_pid_changed(bus), -ECHILD);
1440 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1443 if (type == SD_BUS_TYPE_UNIX_FD) {
1444 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1447 r = bus_ensure_running(bus);
1451 return bus->can_fds;
1454 return bus_type_is_valid(type);
1457 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1460 assert_return(bus, -EINVAL);
1461 assert_return(server_id, -EINVAL);
1462 assert_return(!bus_pid_changed(bus), -ECHILD);
1464 r = bus_ensure_running(bus);
1468 *server_id = bus->server_id;
1472 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1477 /* If we copy the same message to multiple
1478 * destinations, avoid using the same cookie
1480 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1485 timeout = BUS_DEFAULT_TIMEOUT;
1487 return bus_message_seal(m, ++b->cookie, timeout);
1490 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1493 /* Do packet version and endianness already match? */
1494 if ((b->message_version == 0 || b->message_version == (*m)->header->version) &&
1495 (b->message_endian == 0 || b->message_endian == (*m)->header->endian))
1498 /* No? Then remarshal! */
1499 return bus_message_remarshal(b, m);
1502 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1506 /* The bus specification says the serial number cannot be 0,
1507 * hence let's fill something in for synthetic messages. Since
1508 * synthetic messages might have a fake sender and we don't
1509 * want to interfere with the real sender's serial numbers we
1510 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1511 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1512 * even though kdbus can do 64bit. */
1514 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1517 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1524 r = bus_kernel_write_message(bus, m, hint_sync_call);
1526 r = bus_socket_write_message(bus, m, idx);
1531 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1532 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1533 bus_message_type_to_string(m->header->type),
1534 strna(sd_bus_message_get_sender(m)),
1535 strna(sd_bus_message_get_destination(m)),
1536 strna(sd_bus_message_get_path(m)),
1537 strna(sd_bus_message_get_interface(m)),
1538 strna(sd_bus_message_get_member(m)),
1539 BUS_MESSAGE_COOKIE(m),
1541 strna(m->error.message));
1546 static int dispatch_wqueue(sd_bus *bus) {
1550 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1552 while (bus->wqueue_size > 0) {
1554 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1558 /* Didn't do anything this time */
1560 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1561 /* Fully written. Let's drop the entry from
1564 * This isn't particularly optimized, but
1565 * well, this is supposed to be our worst-case
1566 * buffer only, and the socket buffer is
1567 * supposed to be our primary buffer, and if
1568 * it got full, then all bets are off
1571 bus->wqueue_size --;
1572 sd_bus_message_unref(bus->wqueue[0]);
1573 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1583 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1587 return bus_kernel_read_message(bus, hint_priority, priority);
1589 return bus_socket_read_message(bus);
1592 int bus_rqueue_make_room(sd_bus *bus) {
1595 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1598 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1604 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1609 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1611 /* Note that the priority logic is only available on kdbus,
1612 * where the rqueue is unused. We check the rqueue here
1613 * anyway, because it's simple... */
1616 if (bus->rqueue_size > 0) {
1617 /* Dispatch a queued message */
1619 *m = bus->rqueue[0];
1620 bus->rqueue_size --;
1621 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1625 /* Try to read a new message */
1626 r = bus_read_message(bus, hint_priority, priority);
1636 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1637 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1640 assert_return(bus, -EINVAL);
1641 assert_return(m, -EINVAL);
1642 assert_return(!bus_pid_changed(bus), -ECHILD);
1643 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1645 if (!BUS_IS_OPEN(bus->state))
1649 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1656 /* If the cookie number isn't kept, then we know that no reply
1658 if (!cookie && !m->sealed)
1659 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1661 r = bus_seal_message(bus, m, 0);
1665 /* Remarshall if we have to. This will possibly unref the
1666 * message and place a replacement in m */
1667 r = bus_remarshal_message(bus, &m);
1671 /* If this is a reply and no reply was requested, then let's
1672 * suppress this, if we can */
1673 if (m->dont_send && !cookie)
1676 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1679 r = bus_write_message(bus, m, hint_sync_call, &idx);
1681 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1682 bus_enter_closing(bus);
1687 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1688 /* Wasn't fully written. So let's remember how
1689 * much was written. Note that the first entry
1690 * of the wqueue array is always allocated so
1691 * that we always can remember how much was
1693 bus->wqueue[0] = sd_bus_message_ref(m);
1694 bus->wqueue_size = 1;
1698 /* Just append it to the queue. */
1700 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1703 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1706 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1710 *cookie = BUS_MESSAGE_COOKIE(m);
1715 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1716 return bus_send_internal(bus, m, cookie, false);
1719 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1722 assert_return(bus, -EINVAL);
1723 assert_return(m, -EINVAL);
1724 assert_return(!bus_pid_changed(bus), -ECHILD);
1726 if (!BUS_IS_OPEN(bus->state))
1729 if (!streq_ptr(m->destination, destination)) {
1734 r = sd_bus_message_set_destination(m, destination);
1739 return sd_bus_send(bus, m, cookie);
1742 static usec_t calc_elapse(uint64_t usec) {
1743 if (usec == (uint64_t) -1)
1746 return now(CLOCK_MONOTONIC) + usec;
1749 static int timeout_compare(const void *a, const void *b) {
1750 const struct reply_callback *x = a, *y = b;
1752 if (x->timeout != 0 && y->timeout == 0)
1755 if (x->timeout == 0 && y->timeout != 0)
1758 if (x->timeout < y->timeout)
1761 if (x->timeout > y->timeout)
1767 _public_ int sd_bus_call_async(
1770 sd_bus_message_handler_t callback,
1775 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1776 struct reply_callback *c;
1779 assert_return(bus, -EINVAL);
1780 assert_return(m, -EINVAL);
1781 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1782 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1783 assert_return(callback, -EINVAL);
1784 assert_return(!bus_pid_changed(bus), -ECHILD);
1785 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1787 if (!BUS_IS_OPEN(bus->state))
1790 r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1794 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1798 r = bus_seal_message(bus, m, usec);
1802 r = bus_remarshal_message(bus, &m);
1806 c = new0(struct reply_callback, 1);
1810 c->callback = callback;
1811 c->userdata = userdata;
1812 c->cookie = BUS_MESSAGE_COOKIE(m);
1813 c->timeout = calc_elapse(m->timeout);
1815 r = hashmap_put(bus->reply_callbacks, &c->cookie, c);
1821 if (c->timeout != 0) {
1822 r = prioq_put(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1825 sd_bus_call_async_cancel(bus, c->cookie);
1830 r = sd_bus_send(bus, m, cookie);
1832 sd_bus_call_async_cancel(bus, c->cookie);
1839 _public_ int sd_bus_call_async_cancel(sd_bus *bus, uint64_t cookie) {
1840 struct reply_callback *c;
1842 assert_return(bus, -EINVAL);
1843 assert_return(cookie != 0, -EINVAL);
1844 assert_return(!bus_pid_changed(bus), -ECHILD);
1846 c = hashmap_remove(bus->reply_callbacks, &cookie);
1850 if (c->timeout != 0)
1851 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1857 int bus_ensure_running(sd_bus *bus) {
1862 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1864 if (bus->state == BUS_RUNNING)
1868 r = sd_bus_process(bus, NULL);
1871 if (bus->state == BUS_RUNNING)
1876 r = sd_bus_wait(bus, (uint64_t) -1);
1882 _public_ int sd_bus_call(
1886 sd_bus_error *error,
1887 sd_bus_message **reply) {
1889 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1895 assert_return(bus, -EINVAL);
1896 assert_return(m, -EINVAL);
1897 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1898 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1899 assert_return(!bus_error_is_dirty(error), -EINVAL);
1900 assert_return(!bus_pid_changed(bus), -ECHILD);
1901 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1903 if (!BUS_IS_OPEN(bus->state))
1906 r = bus_ensure_running(bus);
1910 i = bus->rqueue_size;
1912 r = bus_seal_message(bus, m, usec);
1916 r = bus_remarshal_message(bus, &m);
1920 r = bus_send_internal(bus, m, &cookie, true);
1924 timeout = calc_elapse(m->timeout);
1929 while (i < bus->rqueue_size) {
1930 sd_bus_message *incoming = NULL;
1932 incoming = bus->rqueue[i];
1934 if (incoming->reply_cookie == cookie) {
1935 /* Found a match! */
1937 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1940 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1942 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
1946 sd_bus_message_unref(incoming);
1951 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1953 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1954 r = sd_bus_error_copy(error, &incoming->error);
1958 sd_bus_message_unref(incoming);
1961 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1964 streq(bus->unique_name, incoming->sender)) {
1966 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1969 /* Our own message? Somebody is trying
1970 * to send its own client a message,
1971 * let's not dead-lock, let's fail
1974 sd_bus_message_unref(incoming);
1978 /* Try to read more, right-away */
1982 r = bus_read_message(bus, false, 0);
1984 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1985 bus_enter_closing(bus);
1997 n = now(CLOCK_MONOTONIC);
2003 left = (uint64_t) -1;
2005 r = bus_poll(bus, true, left);
2011 r = dispatch_wqueue(bus);
2013 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2014 bus_enter_closing(bus);
2023 _public_ int sd_bus_get_fd(sd_bus *bus) {
2025 assert_return(bus, -EINVAL);
2026 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2027 assert_return(!bus_pid_changed(bus), -ECHILD);
2029 return bus->input_fd;
2032 _public_ int sd_bus_get_events(sd_bus *bus) {
2035 assert_return(bus, -EINVAL);
2036 assert_return(!bus_pid_changed(bus), -ECHILD);
2038 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2041 if (bus->state == BUS_OPENING)
2043 else if (bus->state == BUS_AUTHENTICATING) {
2045 if (bus_socket_auth_needs_write(bus))
2050 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2051 if (bus->rqueue_size <= 0)
2053 if (bus->wqueue_size > 0)
2060 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2061 struct reply_callback *c;
2063 assert_return(bus, -EINVAL);
2064 assert_return(timeout_usec, -EINVAL);
2065 assert_return(!bus_pid_changed(bus), -ECHILD);
2067 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2070 if (bus->track_queue) {
2075 if (bus->state == BUS_CLOSING) {
2080 if (bus->state == BUS_AUTHENTICATING) {
2081 *timeout_usec = bus->auth_timeout;
2085 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2086 *timeout_usec = (uint64_t) -1;
2090 if (bus->rqueue_size > 0) {
2095 c = prioq_peek(bus->reply_callbacks_prioq);
2097 *timeout_usec = (uint64_t) -1;
2101 *timeout_usec = c->timeout;
2105 static int process_timeout(sd_bus *bus) {
2106 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2107 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2108 struct reply_callback *c;
2114 c = prioq_peek(bus->reply_callbacks_prioq);
2118 n = now(CLOCK_MONOTONIC);
2122 r = bus_message_new_synthetic_error(
2125 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2130 m->sender = "org.freedesktop.DBus";
2132 r = bus_seal_synthetic_message(bus, m);
2136 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2137 hashmap_remove(bus->reply_callbacks, &c->cookie);
2140 bus->iteration_counter ++;
2142 r = c->callback(bus, m, c->userdata, &error_buffer);
2143 r = bus_maybe_reply_error(m, r, &error_buffer);
2146 bus->current = NULL;
2151 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2155 if (bus->state != BUS_HELLO)
2158 /* Let's make sure the first message on the bus is the HELLO
2159 * reply. But note that we don't actually parse the message
2160 * here (we leave that to the usual handling), we just verify
2161 * we don't let any earlier msg through. */
2163 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2164 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2167 if (m->reply_cookie != bus->hello_cookie)
2173 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2174 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2175 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2176 _cleanup_free_ struct reply_callback *c = NULL;
2182 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2183 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2186 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2189 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2192 c = hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2196 if (c->timeout != 0)
2197 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2199 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2201 /* If the reply contained a file descriptor which we
2202 * didn't want we pass an error instead. */
2204 r = bus_message_new_synthetic_error(
2207 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2212 r = bus_seal_synthetic_message(bus, synthetic_reply);
2216 m = synthetic_reply;
2218 r = sd_bus_message_rewind(m, true);
2223 r = c->callback(bus, m, c->userdata, &error_buffer);
2224 r = bus_maybe_reply_error(m, r, &error_buffer);
2229 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2230 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2231 struct filter_callback *l;
2238 bus->filter_callbacks_modified = false;
2240 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2242 if (bus->filter_callbacks_modified)
2245 /* Don't run this more than once per iteration */
2246 if (l->last_iteration == bus->iteration_counter)
2249 l->last_iteration = bus->iteration_counter;
2251 r = sd_bus_message_rewind(m, true);
2255 r = l->callback(bus, m, l->userdata, &error_buffer);
2256 r = bus_maybe_reply_error(m, r, &error_buffer);
2262 } while (bus->filter_callbacks_modified);
2267 static int process_match(sd_bus *bus, sd_bus_message *m) {
2274 bus->match_callbacks_modified = false;
2276 r = bus_match_run(bus, &bus->match_callbacks, m);
2280 } while (bus->match_callbacks_modified);
2285 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2286 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2292 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2295 if (bus->manual_peer_interface)
2298 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2301 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2304 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2307 if (streq_ptr(m->member, "Ping"))
2308 r = sd_bus_message_new_method_return(m, &reply);
2309 else if (streq_ptr(m->member, "GetMachineId")) {
2313 r = sd_id128_get_machine(&id);
2317 r = sd_bus_message_new_method_return(m, &reply);
2321 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2323 r = sd_bus_message_new_method_errorf(
2325 SD_BUS_ERROR_UNKNOWN_METHOD,
2326 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2332 r = sd_bus_send(bus, reply, NULL);
2339 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2343 /* If we got a message with a file descriptor which we didn't
2344 * want to accept, then let's drop it. How can this even
2345 * happen? For example, when the kernel queues a message into
2346 * an activatable names's queue which allows fds, and then is
2347 * delivered to us later even though we ourselves did not
2350 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2356 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2359 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2360 return 1; /* just eat it up */
2362 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2365 static int process_message(sd_bus *bus, sd_bus_message *m) {
2372 bus->iteration_counter++;
2374 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
2375 bus_message_type_to_string(m->header->type),
2376 strna(sd_bus_message_get_sender(m)),
2377 strna(sd_bus_message_get_destination(m)),
2378 strna(sd_bus_message_get_path(m)),
2379 strna(sd_bus_message_get_interface(m)),
2380 strna(sd_bus_message_get_member(m)),
2381 BUS_MESSAGE_COOKIE(m),
2383 strna(m->error.message));
2385 r = process_hello(bus, m);
2389 r = process_reply(bus, m);
2393 r = process_fd_check(bus, m);
2397 r = process_filter(bus, m);
2401 r = process_match(bus, m);
2405 r = process_builtin(bus, m);
2409 r = bus_process_object(bus, m);
2412 bus->current = NULL;
2416 static int dispatch_track(sd_bus *bus) {
2419 if (!bus->track_queue)
2422 bus_track_dispatch(bus->track_queue);
2426 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2427 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2431 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2433 r = process_timeout(bus);
2437 r = dispatch_wqueue(bus);
2441 r = dispatch_track(bus);
2445 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2451 r = process_message(bus, m);
2456 r = sd_bus_message_rewind(m, true);
2465 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2467 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2468 strna(sd_bus_message_get_sender(m)),
2469 strna(sd_bus_message_get_path(m)),
2470 strna(sd_bus_message_get_interface(m)),
2471 strna(sd_bus_message_get_member(m)));
2473 r = sd_bus_reply_method_errorf(
2475 SD_BUS_ERROR_UNKNOWN_OBJECT,
2476 "Unknown object '%s'.", m->path);
2490 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2491 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2492 struct reply_callback *c;
2496 assert(bus->state == BUS_CLOSING);
2498 c = hashmap_first(bus->reply_callbacks);
2500 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2502 /* First, fail all outstanding method calls */
2503 r = bus_message_new_synthetic_error(
2506 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2511 r = bus_seal_synthetic_message(bus, m);
2515 if (c->timeout != 0)
2516 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2518 hashmap_remove(bus->reply_callbacks, &c->cookie);
2521 bus->iteration_counter++;
2523 r = c->callback(bus, m, c->userdata, &error_buffer);
2524 r = bus_maybe_reply_error(m, r, &error_buffer);
2530 /* Then, synthesize a Disconnected message */
2531 r = sd_bus_message_new_signal(
2534 "/org/freedesktop/DBus/Local",
2535 "org.freedesktop.DBus.Local",
2540 m->sender = "org.freedesktop.DBus.Local";
2542 r = bus_seal_synthetic_message(bus, m);
2549 bus->iteration_counter++;
2551 r = process_filter(bus, m);
2555 r = process_match(bus, m);
2567 bus->current = NULL;
2571 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2572 BUS_DONT_DESTROY(bus);
2575 /* Returns 0 when we didn't do anything. This should cause the
2576 * caller to invoke sd_bus_wait() before returning the next
2577 * time. Returns > 0 when we did something, which possibly
2578 * means *ret is filled in with an unprocessed message. */
2580 assert_return(bus, -EINVAL);
2581 assert_return(!bus_pid_changed(bus), -ECHILD);
2583 /* We don't allow recursively invoking sd_bus_process(). */
2584 assert_return(!bus->current, -EBUSY);
2586 switch (bus->state) {
2595 r = bus_socket_process_opening(bus);
2596 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2597 bus_enter_closing(bus);
2605 case BUS_AUTHENTICATING:
2606 r = bus_socket_process_authenticating(bus);
2607 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2608 bus_enter_closing(bus);
2620 r = process_running(bus, hint_priority, priority, ret);
2621 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2622 bus_enter_closing(bus);
2632 return process_closing(bus, ret);
2635 assert_not_reached("Unknown state");
2638 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2639 return bus_process_internal(bus, false, 0, ret);
2642 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2643 return bus_process_internal(bus, true, priority, ret);
2646 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2647 struct pollfd p[2] = {};
2650 usec_t m = (usec_t) -1;
2654 if (bus->state == BUS_CLOSING)
2657 if (!BUS_IS_OPEN(bus->state))
2660 e = sd_bus_get_events(bus);
2665 /* The caller really needs some more data, he doesn't
2666 * care about what's already read, or any timeouts
2671 /* The caller wants to process if there's something to
2672 * process, but doesn't care otherwise */
2674 r = sd_bus_get_timeout(bus, &until);
2679 nw = now(CLOCK_MONOTONIC);
2680 m = until > nw ? until - nw : 0;
2684 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2687 p[0].fd = bus->input_fd;
2688 if (bus->output_fd == bus->input_fd) {
2692 p[0].events = e & POLLIN;
2693 p[1].fd = bus->output_fd;
2694 p[1].events = e & POLLOUT;
2698 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2702 return r > 0 ? 1 : 0;
2705 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2707 assert_return(bus, -EINVAL);
2708 assert_return(!bus_pid_changed(bus), -ECHILD);
2710 if (bus->state == BUS_CLOSING)
2713 if (!BUS_IS_OPEN(bus->state))
2716 if (bus->rqueue_size > 0)
2719 return bus_poll(bus, false, timeout_usec);
2722 _public_ int sd_bus_flush(sd_bus *bus) {
2725 assert_return(bus, -EINVAL);
2726 assert_return(!bus_pid_changed(bus), -ECHILD);
2728 if (bus->state == BUS_CLOSING)
2731 if (!BUS_IS_OPEN(bus->state))
2734 r = bus_ensure_running(bus);
2738 if (bus->wqueue_size <= 0)
2742 r = dispatch_wqueue(bus);
2744 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2745 bus_enter_closing(bus);
2752 if (bus->wqueue_size <= 0)
2755 r = bus_poll(bus, false, (uint64_t) -1);
2761 _public_ int sd_bus_add_filter(sd_bus *bus,
2762 sd_bus_message_handler_t callback,
2765 struct filter_callback *f;
2767 assert_return(bus, -EINVAL);
2768 assert_return(callback, -EINVAL);
2769 assert_return(!bus_pid_changed(bus), -ECHILD);
2771 f = new0(struct filter_callback, 1);
2774 f->callback = callback;
2775 f->userdata = userdata;
2777 bus->filter_callbacks_modified = true;
2778 LIST_PREPEND(callbacks, bus->filter_callbacks, f);
2782 _public_ int sd_bus_remove_filter(sd_bus *bus,
2783 sd_bus_message_handler_t callback,
2786 struct filter_callback *f;
2788 assert_return(bus, -EINVAL);
2789 assert_return(callback, -EINVAL);
2790 assert_return(!bus_pid_changed(bus), -ECHILD);
2792 LIST_FOREACH(callbacks, f, bus->filter_callbacks) {
2793 if (f->callback == callback && f->userdata == userdata) {
2794 bus->filter_callbacks_modified = true;
2795 LIST_REMOVE(callbacks, bus->filter_callbacks, f);
2804 _public_ int sd_bus_add_match(sd_bus *bus,
2806 sd_bus_message_handler_t callback,
2809 struct bus_match_component *components = NULL;
2810 unsigned n_components = 0;
2811 uint64_t cookie = 0;
2814 assert_return(bus, -EINVAL);
2815 assert_return(match, -EINVAL);
2816 assert_return(!bus_pid_changed(bus), -ECHILD);
2818 r = bus_match_parse(match, &components, &n_components);
2822 if (bus->bus_client) {
2823 cookie = ++bus->match_cookie;
2825 r = bus_add_match_internal(bus, match, components, n_components, cookie);
2830 bus->match_callbacks_modified = true;
2831 r = bus_match_add(&bus->match_callbacks, components, n_components, callback, userdata, cookie, NULL);
2833 if (bus->bus_client)
2834 bus_remove_match_internal(bus, match, cookie);
2838 bus_match_parse_free(components, n_components);
2842 _public_ int sd_bus_remove_match(sd_bus *bus,
2844 sd_bus_message_handler_t callback,
2847 struct bus_match_component *components = NULL;
2848 unsigned n_components = 0;
2850 uint64_t cookie = 0;
2852 assert_return(bus, -EINVAL);
2853 assert_return(match, -EINVAL);
2854 assert_return(!bus_pid_changed(bus), -ECHILD);
2856 r = bus_match_parse(match, &components, &n_components);
2860 bus->match_callbacks_modified = true;
2861 r = bus_match_remove(&bus->match_callbacks, components, n_components, callback, userdata, &cookie);
2863 if (bus->bus_client)
2864 q = bus_remove_match_internal(bus, match, cookie);
2866 bus_match_parse_free(components, n_components);
2868 return r < 0 ? r : q;
2871 bool bus_pid_changed(sd_bus *bus) {
2874 /* We don't support people creating a bus connection and
2875 * keeping it around over a fork(). Let's complain. */
2877 return bus->original_pid != getpid();
2880 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2881 sd_bus *bus = userdata;
2886 r = sd_bus_process(bus, NULL);
2893 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2894 sd_bus *bus = userdata;
2899 r = sd_bus_process(bus, NULL);
2906 static int prepare_callback(sd_event_source *s, void *userdata) {
2907 sd_bus *bus = userdata;
2914 e = sd_bus_get_events(bus);
2918 if (bus->output_fd != bus->input_fd) {
2920 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2924 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2928 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2933 r = sd_bus_get_timeout(bus, &until);
2939 j = sd_event_source_set_time(bus->time_event_source, until);
2944 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2951 static int quit_callback(sd_event_source *event, void *userdata) {
2952 sd_bus *bus = userdata;
2961 static int attach_io_events(sd_bus *bus) {
2966 if (bus->input_fd < 0)
2972 if (!bus->input_io_event_source) {
2973 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
2977 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2981 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
2983 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
2988 if (bus->output_fd != bus->input_fd) {
2989 assert(bus->output_fd >= 0);
2991 if (!bus->output_io_event_source) {
2992 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
2996 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
2998 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3007 static void detach_io_events(sd_bus *bus) {
3010 if (bus->input_io_event_source) {
3011 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3012 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3015 if (bus->output_io_event_source) {
3016 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3017 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3021 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3024 assert_return(bus, -EINVAL);
3025 assert_return(!bus->event, -EBUSY);
3027 assert(!bus->input_io_event_source);
3028 assert(!bus->output_io_event_source);
3029 assert(!bus->time_event_source);
3032 bus->event = sd_event_ref(event);
3034 r = sd_event_default(&bus->event);
3039 bus->event_priority = priority;
3041 r = sd_event_add_monotonic(bus->event, &bus->time_event_source, 0, 0, time_callback, bus);
3045 r = sd_event_source_set_priority(bus->time_event_source, priority);
3049 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3053 r = attach_io_events(bus);
3060 sd_bus_detach_event(bus);
3064 _public_ int sd_bus_detach_event(sd_bus *bus) {
3065 assert_return(bus, -EINVAL);
3070 detach_io_events(bus);
3072 if (bus->time_event_source) {
3073 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3074 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3077 if (bus->quit_event_source) {
3078 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3079 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3083 bus->event = sd_event_unref(bus->event);
3088 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3089 assert_return(bus, NULL);
3094 _public_ sd_bus_message* sd_bus_get_current(sd_bus *bus) {
3095 assert_return(bus, NULL);
3097 return bus->current;
3100 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3105 assert(default_bus);
3108 return !!*default_bus;
3111 *ret = sd_bus_ref(*default_bus);
3119 b->default_bus_ptr = default_bus;
3127 _public_ int sd_bus_default_system(sd_bus **ret) {
3128 static thread_local sd_bus *default_system_bus = NULL;
3130 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3133 _public_ int sd_bus_default_user(sd_bus **ret) {
3134 static thread_local sd_bus *default_user_bus = NULL;
3136 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3139 _public_ int sd_bus_default(sd_bus **ret) {
3143 /* Let's try our best to reuse another cached connection. If
3144 * the starter bus type is set, connect via our normal
3145 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3146 * we can share the connection with the user/system default
3149 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3151 if (streq(e, "system"))
3152 return sd_bus_default_system(ret);
3153 else if (STR_IN_SET(e, "user", "session"))
3154 return sd_bus_default_user(ret);
3157 /* No type is specified, so we have not other option than to
3158 * use the starter address if it is set. */
3160 e = secure_getenv("DBUS_STARTER_ADDRESS");
3162 static thread_local sd_bus *default_starter_bus = NULL;
3164 return bus_default(sd_bus_open, &default_starter_bus, ret);
3167 /* Finally, if nothing is set use the cached connection for
3168 * the right scope */
3170 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3171 return sd_bus_default_user(ret);
3173 return sd_bus_default_system(ret);
3176 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3177 assert_return(b, -EINVAL);
3178 assert_return(tid, -EINVAL);
3179 assert_return(!bus_pid_changed(b), -ECHILD);
3187 return sd_event_get_tid(b->event, tid);
3192 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3193 _cleanup_free_ char *e = NULL;
3196 assert_return(object_path_is_valid(prefix), -EINVAL);
3197 assert_return(external_id, -EINVAL);
3198 assert_return(ret_path, -EINVAL);
3200 e = bus_label_escape(external_id);
3204 ret = strjoin(prefix, "/", e, NULL);
3212 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3216 assert_return(object_path_is_valid(path), -EINVAL);
3217 assert_return(object_path_is_valid(prefix), -EINVAL);
3218 assert_return(external_id, -EINVAL);
3220 e = object_path_startswith(path, prefix);
3222 *external_id = NULL;
3226 ret = bus_label_unescape(e);
3234 _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) {
3239 assert_return(bus, -EINVAL);
3240 assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
3241 assert_return(ret, -EINVAL);
3242 assert_return(!bus_pid_changed(bus), -ECHILD);
3244 if (!bus->is_kernel)
3247 if (!BUS_IS_OPEN(bus->state))
3250 if (!bus->ucred_valid && !isempty(bus->label))
3253 c = bus_creds_new();
3257 if (bus->ucred_valid) {
3258 pid = c->pid = bus->ucred.pid;
3259 c->uid = bus->ucred.uid;
3260 c->gid = bus->ucred.gid;
3262 c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask;
3265 if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
3266 c->label = strdup(bus->label);
3268 sd_bus_creds_unref(c);
3272 c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
3275 r = bus_creds_add_more(c, mask, pid, 0);
3283 _public_ int sd_bus_try_close(sd_bus *bus) {
3286 assert_return(bus, -EINVAL);
3287 assert_return(!bus_pid_changed(bus), -ECHILD);
3289 if (!bus->is_kernel)
3292 if (!BUS_IS_OPEN(bus->state))
3295 if (bus->rqueue_size > 0)
3298 if (bus->wqueue_size > 0)
3301 r = bus_kernel_try_close(bus);
3309 _public_ int sd_bus_get_name(sd_bus *bus, const char **name) {
3310 assert_return(bus, -EINVAL);
3311 assert_return(name, -EINVAL);
3312 assert_return(!bus_pid_changed(bus), -ECHILD);
3314 *name = bus->connection_name;