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"
57 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
58 static int attach_io_events(sd_bus *b);
59 static void detach_io_events(sd_bus *b);
61 static void bus_close_fds(sd_bus *b) {
67 safe_close(b->input_fd);
69 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
70 safe_close(b->output_fd);
72 b->input_fd = b->output_fd = -1;
75 static void bus_reset_queues(sd_bus *b) {
78 while (b->rqueue_size > 0)
79 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
83 b->rqueue_allocated = 0;
85 while (b->wqueue_size > 0)
86 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
90 b->wqueue_allocated = 0;
93 static void bus_free(sd_bus *b) {
97 assert(!b->track_queue);
99 b->state = BUS_CLOSED;
101 sd_bus_detach_event(b);
103 while ((s = b->slots)) {
104 /* At this point only floating slots can still be
105 * around, because the non-floating ones keep a
106 * reference to the bus, and we thus couldn't be
107 * destructing right now... We forcibly disconnect the
108 * slots here, so that they still can be referenced by
109 * apps, but are dead. */
112 bus_slot_disconnect(s);
113 sd_bus_slot_unref(s);
116 if (b->default_bus_ptr)
117 *b->default_bus_ptr = NULL;
122 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
125 free(b->unique_name);
126 free(b->auth_buffer);
131 free(b->cgroup_root);
132 free(b->connection_name);
135 strv_free(b->exec_argv);
137 close_many(b->fds, b->n_fds);
142 hashmap_free_free(b->reply_callbacks);
143 prioq_free(b->reply_callbacks_prioq);
145 bus_match_free(&b->match_callbacks);
147 hashmap_free_free(b->vtable_methods);
148 hashmap_free_free(b->vtable_properties);
150 assert(hashmap_isempty(b->nodes));
151 hashmap_free(b->nodes);
153 bus_kernel_flush_memfd(b);
155 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
160 _public_ int sd_bus_new(sd_bus **ret) {
163 assert_return(ret, -EINVAL);
169 r->n_ref = REFCNT_INIT;
170 r->input_fd = r->output_fd = -1;
171 r->message_version = 1;
172 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
173 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
174 r->attach_flags |= KDBUS_ATTACH_NAMES;
175 r->original_pid = getpid();
177 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
179 /* We guarantee that wqueue always has space for at least one
181 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
190 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
193 assert_return(bus, -EINVAL);
194 assert_return(bus->state == BUS_UNSET, -EPERM);
195 assert_return(address, -EINVAL);
196 assert_return(!bus_pid_changed(bus), -ECHILD);
208 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
209 assert_return(bus, -EINVAL);
210 assert_return(bus->state == BUS_UNSET, -EPERM);
211 assert_return(input_fd >= 0, -EINVAL);
212 assert_return(output_fd >= 0, -EINVAL);
213 assert_return(!bus_pid_changed(bus), -ECHILD);
215 bus->input_fd = input_fd;
216 bus->output_fd = output_fd;
220 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
223 assert_return(bus, -EINVAL);
224 assert_return(bus->state == BUS_UNSET, -EPERM);
225 assert_return(path, -EINVAL);
226 assert_return(!strv_isempty(argv), -EINVAL);
227 assert_return(!bus_pid_changed(bus), -ECHILD);
239 free(bus->exec_path);
240 strv_free(bus->exec_argv);
248 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
249 assert_return(bus, -EINVAL);
250 assert_return(bus->state == BUS_UNSET, -EPERM);
251 assert_return(!bus_pid_changed(bus), -ECHILD);
253 bus->bus_client = !!b;
257 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
258 assert_return(bus, -EINVAL);
259 assert_return(bus->state == BUS_UNSET, -EPERM);
260 assert_return(!bus_pid_changed(bus), -ECHILD);
262 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
266 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
267 assert_return(bus, -EINVAL);
268 assert_return(bus->state == BUS_UNSET, -EPERM);
269 assert_return(!bus_pid_changed(bus), -ECHILD);
271 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
275 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
276 assert_return(bus, -EINVAL);
277 assert_return(bus->state == BUS_UNSET, -EPERM);
278 assert_return(!bus_pid_changed(bus), -ECHILD);
280 SET_FLAG(bus->attach_flags, KDBUS_ATTACH_TIMESTAMP, b);
284 _public_ int sd_bus_negotiate_creds(sd_bus *bus, uint64_t mask) {
285 assert_return(bus, -EINVAL);
286 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
287 assert_return(bus->state == BUS_UNSET, -EPERM);
288 assert_return(!bus_pid_changed(bus), -ECHILD);
290 /* The well knowns we need unconditionally, so that matches can work */
291 bus->creds_mask = mask | SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
293 return kdbus_translate_attach_flags(bus->creds_mask, &bus->attach_flags);
296 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
297 assert_return(bus, -EINVAL);
298 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
299 assert_return(bus->state == BUS_UNSET, -EPERM);
300 assert_return(!bus_pid_changed(bus), -ECHILD);
302 bus->is_server = !!b;
303 bus->server_id = server_id;
307 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
308 assert_return(bus, -EINVAL);
309 assert_return(bus->state == BUS_UNSET, -EPERM);
310 assert_return(!bus_pid_changed(bus), -ECHILD);
312 bus->anonymous_auth = !!b;
316 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
317 assert_return(bus, -EINVAL);
318 assert_return(bus->state == BUS_UNSET, -EPERM);
319 assert_return(!bus_pid_changed(bus), -ECHILD);
325 _public_ int sd_bus_set_name(sd_bus *bus, const char *name) {
328 assert_return(bus, -EINVAL);
329 assert_return(name, -EINVAL);
330 assert_return(bus->state == BUS_UNSET, -EPERM);
331 assert_return(!bus_pid_changed(bus), -ECHILD);
337 free(bus->connection_name);
338 bus->connection_name = n;
343 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
348 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
351 r = sd_bus_message_get_errno(reply);
357 r = sd_bus_message_read(reply, "s", &s);
361 if (!service_name_is_valid(s) || s[0] != ':')
364 bus->unique_name = strdup(s);
365 if (!bus->unique_name)
368 if (bus->state == BUS_HELLO)
369 bus->state = BUS_RUNNING;
374 static int bus_send_hello(sd_bus *bus) {
375 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
380 if (!bus->bus_client || bus->is_kernel)
383 r = sd_bus_message_new_method_call(
386 "org.freedesktop.DBus",
387 "/org/freedesktop/DBus",
388 "org.freedesktop.DBus",
393 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
396 int bus_start_running(sd_bus *bus) {
399 if (bus->bus_client && !bus->is_kernel) {
400 bus->state = BUS_HELLO;
404 bus->state = BUS_RUNNING;
408 static int parse_address_key(const char **p, const char *key, char **value) {
409 size_t l, n = 0, allocated = 0;
419 if (strncmp(*p, key, l) != 0)
432 while (*a != ';' && *a != ',' && *a != 0) {
450 c = (char) ((x << 4) | y);
457 if (!GREEDY_REALLOC(r, allocated, n + 2))
481 static void skip_address_key(const char **p) {
485 *p += strcspn(*p, ",");
491 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
492 _cleanup_free_ char *path = NULL, *abstract = NULL;
501 while (**p != 0 && **p != ';') {
502 r = parse_address_key(p, "guid", guid);
508 r = parse_address_key(p, "path", &path);
514 r = parse_address_key(p, "abstract", &abstract);
523 if (!path && !abstract)
526 if (path && abstract)
531 if (l > sizeof(b->sockaddr.un.sun_path))
534 b->sockaddr.un.sun_family = AF_UNIX;
535 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
536 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
537 } else if (abstract) {
538 l = strlen(abstract);
539 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
542 b->sockaddr.un.sun_family = AF_UNIX;
543 b->sockaddr.un.sun_path[0] = 0;
544 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
545 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
551 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
552 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
554 struct addrinfo *result, hints = {
555 .ai_socktype = SOCK_STREAM,
556 .ai_flags = AI_ADDRCONFIG,
564 while (**p != 0 && **p != ';') {
565 r = parse_address_key(p, "guid", guid);
571 r = parse_address_key(p, "host", &host);
577 r = parse_address_key(p, "port", &port);
583 r = parse_address_key(p, "family", &family);
596 if (streq(family, "ipv4"))
597 hints.ai_family = AF_INET;
598 else if (streq(family, "ipv6"))
599 hints.ai_family = AF_INET6;
604 r = getaddrinfo(host, port, &hints, &result);
608 return -EADDRNOTAVAIL;
610 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
611 b->sockaddr_size = result->ai_addrlen;
613 freeaddrinfo(result);
618 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
620 unsigned n_argv = 0, j;
622 size_t allocated = 0;
630 while (**p != 0 && **p != ';') {
631 r = parse_address_key(p, "guid", guid);
637 r = parse_address_key(p, "path", &path);
643 if (startswith(*p, "argv")) {
647 ul = strtoul(*p + 4, (char**) p, 10);
648 if (errno > 0 || **p != '=' || ul > 256) {
656 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
664 r = parse_address_key(p, NULL, argv + ul);
679 /* Make sure there are no holes in the array, with the
680 * exception of argv[0] */
681 for (j = 1; j < n_argv; j++)
687 if (argv && argv[0] == NULL) {
688 argv[0] = strdup(path);
700 for (j = 0; j < n_argv; j++)
708 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
709 _cleanup_free_ char *path = NULL;
717 while (**p != 0 && **p != ';') {
718 r = parse_address_key(p, "guid", guid);
724 r = parse_address_key(p, "path", &path);
743 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
744 _cleanup_free_ char *machine = NULL;
752 while (**p != 0 && **p != ';') {
753 r = parse_address_key(p, "guid", guid);
759 r = parse_address_key(p, "machine", &machine);
771 if (!filename_is_safe(machine))
775 b->machine = machine;
778 b->sockaddr.un.sun_family = AF_UNIX;
779 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
780 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
785 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
786 _cleanup_free_ char *machine = NULL;
794 while (**p != 0 && **p != ';') {
795 r = parse_address_key(p, "guid", guid);
801 r = parse_address_key(p, "machine", &machine);
813 if (!filename_is_safe(machine))
817 b->machine = machine;
821 b->kernel = strdup("/dev/kdbus/0-system/bus");
828 static void bus_reset_parsed_address(sd_bus *b) {
832 b->sockaddr_size = 0;
833 strv_free(b->exec_argv);
837 b->server_id = SD_ID128_NULL;
844 static int bus_parse_next_address(sd_bus *b) {
845 _cleanup_free_ char *guid = NULL;
853 if (b->address[b->address_index] == 0)
856 bus_reset_parsed_address(b);
858 a = b->address + b->address_index;
867 if (startswith(a, "unix:")) {
870 r = parse_unix_address(b, &a, &guid);
875 } else if (startswith(a, "tcp:")) {
878 r = parse_tcp_address(b, &a, &guid);
884 } else if (startswith(a, "unixexec:")) {
887 r = parse_exec_address(b, &a, &guid);
893 } else if (startswith(a, "kernel:")) {
896 r = parse_kernel_address(b, &a, &guid);
901 } else if (startswith(a, "x-container-unix:")) {
904 r = parse_container_unix_address(b, &a, &guid);
909 } else if (startswith(a, "x-container-kernel:")) {
912 r = parse_container_kernel_address(b, &a, &guid);
925 r = sd_id128_from_string(guid, &b->server_id);
930 b->address_index = a - b->address;
934 static int bus_start_address(sd_bus *b) {
940 bool skipped = false;
945 r = bus_socket_exec(b);
946 else if (b->machine && b->kernel)
947 r = bus_container_connect_kernel(b);
948 else if (b->machine && b->sockaddr.sa.sa_family != AF_UNSPEC)
949 r = bus_container_connect_socket(b);
951 r = bus_kernel_connect(b);
952 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
953 r = bus_socket_connect(b);
959 r = attach_io_events(b);
964 b->last_connect_error = -r;
967 r = bus_parse_next_address(b);
971 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
975 int bus_next_address(sd_bus *b) {
978 bus_reset_parsed_address(b);
979 return bus_start_address(b);
982 static int bus_start_fd(sd_bus *b) {
987 assert(b->input_fd >= 0);
988 assert(b->output_fd >= 0);
990 r = fd_nonblock(b->input_fd, true);
994 r = fd_cloexec(b->input_fd, true);
998 if (b->input_fd != b->output_fd) {
999 r = fd_nonblock(b->output_fd, true);
1003 r = fd_cloexec(b->output_fd, true);
1008 if (fstat(b->input_fd, &st) < 0)
1011 if (S_ISCHR(b->input_fd))
1012 return bus_kernel_take_fd(b);
1014 return bus_socket_take_fd(b);
1017 _public_ int sd_bus_start(sd_bus *bus) {
1020 assert_return(bus, -EINVAL);
1021 assert_return(bus->state == BUS_UNSET, -EPERM);
1022 assert_return(!bus_pid_changed(bus), -ECHILD);
1024 bus->state = BUS_OPENING;
1026 if (bus->is_server && bus->bus_client)
1029 if (bus->input_fd >= 0)
1030 r = bus_start_fd(bus);
1031 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1032 r = bus_start_address(bus);
1039 return bus_send_hello(bus);
1042 _public_ int sd_bus_open(sd_bus **ret) {
1047 assert_return(ret, -EINVAL);
1049 /* Let's connect to the starter bus if it is set, and
1050 * otherwise to the bus that is appropropriate for the scope
1051 * we are running in */
1053 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1055 if (streq(e, "system"))
1056 return sd_bus_open_system(ret);
1057 else if (STR_IN_SET(e, "session", "user"))
1058 return sd_bus_open_user(ret);
1061 e = secure_getenv("DBUS_STARTER_ADDRESS");
1063 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1064 return sd_bus_open_user(ret);
1066 return sd_bus_open_system(ret);
1073 r = sd_bus_set_address(b, e);
1077 b->bus_client = true;
1079 /* We don't know whether the bus is trusted or not, so better
1080 * be safe, and authenticate everything */
1082 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1084 r = sd_bus_start(b);
1096 int bus_set_address_system(sd_bus *b) {
1100 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1102 return sd_bus_set_address(b, e);
1104 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_PATH);
1107 _public_ int sd_bus_open_system(sd_bus **ret) {
1111 assert_return(ret, -EINVAL);
1117 r = bus_set_address_system(b);
1121 b->bus_client = true;
1122 b->is_system = true;
1124 /* Let's do per-method access control on the system bus. We
1125 * need the caller's UID and capability set for that. */
1127 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1129 r = sd_bus_start(b);
1141 int bus_set_address_user(sd_bus *b) {
1146 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1148 return sd_bus_set_address(b, e);
1150 e = secure_getenv("XDG_RUNTIME_DIR");
1152 _cleanup_free_ char *ee = NULL;
1154 ee = bus_address_escape(e);
1159 asprintf(&b->address, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, getuid(), ee);
1161 asprintf(&b->address, UNIX_USER_BUS_FMT, ee);
1165 asprintf(&b->address, KERNEL_USER_BUS_FMT, getuid());
1167 return -ECONNREFUSED;
1177 _public_ int sd_bus_open_user(sd_bus **ret) {
1181 assert_return(ret, -EINVAL);
1187 r = bus_set_address_user(b);
1191 b->bus_client = true;
1194 /* We don't do any per-method access control on the user
1198 r = sd_bus_start(b);
1210 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1211 _cleanup_free_ char *e = NULL;
1212 char *m = NULL, *c = NULL;
1217 /* Let's see if we shall enter some container */
1218 m = strchr(host, ':');
1222 /* Let's make sure this is not a port of some kind,
1223 * and is a valid machine name. */
1224 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1227 /* Cut out the host part */
1228 t = strndupa(host, m - host - 1);
1229 e = bus_address_escape(t);
1233 c = strappenda(",argv4=--machine=", m);
1238 e = bus_address_escape(host);
1243 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1250 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1254 assert_return(host, -EINVAL);
1255 assert_return(ret, -EINVAL);
1257 r = sd_bus_new(&bus);
1261 r = bus_set_address_system_remote(bus, host);
1265 bus->bus_client = true;
1266 bus->trusted = false;
1268 r = sd_bus_start(bus);
1280 int bus_set_address_system_container(sd_bus *b, const char *machine) {
1281 _cleanup_free_ char *e = NULL;
1286 e = bus_address_escape(machine);
1291 b->address = strjoin("x-container-kernel:machine=", e, ";x-container-unix:machine=", e, NULL);
1293 b->address = strjoin("x-container-unix:machine=", e, NULL);
1301 _public_ int sd_bus_open_system_container(sd_bus **ret, const char *machine) {
1305 assert_return(machine, -EINVAL);
1306 assert_return(ret, -EINVAL);
1307 assert_return(filename_is_safe(machine), -EINVAL);
1309 r = sd_bus_new(&bus);
1313 r = bus_set_address_system_container(bus, machine);
1317 bus->bus_client = true;
1318 bus->trusted = false;
1320 r = sd_bus_start(bus);
1332 _public_ void sd_bus_close(sd_bus *bus) {
1336 if (bus->state == BUS_CLOSED)
1338 if (bus_pid_changed(bus))
1341 bus->state = BUS_CLOSED;
1343 sd_bus_detach_event(bus);
1345 /* Drop all queued messages so that they drop references to
1346 * the bus object and the bus may be freed */
1347 bus_reset_queues(bus);
1349 if (!bus->is_kernel)
1352 /* We'll leave the fd open in case this is a kernel bus, since
1353 * there might still be memblocks around that reference this
1354 * bus, and they might need to invoke the KDBUS_CMD_FREE
1355 * ioctl on the fd when they are freed. */
1358 static void bus_enter_closing(sd_bus *bus) {
1361 if (bus->state != BUS_OPENING &&
1362 bus->state != BUS_AUTHENTICATING &&
1363 bus->state != BUS_HELLO &&
1364 bus->state != BUS_RUNNING)
1367 bus->state = BUS_CLOSING;
1370 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1371 assert_return(bus, NULL);
1373 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1378 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1384 i = REFCNT_DEC(bus->n_ref);
1392 _public_ int sd_bus_is_open(sd_bus *bus) {
1394 assert_return(bus, -EINVAL);
1395 assert_return(!bus_pid_changed(bus), -ECHILD);
1397 return BUS_IS_OPEN(bus->state);
1400 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1403 assert_return(bus, -EINVAL);
1404 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1405 assert_return(!bus_pid_changed(bus), -ECHILD);
1407 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1410 if (type == SD_BUS_TYPE_UNIX_FD) {
1411 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1414 r = bus_ensure_running(bus);
1418 return bus->can_fds;
1421 return bus_type_is_valid(type);
1424 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1427 assert_return(bus, -EINVAL);
1428 assert_return(server_id, -EINVAL);
1429 assert_return(!bus_pid_changed(bus), -ECHILD);
1431 r = bus_ensure_running(bus);
1435 *server_id = bus->server_id;
1439 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1444 /* If we copy the same message to multiple
1445 * destinations, avoid using the same cookie
1447 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1452 timeout = BUS_DEFAULT_TIMEOUT;
1454 return bus_message_seal(m, ++b->cookie, timeout);
1457 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1460 /* Do packet version and endianness already match? */
1461 if ((b->message_version == 0 || b->message_version == (*m)->header->version) &&
1462 (b->message_endian == 0 || b->message_endian == (*m)->header->endian))
1465 /* No? Then remarshal! */
1466 return bus_message_remarshal(b, m);
1469 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1473 /* The bus specification says the serial number cannot be 0,
1474 * hence let's fill something in for synthetic messages. Since
1475 * synthetic messages might have a fake sender and we don't
1476 * want to interfere with the real sender's serial numbers we
1477 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1478 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1479 * even though kdbus can do 64bit. */
1481 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1484 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1491 r = bus_kernel_write_message(bus, m, hint_sync_call);
1493 r = bus_socket_write_message(bus, m, idx);
1498 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1499 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1500 bus_message_type_to_string(m->header->type),
1501 strna(sd_bus_message_get_sender(m)),
1502 strna(sd_bus_message_get_destination(m)),
1503 strna(sd_bus_message_get_path(m)),
1504 strna(sd_bus_message_get_interface(m)),
1505 strna(sd_bus_message_get_member(m)),
1506 BUS_MESSAGE_COOKIE(m),
1508 strna(m->error.message));
1513 static int dispatch_wqueue(sd_bus *bus) {
1517 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1519 while (bus->wqueue_size > 0) {
1521 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1525 /* Didn't do anything this time */
1527 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1528 /* Fully written. Let's drop the entry from
1531 * This isn't particularly optimized, but
1532 * well, this is supposed to be our worst-case
1533 * buffer only, and the socket buffer is
1534 * supposed to be our primary buffer, and if
1535 * it got full, then all bets are off
1538 bus->wqueue_size --;
1539 sd_bus_message_unref(bus->wqueue[0]);
1540 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1550 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1554 return bus_kernel_read_message(bus, hint_priority, priority);
1556 return bus_socket_read_message(bus);
1559 int bus_rqueue_make_room(sd_bus *bus) {
1562 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1565 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1571 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1576 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1578 /* Note that the priority logic is only available on kdbus,
1579 * where the rqueue is unused. We check the rqueue here
1580 * anyway, because it's simple... */
1583 if (bus->rqueue_size > 0) {
1584 /* Dispatch a queued message */
1586 *m = bus->rqueue[0];
1587 bus->rqueue_size --;
1588 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1592 /* Try to read a new message */
1593 r = bus_read_message(bus, hint_priority, priority);
1603 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1604 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1607 assert_return(bus, -EINVAL);
1608 assert_return(m, -EINVAL);
1609 assert_return(!bus_pid_changed(bus), -ECHILD);
1610 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1612 if (!BUS_IS_OPEN(bus->state))
1616 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1623 /* If the cookie number isn't kept, then we know that no reply
1625 if (!cookie && !m->sealed)
1626 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1628 r = bus_seal_message(bus, m, 0);
1632 /* Remarshall if we have to. This will possibly unref the
1633 * message and place a replacement in m */
1634 r = bus_remarshal_message(bus, &m);
1638 /* If this is a reply and no reply was requested, then let's
1639 * suppress this, if we can */
1640 if (m->dont_send && !cookie)
1643 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1646 r = bus_write_message(bus, m, hint_sync_call, &idx);
1648 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1649 bus_enter_closing(bus);
1654 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1655 /* Wasn't fully written. So let's remember how
1656 * much was written. Note that the first entry
1657 * of the wqueue array is always allocated so
1658 * that we always can remember how much was
1660 bus->wqueue[0] = sd_bus_message_ref(m);
1661 bus->wqueue_size = 1;
1665 /* Just append it to the queue. */
1667 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1670 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1673 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1677 *cookie = BUS_MESSAGE_COOKIE(m);
1682 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1683 return bus_send_internal(bus, m, cookie, false);
1686 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1689 assert_return(bus, -EINVAL);
1690 assert_return(m, -EINVAL);
1691 assert_return(!bus_pid_changed(bus), -ECHILD);
1693 if (!BUS_IS_OPEN(bus->state))
1696 if (!streq_ptr(m->destination, destination)) {
1701 r = sd_bus_message_set_destination(m, destination);
1706 return sd_bus_send(bus, m, cookie);
1709 static usec_t calc_elapse(uint64_t usec) {
1710 if (usec == (uint64_t) -1)
1713 return now(CLOCK_MONOTONIC) + usec;
1716 static int timeout_compare(const void *a, const void *b) {
1717 const struct reply_callback *x = a, *y = b;
1719 if (x->timeout != 0 && y->timeout == 0)
1722 if (x->timeout == 0 && y->timeout != 0)
1725 if (x->timeout < y->timeout)
1728 if (x->timeout > y->timeout)
1734 _public_ int sd_bus_call_async(
1738 sd_bus_message_handler_t callback,
1742 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1743 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1746 assert_return(bus, -EINVAL);
1747 assert_return(m, -EINVAL);
1748 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1749 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1750 assert_return(callback, -EINVAL);
1751 assert_return(!bus_pid_changed(bus), -ECHILD);
1752 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1754 if (!BUS_IS_OPEN(bus->state))
1757 r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1761 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1765 r = bus_seal_message(bus, m, usec);
1769 r = bus_remarshal_message(bus, &m);
1773 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1777 s->reply_callback.callback = callback;
1779 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1780 r = hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1782 s->reply_callback.cookie = 0;
1786 s->reply_callback.timeout = calc_elapse(m->timeout);
1787 if (s->reply_callback.timeout != 0) {
1788 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1790 s->reply_callback.timeout = 0;
1795 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1806 int bus_ensure_running(sd_bus *bus) {
1811 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1813 if (bus->state == BUS_RUNNING)
1817 r = sd_bus_process(bus, NULL);
1820 if (bus->state == BUS_RUNNING)
1825 r = sd_bus_wait(bus, (uint64_t) -1);
1831 _public_ int sd_bus_call(
1835 sd_bus_error *error,
1836 sd_bus_message **reply) {
1838 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1844 assert_return(bus, -EINVAL);
1845 assert_return(m, -EINVAL);
1846 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1847 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1848 assert_return(!bus_error_is_dirty(error), -EINVAL);
1849 assert_return(!bus_pid_changed(bus), -ECHILD);
1850 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1852 if (!BUS_IS_OPEN(bus->state))
1855 r = bus_ensure_running(bus);
1859 i = bus->rqueue_size;
1861 r = bus_seal_message(bus, m, usec);
1865 r = bus_remarshal_message(bus, &m);
1869 r = bus_send_internal(bus, m, &cookie, true);
1873 timeout = calc_elapse(m->timeout);
1878 while (i < bus->rqueue_size) {
1879 sd_bus_message *incoming = NULL;
1881 incoming = bus->rqueue[i];
1883 if (incoming->reply_cookie == cookie) {
1884 /* Found a match! */
1886 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1889 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1891 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
1895 sd_bus_message_unref(incoming);
1900 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1902 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1903 r = sd_bus_error_copy(error, &incoming->error);
1907 sd_bus_message_unref(incoming);
1910 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1913 streq(bus->unique_name, incoming->sender)) {
1915 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1918 /* Our own message? Somebody is trying
1919 * to send its own client a message,
1920 * let's not dead-lock, let's fail
1923 sd_bus_message_unref(incoming);
1927 /* Try to read more, right-away */
1931 r = bus_read_message(bus, false, 0);
1933 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1934 bus_enter_closing(bus);
1946 n = now(CLOCK_MONOTONIC);
1952 left = (uint64_t) -1;
1954 r = bus_poll(bus, true, left);
1960 r = dispatch_wqueue(bus);
1962 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1963 bus_enter_closing(bus);
1972 _public_ int sd_bus_get_fd(sd_bus *bus) {
1974 assert_return(bus, -EINVAL);
1975 assert_return(bus->input_fd == bus->output_fd, -EPERM);
1976 assert_return(!bus_pid_changed(bus), -ECHILD);
1978 return bus->input_fd;
1981 _public_ int sd_bus_get_events(sd_bus *bus) {
1984 assert_return(bus, -EINVAL);
1985 assert_return(!bus_pid_changed(bus), -ECHILD);
1987 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
1990 if (bus->state == BUS_OPENING)
1992 else if (bus->state == BUS_AUTHENTICATING) {
1994 if (bus_socket_auth_needs_write(bus))
1999 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2000 if (bus->rqueue_size <= 0)
2002 if (bus->wqueue_size > 0)
2009 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2010 struct reply_callback *c;
2012 assert_return(bus, -EINVAL);
2013 assert_return(timeout_usec, -EINVAL);
2014 assert_return(!bus_pid_changed(bus), -ECHILD);
2016 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2019 if (bus->track_queue) {
2024 if (bus->state == BUS_CLOSING) {
2029 if (bus->state == BUS_AUTHENTICATING) {
2030 *timeout_usec = bus->auth_timeout;
2034 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2035 *timeout_usec = (uint64_t) -1;
2039 if (bus->rqueue_size > 0) {
2044 c = prioq_peek(bus->reply_callbacks_prioq);
2046 *timeout_usec = (uint64_t) -1;
2050 if (c->timeout == 0) {
2051 *timeout_usec = (uint64_t) -1;
2055 *timeout_usec = c->timeout;
2059 static int process_timeout(sd_bus *bus) {
2060 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2061 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2062 struct reply_callback *c;
2069 c = prioq_peek(bus->reply_callbacks_prioq);
2073 n = now(CLOCK_MONOTONIC);
2077 r = bus_message_new_synthetic_error(
2080 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2085 m->sender = "org.freedesktop.DBus";
2087 r = bus_seal_synthetic_message(bus, m);
2091 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2094 hashmap_remove(bus->reply_callbacks, &c->cookie);
2097 slot = container_of(c, sd_bus_slot, reply_callback);
2099 bus->iteration_counter ++;
2101 bus->current_message = m;
2102 bus->current_slot = sd_bus_slot_ref(slot);
2103 r = c->callback(bus, m, slot->userdata, &error_buffer);
2104 bus->current_slot = sd_bus_slot_unref(slot);
2105 bus->current_message = NULL;
2107 if (slot->floating) {
2108 bus_slot_disconnect(slot);
2109 sd_bus_slot_unref(slot);
2112 return bus_maybe_reply_error(m, r, &error_buffer);
2115 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2119 if (bus->state != BUS_HELLO)
2122 /* Let's make sure the first message on the bus is the HELLO
2123 * reply. But note that we don't actually parse the message
2124 * here (we leave that to the usual handling), we just verify
2125 * we don't let any earlier msg through. */
2127 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2128 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2131 if (m->reply_cookie != 1)
2137 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2138 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2139 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2140 struct reply_callback *c;
2147 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2148 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2151 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2154 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2157 c = hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2163 slot = container_of(c, sd_bus_slot, reply_callback);
2165 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2167 /* If the reply contained a file descriptor which we
2168 * didn't want we pass an error instead. */
2170 r = bus_message_new_synthetic_error(
2173 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2178 r = bus_seal_synthetic_message(bus, synthetic_reply);
2182 m = synthetic_reply;
2184 r = sd_bus_message_rewind(m, true);
2189 if (c->timeout != 0) {
2190 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2194 bus->current_slot = sd_bus_slot_ref(slot);
2195 r = c->callback(bus, m, slot->userdata, &error_buffer);
2196 bus->current_slot = sd_bus_slot_unref(slot);
2198 if (slot->floating) {
2199 bus_slot_disconnect(slot);
2200 sd_bus_slot_unref(slot);
2203 return bus_maybe_reply_error(m, r, &error_buffer);
2206 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2207 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2208 struct filter_callback *l;
2215 bus->filter_callbacks_modified = false;
2217 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2220 if (bus->filter_callbacks_modified)
2223 /* Don't run this more than once per iteration */
2224 if (l->last_iteration == bus->iteration_counter)
2227 l->last_iteration = bus->iteration_counter;
2229 r = sd_bus_message_rewind(m, true);
2233 slot = container_of(l, sd_bus_slot, filter_callback);
2235 bus->current_slot = sd_bus_slot_ref(slot);
2236 r = l->callback(bus, m, slot->userdata, &error_buffer);
2237 bus->current_slot = sd_bus_slot_unref(slot);
2239 r = bus_maybe_reply_error(m, r, &error_buffer);
2245 } while (bus->filter_callbacks_modified);
2250 static int process_match(sd_bus *bus, sd_bus_message *m) {
2257 bus->match_callbacks_modified = false;
2259 r = bus_match_run(bus, &bus->match_callbacks, m);
2263 } while (bus->match_callbacks_modified);
2268 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2269 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2275 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2278 if (bus->manual_peer_interface)
2281 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2284 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2287 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2290 if (streq_ptr(m->member, "Ping"))
2291 r = sd_bus_message_new_method_return(m, &reply);
2292 else if (streq_ptr(m->member, "GetMachineId")) {
2296 r = sd_id128_get_machine(&id);
2300 r = sd_bus_message_new_method_return(m, &reply);
2304 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2306 r = sd_bus_message_new_method_errorf(
2308 SD_BUS_ERROR_UNKNOWN_METHOD,
2309 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2315 r = sd_bus_send(bus, reply, NULL);
2322 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2326 /* If we got a message with a file descriptor which we didn't
2327 * want to accept, then let's drop it. How can this even
2328 * happen? For example, when the kernel queues a message into
2329 * an activatable names's queue which allows fds, and then is
2330 * delivered to us later even though we ourselves did not
2333 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2339 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2342 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2343 return 1; /* just eat it up */
2345 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2348 static int process_message(sd_bus *bus, sd_bus_message *m) {
2354 bus->current_message = m;
2355 bus->iteration_counter++;
2357 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
2358 bus_message_type_to_string(m->header->type),
2359 strna(sd_bus_message_get_sender(m)),
2360 strna(sd_bus_message_get_destination(m)),
2361 strna(sd_bus_message_get_path(m)),
2362 strna(sd_bus_message_get_interface(m)),
2363 strna(sd_bus_message_get_member(m)),
2364 BUS_MESSAGE_COOKIE(m),
2366 strna(m->error.message));
2368 r = process_hello(bus, m);
2372 r = process_reply(bus, m);
2376 r = process_fd_check(bus, m);
2380 r = process_filter(bus, m);
2384 r = process_match(bus, m);
2388 r = process_builtin(bus, m);
2392 r = bus_process_object(bus, m);
2395 bus->current_message = NULL;
2399 static int dispatch_track(sd_bus *bus) {
2402 if (!bus->track_queue)
2405 bus_track_dispatch(bus->track_queue);
2409 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2410 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2414 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2416 r = process_timeout(bus);
2420 r = dispatch_wqueue(bus);
2424 r = dispatch_track(bus);
2428 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2434 r = process_message(bus, m);
2439 r = sd_bus_message_rewind(m, true);
2448 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2450 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2451 strna(sd_bus_message_get_sender(m)),
2452 strna(sd_bus_message_get_path(m)),
2453 strna(sd_bus_message_get_interface(m)),
2454 strna(sd_bus_message_get_member(m)));
2456 r = sd_bus_reply_method_errorf(
2458 SD_BUS_ERROR_UNKNOWN_OBJECT,
2459 "Unknown object '%s'.", m->path);
2473 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2474 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2475 struct reply_callback *c;
2479 assert(bus->state == BUS_CLOSING);
2481 c = hashmap_first(bus->reply_callbacks);
2483 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2486 /* First, fail all outstanding method calls */
2487 r = bus_message_new_synthetic_error(
2490 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2495 r = bus_seal_synthetic_message(bus, m);
2499 if (c->timeout != 0) {
2500 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2504 hashmap_remove(bus->reply_callbacks, &c->cookie);
2507 slot = container_of(c, sd_bus_slot, reply_callback);
2509 bus->iteration_counter++;
2511 bus->current_message = m;
2512 bus->current_slot = sd_bus_slot_ref(slot);
2513 r = c->callback(bus, m, slot->userdata, &error_buffer);
2514 bus->current_slot = sd_bus_slot_unref(slot);
2515 bus->current_message = NULL;
2517 if (slot->floating) {
2518 bus_slot_disconnect(slot);
2519 sd_bus_slot_unref(slot);
2522 return bus_maybe_reply_error(m, r, &error_buffer);
2525 /* Then, synthesize a Disconnected message */
2526 r = sd_bus_message_new_signal(
2529 "/org/freedesktop/DBus/Local",
2530 "org.freedesktop.DBus.Local",
2535 m->sender = "org.freedesktop.DBus.Local";
2537 r = bus_seal_synthetic_message(bus, m);
2543 bus->current_message = m;
2544 bus->iteration_counter++;
2546 r = process_filter(bus, m);
2550 r = process_match(bus, m);
2562 bus->current_message = NULL;
2567 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2568 BUS_DONT_DESTROY(bus);
2571 /* Returns 0 when we didn't do anything. This should cause the
2572 * caller to invoke sd_bus_wait() before returning the next
2573 * time. Returns > 0 when we did something, which possibly
2574 * means *ret is filled in with an unprocessed message. */
2576 assert_return(bus, -EINVAL);
2577 assert_return(!bus_pid_changed(bus), -ECHILD);
2579 /* We don't allow recursively invoking sd_bus_process(). */
2580 assert_return(!bus->current_message, -EBUSY);
2581 assert(!bus->current_slot);
2583 switch (bus->state) {
2592 r = bus_socket_process_opening(bus);
2593 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2594 bus_enter_closing(bus);
2602 case BUS_AUTHENTICATING:
2603 r = bus_socket_process_authenticating(bus);
2604 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2605 bus_enter_closing(bus);
2617 r = process_running(bus, hint_priority, priority, ret);
2618 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2619 bus_enter_closing(bus);
2629 return process_closing(bus, ret);
2632 assert_not_reached("Unknown state");
2635 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2636 return bus_process_internal(bus, false, 0, ret);
2639 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2640 return bus_process_internal(bus, true, priority, ret);
2643 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2644 struct pollfd p[2] = {};
2647 usec_t m = (usec_t) -1;
2651 if (bus->state == BUS_CLOSING)
2654 if (!BUS_IS_OPEN(bus->state))
2657 e = sd_bus_get_events(bus);
2662 /* The caller really needs some more data, he doesn't
2663 * care about what's already read, or any timeouts
2668 /* The caller wants to process if there's something to
2669 * process, but doesn't care otherwise */
2671 r = sd_bus_get_timeout(bus, &until);
2676 nw = now(CLOCK_MONOTONIC);
2677 m = until > nw ? until - nw : 0;
2681 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2684 p[0].fd = bus->input_fd;
2685 if (bus->output_fd == bus->input_fd) {
2689 p[0].events = e & POLLIN;
2690 p[1].fd = bus->output_fd;
2691 p[1].events = e & POLLOUT;
2695 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2699 return r > 0 ? 1 : 0;
2702 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2704 assert_return(bus, -EINVAL);
2705 assert_return(!bus_pid_changed(bus), -ECHILD);
2707 if (bus->state == BUS_CLOSING)
2710 if (!BUS_IS_OPEN(bus->state))
2713 if (bus->rqueue_size > 0)
2716 return bus_poll(bus, false, timeout_usec);
2719 _public_ int sd_bus_flush(sd_bus *bus) {
2722 assert_return(bus, -EINVAL);
2723 assert_return(!bus_pid_changed(bus), -ECHILD);
2725 if (bus->state == BUS_CLOSING)
2728 if (!BUS_IS_OPEN(bus->state))
2731 r = bus_ensure_running(bus);
2735 if (bus->wqueue_size <= 0)
2739 r = dispatch_wqueue(bus);
2741 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2742 bus_enter_closing(bus);
2749 if (bus->wqueue_size <= 0)
2752 r = bus_poll(bus, false, (uint64_t) -1);
2758 _public_ int sd_bus_add_filter(
2761 sd_bus_message_handler_t callback,
2766 assert_return(bus, -EINVAL);
2767 assert_return(callback, -EINVAL);
2768 assert_return(!bus_pid_changed(bus), -ECHILD);
2770 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2774 s->filter_callback.callback = callback;
2776 bus->filter_callbacks_modified = true;
2777 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2785 _public_ int sd_bus_add_match(
2789 sd_bus_message_handler_t callback,
2792 struct bus_match_component *components = NULL;
2793 unsigned n_components = 0;
2794 sd_bus_slot *s = NULL;
2797 assert_return(bus, -EINVAL);
2798 assert_return(match, -EINVAL);
2799 assert_return(!bus_pid_changed(bus), -ECHILD);
2801 r = bus_match_parse(match, &components, &n_components);
2805 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2811 s->match_callback.callback = callback;
2812 s->match_callback.cookie = ++bus->match_cookie;
2814 if (bus->bus_client) {
2816 if (!bus->is_kernel) {
2817 /* When this is not a kernel transport, we
2818 * store the original match string, so that we
2819 * can use it to remove the match again */
2821 s->match_callback.match_string = strdup(match);
2822 if (!s->match_callback.match_string) {
2828 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
2833 bus->match_callbacks_modified = true;
2834 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
2843 bus_match_parse_free(components, n_components);
2844 sd_bus_slot_unref(s);
2849 int bus_remove_match_by_string(
2852 sd_bus_message_handler_t callback,
2855 struct bus_match_component *components = NULL;
2856 unsigned n_components = 0;
2857 struct match_callback *c;
2860 assert_return(bus, -EINVAL);
2861 assert_return(match, -EINVAL);
2862 assert_return(!bus_pid_changed(bus), -ECHILD);
2864 r = bus_match_parse(match, &components, &n_components);
2868 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
2872 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
2875 bus_match_parse_free(components, n_components);
2880 bool bus_pid_changed(sd_bus *bus) {
2883 /* We don't support people creating a bus connection and
2884 * keeping it around over a fork(). Let's complain. */
2886 return bus->original_pid != getpid();
2889 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2890 sd_bus *bus = userdata;
2895 r = sd_bus_process(bus, NULL);
2902 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2903 sd_bus *bus = userdata;
2908 r = sd_bus_process(bus, NULL);
2915 static int prepare_callback(sd_event_source *s, void *userdata) {
2916 sd_bus *bus = userdata;
2923 e = sd_bus_get_events(bus);
2927 if (bus->output_fd != bus->input_fd) {
2929 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2933 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2937 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2942 r = sd_bus_get_timeout(bus, &until);
2948 j = sd_event_source_set_time(bus->time_event_source, until);
2953 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2960 static int quit_callback(sd_event_source *event, void *userdata) {
2961 sd_bus *bus = userdata;
2971 static int attach_io_events(sd_bus *bus) {
2976 if (bus->input_fd < 0)
2982 if (!bus->input_io_event_source) {
2983 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
2987 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2991 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
2993 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
2998 if (bus->output_fd != bus->input_fd) {
2999 assert(bus->output_fd >= 0);
3001 if (!bus->output_io_event_source) {
3002 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3006 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3008 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3017 static void detach_io_events(sd_bus *bus) {
3020 if (bus->input_io_event_source) {
3021 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3022 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3025 if (bus->output_io_event_source) {
3026 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3027 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3031 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3034 assert_return(bus, -EINVAL);
3035 assert_return(!bus->event, -EBUSY);
3037 assert(!bus->input_io_event_source);
3038 assert(!bus->output_io_event_source);
3039 assert(!bus->time_event_source);
3042 bus->event = sd_event_ref(event);
3044 r = sd_event_default(&bus->event);
3049 bus->event_priority = priority;
3051 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3055 r = sd_event_source_set_priority(bus->time_event_source, priority);
3059 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3063 r = attach_io_events(bus);
3070 sd_bus_detach_event(bus);
3074 _public_ int sd_bus_detach_event(sd_bus *bus) {
3075 assert_return(bus, -EINVAL);
3080 detach_io_events(bus);
3082 if (bus->time_event_source) {
3083 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3084 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3087 if (bus->quit_event_source) {
3088 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3089 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3092 bus->event = sd_event_unref(bus->event);
3096 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3097 assert_return(bus, NULL);
3102 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3103 assert_return(bus, NULL);
3105 return bus->current_message;
3108 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3109 assert_return(bus, NULL);
3111 return bus->current_slot;
3114 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3119 assert(default_bus);
3122 return !!*default_bus;
3125 *ret = sd_bus_ref(*default_bus);
3133 b->default_bus_ptr = default_bus;
3141 _public_ int sd_bus_default_system(sd_bus **ret) {
3142 static thread_local sd_bus *default_system_bus = NULL;
3144 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3147 _public_ int sd_bus_default_user(sd_bus **ret) {
3148 static thread_local sd_bus *default_user_bus = NULL;
3150 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3153 _public_ int sd_bus_default(sd_bus **ret) {
3157 /* Let's try our best to reuse another cached connection. If
3158 * the starter bus type is set, connect via our normal
3159 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3160 * we can share the connection with the user/system default
3163 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3165 if (streq(e, "system"))
3166 return sd_bus_default_system(ret);
3167 else if (STR_IN_SET(e, "user", "session"))
3168 return sd_bus_default_user(ret);
3171 /* No type is specified, so we have not other option than to
3172 * use the starter address if it is set. */
3174 e = secure_getenv("DBUS_STARTER_ADDRESS");
3176 static thread_local sd_bus *default_starter_bus = NULL;
3178 return bus_default(sd_bus_open, &default_starter_bus, ret);
3181 /* Finally, if nothing is set use the cached connection for
3182 * the right scope */
3184 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3185 return sd_bus_default_user(ret);
3187 return sd_bus_default_system(ret);
3190 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3191 assert_return(b, -EINVAL);
3192 assert_return(tid, -EINVAL);
3193 assert_return(!bus_pid_changed(b), -ECHILD);
3201 return sd_event_get_tid(b->event, tid);
3206 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3207 _cleanup_free_ char *e = NULL;
3210 assert_return(object_path_is_valid(prefix), -EINVAL);
3211 assert_return(external_id, -EINVAL);
3212 assert_return(ret_path, -EINVAL);
3214 e = bus_label_escape(external_id);
3218 ret = strjoin(prefix, "/", e, NULL);
3226 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3230 assert_return(object_path_is_valid(path), -EINVAL);
3231 assert_return(object_path_is_valid(prefix), -EINVAL);
3232 assert_return(external_id, -EINVAL);
3234 e = object_path_startswith(path, prefix);
3236 *external_id = NULL;
3240 ret = bus_label_unescape(e);
3248 _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) {
3253 assert_return(bus, -EINVAL);
3254 assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
3255 assert_return(ret, -EINVAL);
3256 assert_return(!bus_pid_changed(bus), -ECHILD);
3261 if (!BUS_IS_OPEN(bus->state))
3264 if (!bus->ucred_valid && !isempty(bus->label))
3267 c = bus_creds_new();
3271 if (bus->ucred_valid) {
3272 pid = c->pid = bus->ucred.pid;
3273 c->uid = bus->ucred.uid;
3274 c->gid = bus->ucred.gid;
3276 c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask;
3279 if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
3280 c->label = strdup(bus->label);
3282 sd_bus_creds_unref(c);
3286 c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
3289 r = bus_creds_add_more(c, mask, pid, 0);
3297 _public_ int sd_bus_try_close(sd_bus *bus) {
3300 assert_return(bus, -EINVAL);
3301 assert_return(!bus_pid_changed(bus), -ECHILD);
3303 if (!bus->is_kernel)
3306 if (!BUS_IS_OPEN(bus->state))
3309 if (bus->rqueue_size > 0)
3312 if (bus->wqueue_size > 0)
3315 r = bus_kernel_try_close(bus);
3323 _public_ int sd_bus_get_name(sd_bus *bus, const char **name) {
3324 assert_return(bus, -EINVAL);
3325 assert_return(name, -EINVAL);
3326 assert_return(!bus_pid_changed(bus), -ECHILD);
3328 *name = bus->connection_name;