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(BUS_IS_OPEN(bus->state), -ENOTCONN);
1642 assert_return(m, -EINVAL);
1643 assert_return(!bus_pid_changed(bus), -ECHILD);
1644 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1647 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1654 /* If the cookie number isn't kept, then we know that no reply
1656 if (!cookie && !m->sealed)
1657 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1659 r = bus_seal_message(bus, m, 0);
1663 /* Remarshall if we have to. This will possibly unref the
1664 * message and place a replacement in m */
1665 r = bus_remarshal_message(bus, &m);
1669 /* If this is a reply and no reply was requested, then let's
1670 * suppress this, if we can */
1671 if (m->dont_send && !cookie)
1674 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1677 r = bus_write_message(bus, m, hint_sync_call, &idx);
1679 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1680 bus_enter_closing(bus);
1685 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1686 /* Wasn't fully written. So let's remember how
1687 * much was written. Note that the first entry
1688 * of the wqueue array is always allocated so
1689 * that we always can remember how much was
1691 bus->wqueue[0] = sd_bus_message_ref(m);
1692 bus->wqueue_size = 1;
1696 /* Just append it to the queue. */
1698 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1701 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1704 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1708 *cookie = BUS_MESSAGE_COOKIE(m);
1713 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1714 return bus_send_internal(bus, m, cookie, false);
1717 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1720 assert_return(bus, -EINVAL);
1721 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1722 assert_return(m, -EINVAL);
1723 assert_return(!bus_pid_changed(bus), -ECHILD);
1725 if (!streq_ptr(m->destination, destination)) {
1730 r = sd_bus_message_set_destination(m, destination);
1735 return sd_bus_send(bus, m, cookie);
1738 static usec_t calc_elapse(uint64_t usec) {
1739 if (usec == (uint64_t) -1)
1742 return now(CLOCK_MONOTONIC) + usec;
1745 static int timeout_compare(const void *a, const void *b) {
1746 const struct reply_callback *x = a, *y = b;
1748 if (x->timeout != 0 && y->timeout == 0)
1751 if (x->timeout == 0 && y->timeout != 0)
1754 if (x->timeout < y->timeout)
1757 if (x->timeout > y->timeout)
1763 _public_ int sd_bus_call_async(
1766 sd_bus_message_handler_t callback,
1771 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1772 struct reply_callback *c;
1775 assert_return(bus, -EINVAL);
1776 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1777 assert_return(m, -EINVAL);
1778 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1779 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1780 assert_return(callback, -EINVAL);
1781 assert_return(!bus_pid_changed(bus), -ECHILD);
1782 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1784 r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1788 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1792 r = bus_seal_message(bus, m, usec);
1796 r = bus_remarshal_message(bus, &m);
1800 c = new0(struct reply_callback, 1);
1804 c->callback = callback;
1805 c->userdata = userdata;
1806 c->cookie = BUS_MESSAGE_COOKIE(m);
1807 c->timeout = calc_elapse(m->timeout);
1809 r = hashmap_put(bus->reply_callbacks, &c->cookie, c);
1815 if (c->timeout != 0) {
1816 r = prioq_put(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1819 sd_bus_call_async_cancel(bus, c->cookie);
1824 r = sd_bus_send(bus, m, cookie);
1826 sd_bus_call_async_cancel(bus, c->cookie);
1833 _public_ int sd_bus_call_async_cancel(sd_bus *bus, uint64_t cookie) {
1834 struct reply_callback *c;
1836 assert_return(bus, -EINVAL);
1837 assert_return(cookie != 0, -EINVAL);
1838 assert_return(!bus_pid_changed(bus), -ECHILD);
1840 c = hashmap_remove(bus->reply_callbacks, &cookie);
1844 if (c->timeout != 0)
1845 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1851 int bus_ensure_running(sd_bus *bus) {
1856 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1858 if (bus->state == BUS_RUNNING)
1862 r = sd_bus_process(bus, NULL);
1865 if (bus->state == BUS_RUNNING)
1870 r = sd_bus_wait(bus, (uint64_t) -1);
1876 _public_ int sd_bus_call(
1880 sd_bus_error *error,
1881 sd_bus_message **reply) {
1883 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1889 assert_return(bus, -EINVAL);
1890 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1891 assert_return(m, -EINVAL);
1892 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1893 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1894 assert_return(!bus_error_is_dirty(error), -EINVAL);
1895 assert_return(!bus_pid_changed(bus), -ECHILD);
1896 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1898 r = bus_ensure_running(bus);
1902 i = bus->rqueue_size;
1904 r = bus_seal_message(bus, m, usec);
1908 r = bus_remarshal_message(bus, &m);
1912 r = bus_send_internal(bus, m, &cookie, true);
1916 timeout = calc_elapse(m->timeout);
1921 while (i < bus->rqueue_size) {
1922 sd_bus_message *incoming = NULL;
1924 incoming = bus->rqueue[i];
1926 if (incoming->reply_cookie == cookie) {
1927 /* Found a match! */
1929 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1932 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1934 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
1938 sd_bus_message_unref(incoming);
1943 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1945 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1946 r = sd_bus_error_copy(error, &incoming->error);
1950 sd_bus_message_unref(incoming);
1953 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1956 streq(bus->unique_name, incoming->sender)) {
1958 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1961 /* Our own message? Somebody is trying
1962 * to send its own client a message,
1963 * let's not dead-lock, let's fail
1966 sd_bus_message_unref(incoming);
1970 /* Try to read more, right-away */
1974 r = bus_read_message(bus, false, 0);
1976 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1977 bus_enter_closing(bus);
1989 n = now(CLOCK_MONOTONIC);
1995 left = (uint64_t) -1;
1997 r = bus_poll(bus, true, left);
2003 r = dispatch_wqueue(bus);
2005 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2006 bus_enter_closing(bus);
2015 _public_ int sd_bus_get_fd(sd_bus *bus) {
2017 assert_return(bus, -EINVAL);
2018 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2019 assert_return(!bus_pid_changed(bus), -ECHILD);
2021 return bus->input_fd;
2024 _public_ int sd_bus_get_events(sd_bus *bus) {
2027 assert_return(bus, -EINVAL);
2028 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
2029 assert_return(!bus_pid_changed(bus), -ECHILD);
2031 if (bus->state == BUS_OPENING)
2033 else if (bus->state == BUS_AUTHENTICATING) {
2035 if (bus_socket_auth_needs_write(bus))
2040 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2041 if (bus->rqueue_size <= 0)
2043 if (bus->wqueue_size > 0)
2050 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2051 struct reply_callback *c;
2053 assert_return(bus, -EINVAL);
2054 assert_return(timeout_usec, -EINVAL);
2055 assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
2056 assert_return(!bus_pid_changed(bus), -ECHILD);
2058 if (bus->track_queue) {
2063 if (bus->state == BUS_CLOSING) {
2068 if (bus->state == BUS_AUTHENTICATING) {
2069 *timeout_usec = bus->auth_timeout;
2073 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2074 *timeout_usec = (uint64_t) -1;
2078 if (bus->rqueue_size > 0) {
2083 c = prioq_peek(bus->reply_callbacks_prioq);
2085 *timeout_usec = (uint64_t) -1;
2089 *timeout_usec = c->timeout;
2093 static int process_timeout(sd_bus *bus) {
2094 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2095 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2096 struct reply_callback *c;
2102 c = prioq_peek(bus->reply_callbacks_prioq);
2106 n = now(CLOCK_MONOTONIC);
2110 r = bus_message_new_synthetic_error(
2113 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2118 m->sender = "org.freedesktop.DBus";
2120 r = bus_seal_synthetic_message(bus, m);
2124 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2125 hashmap_remove(bus->reply_callbacks, &c->cookie);
2128 bus->iteration_counter ++;
2130 r = c->callback(bus, m, c->userdata, &error_buffer);
2131 r = bus_maybe_reply_error(m, r, &error_buffer);
2134 bus->current = NULL;
2139 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2143 if (bus->state != BUS_HELLO)
2146 /* Let's make sure the first message on the bus is the HELLO
2147 * reply. But note that we don't actually parse the message
2148 * here (we leave that to the usual handling), we just verify
2149 * we don't let any earlier msg through. */
2151 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2152 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2155 if (m->reply_cookie != bus->hello_cookie)
2161 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2162 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2163 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2164 _cleanup_free_ struct reply_callback *c = NULL;
2170 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2171 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2174 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2177 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2180 c = hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2184 if (c->timeout != 0)
2185 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2187 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2189 /* If the reply contained a file descriptor which we
2190 * didn't want we pass an error instead. */
2192 r = bus_message_new_synthetic_error(
2195 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2200 r = bus_seal_synthetic_message(bus, synthetic_reply);
2204 m = synthetic_reply;
2206 r = sd_bus_message_rewind(m, true);
2211 r = c->callback(bus, m, c->userdata, &error_buffer);
2212 r = bus_maybe_reply_error(m, r, &error_buffer);
2217 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2218 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2219 struct filter_callback *l;
2226 bus->filter_callbacks_modified = false;
2228 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2230 if (bus->filter_callbacks_modified)
2233 /* Don't run this more than once per iteration */
2234 if (l->last_iteration == bus->iteration_counter)
2237 l->last_iteration = bus->iteration_counter;
2239 r = sd_bus_message_rewind(m, true);
2243 r = l->callback(bus, m, l->userdata, &error_buffer);
2244 r = bus_maybe_reply_error(m, r, &error_buffer);
2250 } while (bus->filter_callbacks_modified);
2255 static int process_match(sd_bus *bus, sd_bus_message *m) {
2262 bus->match_callbacks_modified = false;
2264 r = bus_match_run(bus, &bus->match_callbacks, m);
2268 } while (bus->match_callbacks_modified);
2273 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2274 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2280 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2283 if (bus->manual_peer_interface)
2286 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2289 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2292 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2295 if (streq_ptr(m->member, "Ping"))
2296 r = sd_bus_message_new_method_return(m, &reply);
2297 else if (streq_ptr(m->member, "GetMachineId")) {
2301 r = sd_id128_get_machine(&id);
2305 r = sd_bus_message_new_method_return(m, &reply);
2309 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2311 r = sd_bus_message_new_method_errorf(
2313 SD_BUS_ERROR_UNKNOWN_METHOD,
2314 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2320 r = sd_bus_send(bus, reply, NULL);
2327 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2331 /* If we got a message with a file descriptor which we didn't
2332 * want to accept, then let's drop it. How can this even
2333 * happen? For example, when the kernel queues a message into
2334 * an activatable names's queue which allows fds, and then is
2335 * delivered to us later even though we ourselves did not
2338 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2344 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2347 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2348 return 1; /* just eat it up */
2350 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2353 static int process_message(sd_bus *bus, sd_bus_message *m) {
2360 bus->iteration_counter++;
2362 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
2363 bus_message_type_to_string(m->header->type),
2364 strna(sd_bus_message_get_sender(m)),
2365 strna(sd_bus_message_get_destination(m)),
2366 strna(sd_bus_message_get_path(m)),
2367 strna(sd_bus_message_get_interface(m)),
2368 strna(sd_bus_message_get_member(m)),
2369 BUS_MESSAGE_COOKIE(m),
2371 strna(m->error.message));
2373 r = process_hello(bus, m);
2377 r = process_reply(bus, m);
2381 r = process_fd_check(bus, m);
2385 r = process_filter(bus, m);
2389 r = process_match(bus, m);
2393 r = process_builtin(bus, m);
2397 r = bus_process_object(bus, m);
2400 bus->current = NULL;
2404 static int dispatch_track(sd_bus *bus) {
2407 if (!bus->track_queue)
2410 bus_track_dispatch(bus->track_queue);
2414 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2415 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2419 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2421 r = process_timeout(bus);
2425 r = dispatch_wqueue(bus);
2429 r = dispatch_track(bus);
2433 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2439 r = process_message(bus, m);
2444 r = sd_bus_message_rewind(m, true);
2453 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2455 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2456 strna(sd_bus_message_get_sender(m)),
2457 strna(sd_bus_message_get_path(m)),
2458 strna(sd_bus_message_get_interface(m)),
2459 strna(sd_bus_message_get_member(m)));
2461 r = sd_bus_reply_method_errorf(
2463 SD_BUS_ERROR_UNKNOWN_OBJECT,
2464 "Unknown object '%s'.", m->path);
2478 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2479 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2480 struct reply_callback *c;
2484 assert(bus->state == BUS_CLOSING);
2486 c = hashmap_first(bus->reply_callbacks);
2488 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2490 /* First, fail all outstanding method calls */
2491 r = bus_message_new_synthetic_error(
2494 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2499 r = bus_seal_synthetic_message(bus, m);
2503 if (c->timeout != 0)
2504 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2506 hashmap_remove(bus->reply_callbacks, &c->cookie);
2509 bus->iteration_counter++;
2511 r = c->callback(bus, m, c->userdata, &error_buffer);
2512 r = bus_maybe_reply_error(m, r, &error_buffer);
2518 /* Then, synthesize a Disconnected message */
2519 r = sd_bus_message_new_signal(
2522 "/org/freedesktop/DBus/Local",
2523 "org.freedesktop.DBus.Local",
2528 m->sender = "org.freedesktop.DBus.Local";
2530 r = bus_seal_synthetic_message(bus, m);
2537 bus->iteration_counter++;
2539 r = process_filter(bus, m);
2543 r = process_match(bus, m);
2555 bus->current = NULL;
2559 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2560 BUS_DONT_DESTROY(bus);
2563 /* Returns 0 when we didn't do anything. This should cause the
2564 * caller to invoke sd_bus_wait() before returning the next
2565 * time. Returns > 0 when we did something, which possibly
2566 * means *ret is filled in with an unprocessed message. */
2568 assert_return(bus, -EINVAL);
2569 assert_return(!bus_pid_changed(bus), -ECHILD);
2571 /* We don't allow recursively invoking sd_bus_process(). */
2572 assert_return(!bus->current, -EBUSY);
2574 switch (bus->state) {
2583 r = bus_socket_process_opening(bus);
2584 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2585 bus_enter_closing(bus);
2593 case BUS_AUTHENTICATING:
2594 r = bus_socket_process_authenticating(bus);
2595 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2596 bus_enter_closing(bus);
2608 r = process_running(bus, hint_priority, priority, ret);
2609 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2610 bus_enter_closing(bus);
2620 return process_closing(bus, ret);
2623 assert_not_reached("Unknown state");
2626 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2627 return bus_process_internal(bus, false, 0, ret);
2630 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2631 return bus_process_internal(bus, true, priority, ret);
2634 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2635 struct pollfd p[2] = {};
2638 usec_t m = (usec_t) -1;
2642 if (bus->state == BUS_CLOSING)
2645 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2647 e = sd_bus_get_events(bus);
2652 /* The caller really needs some more data, he doesn't
2653 * care about what's already read, or any timeouts
2658 /* The caller wants to process if there's something to
2659 * process, but doesn't care otherwise */
2661 r = sd_bus_get_timeout(bus, &until);
2666 nw = now(CLOCK_MONOTONIC);
2667 m = until > nw ? until - nw : 0;
2671 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2674 p[0].fd = bus->input_fd;
2675 if (bus->output_fd == bus->input_fd) {
2679 p[0].events = e & POLLIN;
2680 p[1].fd = bus->output_fd;
2681 p[1].events = e & POLLOUT;
2685 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2689 return r > 0 ? 1 : 0;
2692 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2694 assert_return(bus, -EINVAL);
2695 assert_return(!bus_pid_changed(bus), -ECHILD);
2697 if (bus->state == BUS_CLOSING)
2700 assert_return(BUS_IS_OPEN(bus->state) , -ENOTCONN);
2702 if (bus->rqueue_size > 0)
2705 return bus_poll(bus, false, timeout_usec);
2708 _public_ int sd_bus_flush(sd_bus *bus) {
2711 assert_return(bus, -EINVAL);
2712 assert_return(!bus_pid_changed(bus), -ECHILD);
2714 if (bus->state == BUS_CLOSING)
2717 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2719 r = bus_ensure_running(bus);
2723 if (bus->wqueue_size <= 0)
2727 r = dispatch_wqueue(bus);
2729 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2730 bus_enter_closing(bus);
2737 if (bus->wqueue_size <= 0)
2740 r = bus_poll(bus, false, (uint64_t) -1);
2746 _public_ int sd_bus_add_filter(sd_bus *bus,
2747 sd_bus_message_handler_t callback,
2750 struct filter_callback *f;
2752 assert_return(bus, -EINVAL);
2753 assert_return(callback, -EINVAL);
2754 assert_return(!bus_pid_changed(bus), -ECHILD);
2756 f = new0(struct filter_callback, 1);
2759 f->callback = callback;
2760 f->userdata = userdata;
2762 bus->filter_callbacks_modified = true;
2763 LIST_PREPEND(callbacks, bus->filter_callbacks, f);
2767 _public_ int sd_bus_remove_filter(sd_bus *bus,
2768 sd_bus_message_handler_t callback,
2771 struct filter_callback *f;
2773 assert_return(bus, -EINVAL);
2774 assert_return(callback, -EINVAL);
2775 assert_return(!bus_pid_changed(bus), -ECHILD);
2777 LIST_FOREACH(callbacks, f, bus->filter_callbacks) {
2778 if (f->callback == callback && f->userdata == userdata) {
2779 bus->filter_callbacks_modified = true;
2780 LIST_REMOVE(callbacks, bus->filter_callbacks, f);
2789 _public_ int sd_bus_add_match(sd_bus *bus,
2791 sd_bus_message_handler_t callback,
2794 struct bus_match_component *components = NULL;
2795 unsigned n_components = 0;
2796 uint64_t cookie = 0;
2799 assert_return(bus, -EINVAL);
2800 assert_return(match, -EINVAL);
2801 assert_return(!bus_pid_changed(bus), -ECHILD);
2803 r = bus_match_parse(match, &components, &n_components);
2807 if (bus->bus_client) {
2808 cookie = ++bus->match_cookie;
2810 r = bus_add_match_internal(bus, match, components, n_components, cookie);
2815 bus->match_callbacks_modified = true;
2816 r = bus_match_add(&bus->match_callbacks, components, n_components, callback, userdata, cookie, NULL);
2818 if (bus->bus_client)
2819 bus_remove_match_internal(bus, match, cookie);
2823 bus_match_parse_free(components, n_components);
2827 _public_ int sd_bus_remove_match(sd_bus *bus,
2829 sd_bus_message_handler_t callback,
2832 struct bus_match_component *components = NULL;
2833 unsigned n_components = 0;
2835 uint64_t cookie = 0;
2837 assert_return(bus, -EINVAL);
2838 assert_return(match, -EINVAL);
2839 assert_return(!bus_pid_changed(bus), -ECHILD);
2841 r = bus_match_parse(match, &components, &n_components);
2845 bus->match_callbacks_modified = true;
2846 r = bus_match_remove(&bus->match_callbacks, components, n_components, callback, userdata, &cookie);
2848 if (bus->bus_client)
2849 q = bus_remove_match_internal(bus, match, cookie);
2851 bus_match_parse_free(components, n_components);
2853 return r < 0 ? r : q;
2856 bool bus_pid_changed(sd_bus *bus) {
2859 /* We don't support people creating a bus connection and
2860 * keeping it around over a fork(). Let's complain. */
2862 return bus->original_pid != getpid();
2865 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2866 sd_bus *bus = userdata;
2871 r = sd_bus_process(bus, NULL);
2878 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2879 sd_bus *bus = userdata;
2884 r = sd_bus_process(bus, NULL);
2891 static int prepare_callback(sd_event_source *s, void *userdata) {
2892 sd_bus *bus = userdata;
2899 e = sd_bus_get_events(bus);
2903 if (bus->output_fd != bus->input_fd) {
2905 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2909 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2913 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2918 r = sd_bus_get_timeout(bus, &until);
2924 j = sd_event_source_set_time(bus->time_event_source, until);
2929 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2936 static int quit_callback(sd_event_source *event, void *userdata) {
2937 sd_bus *bus = userdata;
2946 static int attach_io_events(sd_bus *bus) {
2951 if (bus->input_fd < 0)
2957 if (!bus->input_io_event_source) {
2958 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
2962 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2966 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
2968 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
2973 if (bus->output_fd != bus->input_fd) {
2974 assert(bus->output_fd >= 0);
2976 if (!bus->output_io_event_source) {
2977 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
2981 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
2983 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
2992 static void detach_io_events(sd_bus *bus) {
2995 if (bus->input_io_event_source) {
2996 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
2997 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3000 if (bus->output_io_event_source) {
3001 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3002 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3006 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3009 assert_return(bus, -EINVAL);
3010 assert_return(!bus->event, -EBUSY);
3012 assert(!bus->input_io_event_source);
3013 assert(!bus->output_io_event_source);
3014 assert(!bus->time_event_source);
3017 bus->event = sd_event_ref(event);
3019 r = sd_event_default(&bus->event);
3024 bus->event_priority = priority;
3026 r = sd_event_add_monotonic(bus->event, &bus->time_event_source, 0, 0, time_callback, bus);
3030 r = sd_event_source_set_priority(bus->time_event_source, priority);
3034 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3038 r = attach_io_events(bus);
3045 sd_bus_detach_event(bus);
3049 _public_ int sd_bus_detach_event(sd_bus *bus) {
3050 assert_return(bus, -EINVAL);
3055 detach_io_events(bus);
3057 if (bus->time_event_source) {
3058 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3059 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3062 if (bus->quit_event_source) {
3063 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3064 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3068 bus->event = sd_event_unref(bus->event);
3073 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3074 assert_return(bus, NULL);
3079 _public_ sd_bus_message* sd_bus_get_current(sd_bus *bus) {
3080 assert_return(bus, NULL);
3082 return bus->current;
3085 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3090 assert(default_bus);
3093 return !!*default_bus;
3096 *ret = sd_bus_ref(*default_bus);
3104 b->default_bus_ptr = default_bus;
3112 _public_ int sd_bus_default_system(sd_bus **ret) {
3113 static thread_local sd_bus *default_system_bus = NULL;
3115 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3118 _public_ int sd_bus_default_user(sd_bus **ret) {
3119 static thread_local sd_bus *default_user_bus = NULL;
3121 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3124 _public_ int sd_bus_default(sd_bus **ret) {
3128 /* Let's try our best to reuse another cached connection. If
3129 * the starter bus type is set, connect via our normal
3130 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3131 * we can share the connection with the user/system default
3134 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3136 if (streq(e, "system"))
3137 return sd_bus_default_system(ret);
3138 else if (STR_IN_SET(e, "user", "session"))
3139 return sd_bus_default_user(ret);
3142 /* No type is specified, so we have not other option than to
3143 * use the starter address if it is set. */
3145 e = secure_getenv("DBUS_STARTER_ADDRESS");
3147 static thread_local sd_bus *default_starter_bus = NULL;
3149 return bus_default(sd_bus_open, &default_starter_bus, ret);
3152 /* Finally, if nothing is set use the cached connection for
3153 * the right scope */
3155 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3156 return sd_bus_default_user(ret);
3158 return sd_bus_default_system(ret);
3161 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3162 assert_return(b, -EINVAL);
3163 assert_return(tid, -EINVAL);
3164 assert_return(!bus_pid_changed(b), -ECHILD);
3172 return sd_event_get_tid(b->event, tid);
3177 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3178 _cleanup_free_ char *e = NULL;
3181 assert_return(object_path_is_valid(prefix), -EINVAL);
3182 assert_return(external_id, -EINVAL);
3183 assert_return(ret_path, -EINVAL);
3185 e = bus_label_escape(external_id);
3189 ret = strjoin(prefix, "/", e, NULL);
3197 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3201 assert_return(object_path_is_valid(path), -EINVAL);
3202 assert_return(object_path_is_valid(prefix), -EINVAL);
3203 assert_return(external_id, -EINVAL);
3205 e = object_path_startswith(path, prefix);
3207 *external_id = NULL;
3211 ret = bus_label_unescape(e);
3219 _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) {
3224 assert_return(bus, -EINVAL);
3225 assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
3226 assert_return(ret, -EINVAL);
3227 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
3228 assert_return(!bus_pid_changed(bus), -ECHILD);
3229 assert_return(!bus->is_kernel, -ENOTSUP);
3231 if (!bus->ucred_valid && !isempty(bus->label))
3234 c = bus_creds_new();
3238 if (bus->ucred_valid) {
3239 pid = c->pid = bus->ucred.pid;
3240 c->uid = bus->ucred.uid;
3241 c->gid = bus->ucred.gid;
3243 c->mask |= (SD_BUS_CREDS_UID | SD_BUS_CREDS_PID | SD_BUS_CREDS_GID) & mask;
3246 if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
3247 c->label = strdup(bus->label);
3249 sd_bus_creds_unref(c);
3253 c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
3256 r = bus_creds_add_more(c, mask, pid, 0);
3264 _public_ int sd_bus_try_close(sd_bus *bus) {
3267 assert_return(bus, -EINVAL);
3268 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
3269 assert_return(!bus_pid_changed(bus), -ECHILD);
3270 assert_return(bus->is_kernel, -ENOTSUP);
3272 if (bus->rqueue_size > 0)
3275 if (bus->wqueue_size > 0)
3278 r = bus_kernel_try_close(bus);
3286 _public_ int sd_bus_get_name(sd_bus *bus, const char **name) {
3287 assert_return(bus, -EINVAL);
3288 assert_return(name, -EINVAL);
3289 assert_return(!bus_pid_changed(bus), -ECHILD);
3291 *name = bus->connection_name;