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/>.
39 #include "bus-internal.h"
40 #include "bus-message.h"
42 #include "bus-socket.h"
43 #include "bus-kernel.h"
44 #include "bus-control.h"
45 #include "bus-introspect.h"
46 #include "bus-signature.h"
47 #include "bus-objects.h"
49 #include "bus-container.h"
51 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
53 static void bus_close_fds(sd_bus *b) {
57 close_nointr_nofail(b->input_fd);
59 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
60 close_nointr_nofail(b->output_fd);
62 b->input_fd = b->output_fd = -1;
65 static void bus_node_destroy(sd_bus *b, struct node *n) {
66 struct node_callback *c;
67 struct node_vtable *v;
68 struct node_enumerator *e;
76 bus_node_destroy(b, n->child);
78 while ((c = n->callbacks)) {
79 LIST_REMOVE(callbacks, n->callbacks, c);
83 while ((v = n->vtables)) {
84 LIST_REMOVE(vtables, n->vtables, v);
89 while ((e = n->enumerators)) {
90 LIST_REMOVE(enumerators, n->enumerators, e);
95 LIST_REMOVE(siblings, n->parent->child, n);
97 assert_se(hashmap_remove(b->nodes, n->path) == n);
102 static void bus_free(sd_bus *b) {
103 struct filter_callback *f;
109 sd_bus_detach_event(b);
114 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
117 free(b->unique_name);
118 free(b->auth_buffer);
124 strv_free(b->exec_argv);
126 close_many(b->fds, b->n_fds);
129 for (i = 0; i < b->rqueue_size; i++)
130 sd_bus_message_unref(b->rqueue[i]);
133 for (i = 0; i < b->wqueue_size; i++)
134 sd_bus_message_unref(b->wqueue[i]);
137 hashmap_free_free(b->reply_callbacks);
138 prioq_free(b->reply_callbacks_prioq);
140 while ((f = b->filter_callbacks)) {
141 LIST_REMOVE(callbacks, b->filter_callbacks, f);
145 bus_match_free(&b->match_callbacks);
147 hashmap_free_free(b->vtable_methods);
148 hashmap_free_free(b->vtable_properties);
150 while ((n = hashmap_first(b->nodes)))
151 bus_node_destroy(b, n);
153 hashmap_free(b->nodes);
155 bus_kernel_flush_memfd(b);
157 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
162 _public_ int sd_bus_new(sd_bus **ret) {
165 assert_return(ret, -EINVAL);
171 r->n_ref = REFCNT_INIT;
172 r->input_fd = r->output_fd = -1;
173 r->message_version = 1;
174 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
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 r->wqueue = new(sd_bus_message*, 1);
191 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
194 assert_return(bus, -EINVAL);
195 assert_return(bus->state == BUS_UNSET, -EPERM);
196 assert_return(address, -EINVAL);
197 assert_return(!bus_pid_changed(bus), -ECHILD);
209 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
210 assert_return(bus, -EINVAL);
211 assert_return(bus->state == BUS_UNSET, -EPERM);
212 assert_return(input_fd >= 0, -EINVAL);
213 assert_return(output_fd >= 0, -EINVAL);
214 assert_return(!bus_pid_changed(bus), -ECHILD);
216 bus->input_fd = input_fd;
217 bus->output_fd = output_fd;
221 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
224 assert_return(bus, -EINVAL);
225 assert_return(bus->state == BUS_UNSET, -EPERM);
226 assert_return(path, -EINVAL);
227 assert_return(!strv_isempty(argv), -EINVAL);
228 assert_return(!bus_pid_changed(bus), -ECHILD);
240 free(bus->exec_path);
241 strv_free(bus->exec_argv);
249 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
250 assert_return(bus, -EINVAL);
251 assert_return(bus->state == BUS_UNSET, -EPERM);
252 assert_return(!bus_pid_changed(bus), -ECHILD);
254 bus->bus_client = !!b;
258 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
259 assert_return(bus, -EINVAL);
260 assert_return(bus->state == BUS_UNSET, -EPERM);
261 assert_return(!bus_pid_changed(bus), -ECHILD);
263 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
267 _public_ int sd_bus_negotiate_attach_timestamp(sd_bus *bus, int b) {
268 assert_return(bus, -EINVAL);
269 assert_return(bus->state == BUS_UNSET, -EPERM);
270 assert_return(!bus_pid_changed(bus), -ECHILD);
272 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_TIMESTAMP, b);
276 _public_ int sd_bus_negotiate_attach_creds(sd_bus *bus, int b) {
277 assert_return(bus, -EINVAL);
278 assert_return(bus->state == BUS_UNSET, -EPERM);
279 assert_return(!bus_pid_changed(bus), -ECHILD);
281 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_CREDS, b);
285 _public_ int sd_bus_negotiate_attach_comm(sd_bus *bus, int b) {
286 assert_return(bus, -EINVAL);
287 assert_return(bus->state == BUS_UNSET, -EPERM);
288 assert_return(!bus_pid_changed(bus), -ECHILD);
290 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_COMM, b);
294 _public_ int sd_bus_negotiate_attach_exe(sd_bus *bus, int b) {
295 assert_return(bus, -EINVAL);
296 assert_return(bus->state == BUS_UNSET, -EPERM);
297 assert_return(!bus_pid_changed(bus), -ECHILD);
299 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_EXE, b);
303 _public_ int sd_bus_negotiate_attach_cmdline(sd_bus *bus, int b) {
304 assert_return(bus, -EINVAL);
305 assert_return(bus->state == BUS_UNSET, -EPERM);
306 assert_return(!bus_pid_changed(bus), -ECHILD);
308 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_CMDLINE, b);
312 _public_ int sd_bus_negotiate_attach_cgroup(sd_bus *bus, int b) {
313 assert_return(bus, -EINVAL);
314 assert_return(bus->state == BUS_UNSET, -EPERM);
315 assert_return(!bus_pid_changed(bus), -ECHILD);
317 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_CGROUP, b);
321 _public_ int sd_bus_negotiate_attach_caps(sd_bus *bus, int b) {
322 assert_return(bus, -EINVAL);
323 assert_return(bus->state == BUS_UNSET, -EPERM);
324 assert_return(!bus_pid_changed(bus), -ECHILD);
326 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_CAPS, b);
330 _public_ int sd_bus_negotiate_attach_selinux_context(sd_bus *bus, int b) {
331 assert_return(bus, -EINVAL);
332 assert_return(bus->state == BUS_UNSET, -EPERM);
333 assert_return(!bus_pid_changed(bus), -ECHILD);
335 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_SECLABEL, b);
339 _public_ int sd_bus_negotiate_attach_audit(sd_bus *bus, int b) {
340 assert_return(bus, -EINVAL);
341 assert_return(bus->state == BUS_UNSET, -EPERM);
342 assert_return(!bus_pid_changed(bus), -ECHILD);
344 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ATTACH_AUDIT, b);
348 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
349 assert_return(bus, -EINVAL);
350 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
351 assert_return(bus->state == BUS_UNSET, -EPERM);
352 assert_return(!bus_pid_changed(bus), -ECHILD);
354 bus->is_server = !!b;
355 bus->server_id = server_id;
359 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
360 assert_return(bus, -EINVAL);
361 assert_return(bus->state == BUS_UNSET, -EPERM);
362 assert_return(!bus_pid_changed(bus), -ECHILD);
364 bus->anonymous_auth = !!b;
368 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata) {
373 assert(bus->state == BUS_HELLO);
376 r = sd_bus_message_get_errno(reply);
382 r = sd_bus_message_read(reply, "s", &s);
386 if (!service_name_is_valid(s) || s[0] != ':')
389 bus->unique_name = strdup(s);
390 if (!bus->unique_name)
393 bus->state = BUS_RUNNING;
398 static int bus_send_hello(sd_bus *bus) {
399 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
404 if (!bus->bus_client || bus->is_kernel)
407 r = sd_bus_message_new_method_call(
409 "org.freedesktop.DBus",
411 "org.freedesktop.DBus",
417 return sd_bus_call_async(bus, m, hello_callback, NULL, 0, &bus->hello_serial);
420 int bus_start_running(sd_bus *bus) {
423 if (bus->bus_client && !bus->is_kernel) {
424 bus->state = BUS_HELLO;
428 bus->state = BUS_RUNNING;
432 static int parse_address_key(const char **p, const char *key, char **value) {
443 if (strncmp(*p, key, l) != 0)
456 while (*a != ';' && *a != ',' && *a != 0) {
474 c = (char) ((x << 4) | y);
481 t = realloc(r, n + 2);
509 static void skip_address_key(const char **p) {
513 *p += strcspn(*p, ",");
519 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
520 _cleanup_free_ char *path = NULL, *abstract = NULL;
529 while (**p != 0 && **p != ';') {
530 r = parse_address_key(p, "guid", guid);
536 r = parse_address_key(p, "path", &path);
542 r = parse_address_key(p, "abstract", &abstract);
551 if (!path && !abstract)
554 if (path && abstract)
559 if (l > sizeof(b->sockaddr.un.sun_path))
562 b->sockaddr.un.sun_family = AF_UNIX;
563 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
564 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
565 } else if (abstract) {
566 l = strlen(abstract);
567 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
570 b->sockaddr.un.sun_family = AF_UNIX;
571 b->sockaddr.un.sun_path[0] = 0;
572 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
573 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
579 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
580 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
582 struct addrinfo *result, hints = {
583 .ai_socktype = SOCK_STREAM,
584 .ai_flags = AI_ADDRCONFIG,
592 while (**p != 0 && **p != ';') {
593 r = parse_address_key(p, "guid", guid);
599 r = parse_address_key(p, "host", &host);
605 r = parse_address_key(p, "port", &port);
611 r = parse_address_key(p, "family", &family);
624 if (streq(family, "ipv4"))
625 hints.ai_family = AF_INET;
626 else if (streq(family, "ipv6"))
627 hints.ai_family = AF_INET6;
632 r = getaddrinfo(host, port, &hints, &result);
636 return -EADDRNOTAVAIL;
638 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
639 b->sockaddr_size = result->ai_addrlen;
641 freeaddrinfo(result);
646 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
648 unsigned n_argv = 0, j;
657 while (**p != 0 && **p != ';') {
658 r = parse_address_key(p, "guid", guid);
664 r = parse_address_key(p, "path", &path);
670 if (startswith(*p, "argv")) {
674 ul = strtoul(*p + 4, (char**) p, 10);
675 if (errno > 0 || **p != '=' || ul > 256) {
685 x = realloc(argv, sizeof(char*) * (ul + 2));
691 memset(x + n_argv, 0, sizeof(char*) * (ul - n_argv + 2));
697 r = parse_address_key(p, NULL, argv + ul);
712 /* Make sure there are no holes in the array, with the
713 * exception of argv[0] */
714 for (j = 1; j < n_argv; j++)
720 if (argv && argv[0] == NULL) {
721 argv[0] = strdup(path);
733 for (j = 0; j < n_argv; j++)
741 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
742 _cleanup_free_ char *path = NULL;
750 while (**p != 0 && **p != ';') {
751 r = parse_address_key(p, "guid", guid);
757 r = parse_address_key(p, "path", &path);
776 static int parse_container_address(sd_bus *b, const char **p, char **guid) {
777 _cleanup_free_ char *machine = NULL;
785 while (**p != 0 && **p != ';') {
786 r = parse_address_key(p, "guid", guid);
792 r = parse_address_key(p, "machine", &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) + sizeof("/var/run/dbus/system_bus_socket") - 1;
815 static void bus_reset_parsed_address(sd_bus *b) {
819 b->sockaddr_size = 0;
820 strv_free(b->exec_argv);
824 b->server_id = SD_ID128_NULL;
831 static int bus_parse_next_address(sd_bus *b) {
832 _cleanup_free_ char *guid = NULL;
840 if (b->address[b->address_index] == 0)
843 bus_reset_parsed_address(b);
845 a = b->address + b->address_index;
854 if (startswith(a, "unix:")) {
857 r = parse_unix_address(b, &a, &guid);
862 } else if (startswith(a, "tcp:")) {
865 r = parse_tcp_address(b, &a, &guid);
871 } else if (startswith(a, "unixexec:")) {
874 r = parse_exec_address(b, &a, &guid);
880 } else if (startswith(a, "kernel:")) {
883 r = parse_kernel_address(b, &a, &guid);
888 } else if (startswith(a, "x-container:")) {
891 r = parse_container_address(b, &a, &guid);
904 r = sd_id128_from_string(guid, &b->server_id);
909 b->address_index = a - b->address;
913 static int bus_start_address(sd_bus *b) {
923 r = bus_socket_exec(b);
927 b->last_connect_error = -r;
928 } else if (b->kernel) {
930 r = bus_kernel_connect(b);
934 b->last_connect_error = -r;
936 } else if (b->machine) {
938 r = bus_container_connect(b);
942 b->last_connect_error = -r;
944 } else if (b->sockaddr.sa.sa_family != AF_UNSPEC) {
946 r = bus_socket_connect(b);
950 b->last_connect_error = -r;
953 r = bus_parse_next_address(b);
957 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
961 int bus_next_address(sd_bus *b) {
964 bus_reset_parsed_address(b);
965 return bus_start_address(b);
968 static int bus_start_fd(sd_bus *b) {
973 assert(b->input_fd >= 0);
974 assert(b->output_fd >= 0);
976 r = fd_nonblock(b->input_fd, true);
980 r = fd_cloexec(b->input_fd, true);
984 if (b->input_fd != b->output_fd) {
985 r = fd_nonblock(b->output_fd, true);
989 r = fd_cloexec(b->output_fd, true);
994 if (fstat(b->input_fd, &st) < 0)
997 if (S_ISCHR(b->input_fd))
998 return bus_kernel_take_fd(b);
1000 return bus_socket_take_fd(b);
1003 _public_ int sd_bus_start(sd_bus *bus) {
1006 assert_return(bus, -EINVAL);
1007 assert_return(bus->state == BUS_UNSET, -EPERM);
1008 assert_return(!bus_pid_changed(bus), -ECHILD);
1010 bus->state = BUS_OPENING;
1012 if (bus->is_server && bus->bus_client)
1015 if (bus->input_fd >= 0)
1016 r = bus_start_fd(bus);
1017 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1018 r = bus_start_address(bus);
1025 return bus_send_hello(bus);
1028 _public_ int sd_bus_open_system(sd_bus **ret) {
1033 assert_return(ret, -EINVAL);
1039 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1041 r = sd_bus_set_address(b, e);
1045 b->sockaddr.un.sun_family = AF_UNIX;
1046 strncpy(b->sockaddr.un.sun_path, "/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
1047 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + sizeof("/run/dbus/system_bus_socket") - 1;
1050 b->bus_client = true;
1052 r = sd_bus_start(b);
1064 _public_ int sd_bus_open_user(sd_bus **ret) {
1070 assert_return(ret, -EINVAL);
1076 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1078 r = sd_bus_set_address(b, e);
1082 e = secure_getenv("XDG_RUNTIME_DIR");
1089 if (l + 4 > sizeof(b->sockaddr.un.sun_path)) {
1094 b->sockaddr.un.sun_family = AF_UNIX;
1095 memcpy(mempcpy(b->sockaddr.un.sun_path, e, l), "/bus", 4);
1096 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l + 4;
1099 b->bus_client = true;
1101 r = sd_bus_start(b);
1113 _public_ int sd_bus_open_system_remote(const char *host, sd_bus **ret) {
1114 _cleanup_free_ char *e = NULL;
1119 assert_return(host, -EINVAL);
1120 assert_return(ret, -EINVAL);
1122 e = bus_address_escape(host);
1126 p = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", NULL);
1130 r = sd_bus_new(&bus);
1137 bus->bus_client = true;
1139 r = sd_bus_start(bus);
1149 _public_ int sd_bus_open_system_container(const char *machine, sd_bus **ret) {
1150 _cleanup_free_ char *e = NULL;
1155 assert_return(machine, -EINVAL);
1156 assert_return(ret, -EINVAL);
1158 e = bus_address_escape(machine);
1162 p = strjoin("x-container:machine=", e, NULL);
1166 r = sd_bus_new(&bus);
1173 bus->bus_client = true;
1175 r = sd_bus_start(bus);
1185 _public_ void sd_bus_close(sd_bus *bus) {
1188 if (bus->state == BUS_CLOSED)
1190 if (bus_pid_changed(bus))
1193 bus->state = BUS_CLOSED;
1195 sd_bus_detach_event(bus);
1197 if (!bus->is_kernel)
1200 /* We'll leave the fd open in case this is a kernel bus, since
1201 * there might still be memblocks around that reference this
1202 * bus, and they might need to invoke the
1203 * KDBUS_CMD_MSG_RELEASE ioctl on the fd when they are
1207 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1208 assert_return(bus, NULL);
1210 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1215 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1216 assert_return(bus, NULL);
1218 if (REFCNT_DEC(bus->n_ref) <= 0)
1224 _public_ int sd_bus_is_open(sd_bus *bus) {
1226 assert_return(bus, -EINVAL);
1227 assert_return(!bus_pid_changed(bus), -ECHILD);
1229 return BUS_IS_OPEN(bus->state);
1232 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1235 assert_return(bus, -EINVAL);
1236 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1237 assert_return(!bus_pid_changed(bus), -ECHILD);
1239 if (type == SD_BUS_TYPE_UNIX_FD) {
1240 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1243 r = bus_ensure_running(bus);
1247 return bus->can_fds;
1250 return bus_type_is_valid(type);
1253 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1256 assert_return(bus, -EINVAL);
1257 assert_return(server_id, -EINVAL);
1258 assert_return(!bus_pid_changed(bus), -ECHILD);
1260 r = bus_ensure_running(bus);
1264 *server_id = bus->server_id;
1268 static int bus_seal_message(sd_bus *b, sd_bus_message *m) {
1271 if (m->header->version > b->message_version)
1275 /* If we copy the same message to multiple
1276 * destinations, avoid using the same serial
1278 b->serial = MAX(b->serial, BUS_MESSAGE_SERIAL(m));
1282 return bus_message_seal(m, ++b->serial);
1285 static int dispatch_wqueue(sd_bus *bus) {
1289 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1291 while (bus->wqueue_size > 0) {
1294 r = bus_kernel_write_message(bus, bus->wqueue[0]);
1296 r = bus_socket_write_message(bus, bus->wqueue[0], &bus->windex);
1302 /* Didn't do anything this time */
1304 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1305 /* Fully written. Let's drop the entry from
1308 * This isn't particularly optimized, but
1309 * well, this is supposed to be our worst-case
1310 * buffer only, and the socket buffer is
1311 * supposed to be our primary buffer, and if
1312 * it got full, then all bets are off
1315 sd_bus_message_unref(bus->wqueue[0]);
1316 bus->wqueue_size --;
1317 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1327 static int dispatch_rqueue(sd_bus *bus, sd_bus_message **m) {
1328 sd_bus_message *z = NULL;
1333 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1335 if (bus->rqueue_size > 0) {
1336 /* Dispatch a queued message */
1338 *m = bus->rqueue[0];
1339 bus->rqueue_size --;
1340 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1344 /* Try to read a new message */
1347 r = bus_kernel_read_message(bus, &z);
1349 r = bus_socket_read_message(bus, &z);
1365 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *serial) {
1368 assert_return(bus, -EINVAL);
1369 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1370 assert_return(m, -EINVAL);
1371 assert_return(!bus_pid_changed(bus), -ECHILD);
1374 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1381 /* If the serial number isn't kept, then we know that no reply
1383 if (!serial && !m->sealed)
1384 m->header->flags |= SD_BUS_MESSAGE_NO_REPLY_EXPECTED;
1386 r = bus_seal_message(bus, m);
1390 /* If this is a reply and no reply was requested, then let's
1391 * suppress this, if we can */
1392 if (m->dont_send && !serial)
1395 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1399 r = bus_kernel_write_message(bus, m);
1401 r = bus_socket_write_message(bus, m, &idx);
1406 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1407 /* Wasn't fully written. So let's remember how
1408 * much was written. Note that the first entry
1409 * of the wqueue array is always allocated so
1410 * that we always can remember how much was
1412 bus->wqueue[0] = sd_bus_message_ref(m);
1413 bus->wqueue_size = 1;
1419 /* Just append it to the queue. */
1421 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1424 q = realloc(bus->wqueue, sizeof(sd_bus_message*) * (bus->wqueue_size + 1));
1429 q[bus->wqueue_size ++] = sd_bus_message_ref(m);
1433 *serial = BUS_MESSAGE_SERIAL(m);
1438 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *serial) {
1441 assert_return(bus, -EINVAL);
1442 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1443 assert_return(m, -EINVAL);
1444 assert_return(!bus_pid_changed(bus), -ECHILD);
1446 if (!streq_ptr(m->destination, destination)) {
1451 r = sd_bus_message_set_destination(m, destination);
1456 return sd_bus_send(bus, m, serial);
1459 static usec_t calc_elapse(uint64_t usec) {
1460 if (usec == (uint64_t) -1)
1464 usec = BUS_DEFAULT_TIMEOUT;
1466 return now(CLOCK_MONOTONIC) + usec;
1469 static int timeout_compare(const void *a, const void *b) {
1470 const struct reply_callback *x = a, *y = b;
1472 if (x->timeout != 0 && y->timeout == 0)
1475 if (x->timeout == 0 && y->timeout != 0)
1478 if (x->timeout < y->timeout)
1481 if (x->timeout > y->timeout)
1487 _public_ int sd_bus_call_async(
1490 sd_bus_message_handler_t callback,
1495 struct reply_callback *c;
1498 assert_return(bus, -EINVAL);
1499 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1500 assert_return(m, -EINVAL);
1501 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1502 assert_return(!(m->header->flags & SD_BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1503 assert_return(callback, -EINVAL);
1504 assert_return(!bus_pid_changed(bus), -ECHILD);
1506 r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
1510 if (usec != (uint64_t) -1) {
1511 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1516 r = bus_seal_message(bus, m);
1520 c = new0(struct reply_callback, 1);
1524 c->callback = callback;
1525 c->userdata = userdata;
1526 c->serial = BUS_MESSAGE_SERIAL(m);
1527 c->timeout = calc_elapse(usec);
1529 r = hashmap_put(bus->reply_callbacks, &c->serial, c);
1535 if (c->timeout != 0) {
1536 r = prioq_put(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1539 sd_bus_call_async_cancel(bus, c->serial);
1544 r = sd_bus_send(bus, m, serial);
1546 sd_bus_call_async_cancel(bus, c->serial);
1553 _public_ int sd_bus_call_async_cancel(sd_bus *bus, uint64_t serial) {
1554 struct reply_callback *c;
1556 assert_return(bus, -EINVAL);
1557 assert_return(serial != 0, -EINVAL);
1558 assert_return(!bus_pid_changed(bus), -ECHILD);
1560 c = hashmap_remove(bus->reply_callbacks, &serial);
1564 if (c->timeout != 0)
1565 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1571 int bus_ensure_running(sd_bus *bus) {
1576 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED)
1578 if (bus->state == BUS_RUNNING)
1582 r = sd_bus_process(bus, NULL);
1585 if (bus->state == BUS_RUNNING)
1590 r = sd_bus_wait(bus, (uint64_t) -1);
1596 _public_ int sd_bus_call(
1600 sd_bus_error *error,
1601 sd_bus_message **reply) {
1608 assert_return(bus, -EINVAL);
1609 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1610 assert_return(m, -EINVAL);
1611 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1612 assert_return(!(m->header->flags & SD_BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1613 assert_return(!bus_error_is_dirty(error), -EINVAL);
1614 assert_return(!bus_pid_changed(bus), -ECHILD);
1616 r = bus_ensure_running(bus);
1620 r = sd_bus_send(bus, m, &serial);
1624 timeout = calc_elapse(usec);
1628 sd_bus_message *incoming = NULL;
1633 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1636 /* Make sure there's room for queuing this
1637 * locally, before we read the message */
1639 q = realloc(bus->rqueue, (bus->rqueue_size + 1) * sizeof(sd_bus_message*));
1648 r = bus_kernel_read_message(bus, &incoming);
1650 r = bus_socket_read_message(bus, &incoming);
1655 if (incoming->reply_serial == serial) {
1656 /* Found a match! */
1658 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1663 sd_bus_message_unref(incoming);
1668 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
1671 r = sd_bus_error_copy(error, &incoming->error);
1673 sd_bus_message_unref(incoming);
1677 k = sd_bus_error_get_errno(&incoming->error);
1678 sd_bus_message_unref(incoming);
1682 sd_bus_message_unref(incoming);
1685 } else if (incoming->header->serial == serial &&
1688 streq(bus->unique_name, incoming->sender)) {
1690 /* Our own message? Somebody is trying
1691 * to send its own client a message,
1692 * let's not dead-lock, let's fail
1695 sd_bus_message_unref(incoming);
1699 /* There's already guaranteed to be room for
1700 * this, so need to resize things here */
1701 bus->rqueue[bus->rqueue_size ++] = incoming;
1704 /* Try to read more, right-away */
1713 n = now(CLOCK_MONOTONIC);
1719 left = (uint64_t) -1;
1721 r = bus_poll(bus, true, left);
1725 r = dispatch_wqueue(bus);
1731 _public_ int sd_bus_get_fd(sd_bus *bus) {
1733 assert_return(bus, -EINVAL);
1734 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1735 assert_return(bus->input_fd == bus->output_fd, -EPERM);
1736 assert_return(!bus_pid_changed(bus), -ECHILD);
1738 return bus->input_fd;
1741 _public_ int sd_bus_get_events(sd_bus *bus) {
1744 assert_return(bus, -EINVAL);
1745 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1746 assert_return(!bus_pid_changed(bus), -ECHILD);
1748 if (bus->state == BUS_OPENING)
1750 else if (bus->state == BUS_AUTHENTICATING) {
1752 if (bus_socket_auth_needs_write(bus))
1757 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
1758 if (bus->rqueue_size <= 0)
1760 if (bus->wqueue_size > 0)
1767 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
1768 struct reply_callback *c;
1770 assert_return(bus, -EINVAL);
1771 assert_return(timeout_usec, -EINVAL);
1772 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
1773 assert_return(!bus_pid_changed(bus), -ECHILD);
1775 if (bus->state == BUS_AUTHENTICATING) {
1776 *timeout_usec = bus->auth_timeout;
1780 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
1781 *timeout_usec = (uint64_t) -1;
1785 if (bus->rqueue_size > 0) {
1790 c = prioq_peek(bus->reply_callbacks_prioq);
1792 *timeout_usec = (uint64_t) -1;
1796 *timeout_usec = c->timeout;
1800 static int process_timeout(sd_bus *bus) {
1801 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
1802 struct reply_callback *c;
1808 c = prioq_peek(bus->reply_callbacks_prioq);
1812 n = now(CLOCK_MONOTONIC);
1816 r = bus_message_new_synthetic_error(
1819 &SD_BUS_ERROR_MAKE(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
1824 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
1825 hashmap_remove(bus->reply_callbacks, &c->serial);
1827 r = c->callback(bus, m, c->userdata);
1830 return r < 0 ? r : 1;
1833 static int process_hello(sd_bus *bus, sd_bus_message *m) {
1837 if (bus->state != BUS_HELLO)
1840 /* Let's make sure the first message on the bus is the HELLO
1841 * reply. But note that we don't actually parse the message
1842 * here (we leave that to the usual handling), we just verify
1843 * we don't let any earlier msg through. */
1845 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
1846 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
1849 if (m->reply_serial != bus->hello_serial)
1855 static int process_reply(sd_bus *bus, sd_bus_message *m) {
1856 struct reply_callback *c;
1862 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
1863 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
1866 c = hashmap_remove(bus->reply_callbacks, &m->reply_serial);
1870 if (c->timeout != 0)
1871 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
1873 r = sd_bus_message_rewind(m, true);
1877 r = c->callback(bus, m, c->userdata);
1883 static int process_filter(sd_bus *bus, sd_bus_message *m) {
1884 struct filter_callback *l;
1891 bus->filter_callbacks_modified = false;
1893 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
1895 if (bus->filter_callbacks_modified)
1898 /* Don't run this more than once per iteration */
1899 if (l->last_iteration == bus->iteration_counter)
1902 l->last_iteration = bus->iteration_counter;
1904 r = sd_bus_message_rewind(m, true);
1908 r = l->callback(bus, m, l->userdata);
1914 } while (bus->filter_callbacks_modified);
1919 static int process_match(sd_bus *bus, sd_bus_message *m) {
1926 bus->match_callbacks_modified = false;
1928 r = bus_match_run(bus, &bus->match_callbacks, m);
1932 } while (bus->match_callbacks_modified);
1937 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
1938 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
1944 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
1947 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
1950 if (m->header->flags & SD_BUS_MESSAGE_NO_REPLY_EXPECTED)
1953 if (streq_ptr(m->member, "Ping"))
1954 r = sd_bus_message_new_method_return(bus, m, &reply);
1955 else if (streq_ptr(m->member, "GetMachineId")) {
1959 r = sd_id128_get_machine(&id);
1963 r = sd_bus_message_new_method_return(bus, m, &reply);
1967 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
1969 r = sd_bus_message_new_method_errorf(
1971 SD_BUS_ERROR_UNKNOWN_METHOD,
1972 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
1978 r = sd_bus_send(bus, reply, NULL);
1985 static int process_message(sd_bus *bus, sd_bus_message *m) {
1992 bus->iteration_counter++;
1994 log_debug("Got message sender=%s object=%s interface=%s member=%s",
1995 strna(sd_bus_message_get_sender(m)),
1996 strna(sd_bus_message_get_path(m)),
1997 strna(sd_bus_message_get_interface(m)),
1998 strna(sd_bus_message_get_member(m)));
2000 r = process_hello(bus, m);
2004 r = process_reply(bus, m);
2008 r = process_filter(bus, m);
2012 r = process_match(bus, m);
2016 r = process_builtin(bus, m);
2020 r = bus_process_object(bus, m);
2023 bus->current = NULL;
2027 static int process_running(sd_bus *bus, sd_bus_message **ret) {
2028 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2032 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2034 r = process_timeout(bus);
2038 r = dispatch_wqueue(bus);
2042 r = dispatch_rqueue(bus, &m);
2048 r = process_message(bus, m);
2053 r = sd_bus_message_rewind(m, true);
2062 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2064 r = sd_bus_reply_method_errorf(
2066 SD_BUS_ERROR_UNKNOWN_OBJECT,
2067 "Unknown object '%s'.", m->path);
2081 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2082 BUS_DONT_DESTROY(bus);
2085 /* Returns 0 when we didn't do anything. This should cause the
2086 * caller to invoke sd_bus_wait() before returning the next
2087 * time. Returns > 0 when we did something, which possibly
2088 * means *ret is filled in with an unprocessed message. */
2090 assert_return(bus, -EINVAL);
2091 assert_return(!bus_pid_changed(bus), -ECHILD);
2093 /* We don't allow recursively invoking sd_bus_process(). */
2094 assert_return(!bus->processing, -EBUSY);
2096 switch (bus->state) {
2103 r = bus_socket_process_opening(bus);
2110 case BUS_AUTHENTICATING:
2112 r = bus_socket_process_authenticating(bus);
2122 bus->processing = true;
2123 r = process_running(bus, ret);
2124 bus->processing = false;
2129 assert_not_reached("Unknown state");
2132 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2133 struct pollfd p[2] = {};
2136 usec_t m = (usec_t) -1;
2139 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2141 e = sd_bus_get_events(bus);
2146 /* The caller really needs some more data, he doesn't
2147 * care about what's already read, or any timeouts
2152 /* The caller wants to process if there's something to
2153 * process, but doesn't care otherwise */
2155 r = sd_bus_get_timeout(bus, &until);
2160 nw = now(CLOCK_MONOTONIC);
2161 m = until > nw ? until - nw : 0;
2165 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2168 p[0].fd = bus->input_fd;
2169 if (bus->output_fd == bus->input_fd) {
2173 p[0].events = e & POLLIN;
2174 p[1].fd = bus->output_fd;
2175 p[1].events = e & POLLOUT;
2179 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2183 return r > 0 ? 1 : 0;
2186 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2188 assert_return(bus, -EINVAL);
2189 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2190 assert_return(!bus_pid_changed(bus), -ECHILD);
2192 if (bus->rqueue_size > 0)
2195 return bus_poll(bus, false, timeout_usec);
2198 _public_ int sd_bus_flush(sd_bus *bus) {
2201 assert_return(bus, -EINVAL);
2202 assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
2203 assert_return(!bus_pid_changed(bus), -ECHILD);
2205 r = bus_ensure_running(bus);
2209 if (bus->wqueue_size <= 0)
2213 r = dispatch_wqueue(bus);
2217 if (bus->wqueue_size <= 0)
2220 r = bus_poll(bus, false, (uint64_t) -1);
2226 _public_ int sd_bus_add_filter(sd_bus *bus,
2227 sd_bus_message_handler_t callback,
2230 struct filter_callback *f;
2232 assert_return(bus, -EINVAL);
2233 assert_return(callback, -EINVAL);
2234 assert_return(!bus_pid_changed(bus), -ECHILD);
2236 f = new0(struct filter_callback, 1);
2239 f->callback = callback;
2240 f->userdata = userdata;
2242 bus->filter_callbacks_modified = true;
2243 LIST_PREPEND(callbacks, bus->filter_callbacks, f);
2247 _public_ int sd_bus_remove_filter(sd_bus *bus,
2248 sd_bus_message_handler_t callback,
2251 struct filter_callback *f;
2253 assert_return(bus, -EINVAL);
2254 assert_return(callback, -EINVAL);
2255 assert_return(!bus_pid_changed(bus), -ECHILD);
2257 LIST_FOREACH(callbacks, f, bus->filter_callbacks) {
2258 if (f->callback == callback && f->userdata == userdata) {
2259 bus->filter_callbacks_modified = true;
2260 LIST_REMOVE(callbacks, bus->filter_callbacks, f);
2269 _public_ int sd_bus_add_match(sd_bus *bus,
2271 sd_bus_message_handler_t callback,
2274 struct bus_match_component *components = NULL;
2275 unsigned n_components = 0;
2276 uint64_t cookie = 0;
2279 assert_return(bus, -EINVAL);
2280 assert_return(match, -EINVAL);
2281 assert_return(!bus_pid_changed(bus), -ECHILD);
2283 r = bus_match_parse(match, &components, &n_components);
2287 if (bus->bus_client) {
2288 cookie = ++bus->match_cookie;
2290 r = bus_add_match_internal(bus, match, components, n_components, cookie);
2295 bus->match_callbacks_modified = true;
2296 r = bus_match_add(&bus->match_callbacks, components, n_components, callback, userdata, cookie, NULL);
2298 if (bus->bus_client)
2299 bus_remove_match_internal(bus, match, cookie);
2303 bus_match_parse_free(components, n_components);
2307 _public_ int sd_bus_remove_match(sd_bus *bus,
2309 sd_bus_message_handler_t callback,
2312 struct bus_match_component *components = NULL;
2313 unsigned n_components = 0;
2315 uint64_t cookie = 0;
2317 assert_return(bus, -EINVAL);
2318 assert_return(match, -EINVAL);
2319 assert_return(!bus_pid_changed(bus), -ECHILD);
2321 r = bus_match_parse(match, &components, &n_components);
2325 bus->match_callbacks_modified = true;
2326 r = bus_match_remove(&bus->match_callbacks, components, n_components, callback, userdata, &cookie);
2328 if (bus->bus_client)
2329 q = bus_remove_match_internal(bus, match, cookie);
2331 bus_match_parse_free(components, n_components);
2333 return r < 0 ? r : q;
2336 bool bus_pid_changed(sd_bus *bus) {
2339 /* We don't support people creating a bus connection and
2340 * keeping it around over a fork(). Let's complain. */
2342 return bus->original_pid != getpid();
2345 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2346 sd_bus *bus = userdata;
2351 r = sd_bus_process(bus, NULL);
2358 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2359 sd_bus *bus = userdata;
2364 r = sd_bus_process(bus, NULL);
2371 static int prepare_callback(sd_event_source *s, void *userdata) {
2372 sd_bus *bus = userdata;
2379 e = sd_bus_get_events(bus);
2383 if (bus->output_fd != bus->input_fd) {
2385 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2389 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2393 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2398 r = sd_bus_get_timeout(bus, &until);
2404 j = sd_event_source_set_time(bus->time_event_source, until);
2409 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2416 static int quit_callback(sd_event_source *event, void *userdata) {
2417 sd_bus *bus = userdata;
2426 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
2429 assert_return(bus, -EINVAL);
2430 assert_return(!bus->event, -EBUSY);
2432 assert(!bus->input_io_event_source);
2433 assert(!bus->output_io_event_source);
2434 assert(!bus->time_event_source);
2437 bus->event = sd_event_ref(event);
2439 r = sd_event_default(&bus->event);
2444 r = sd_event_add_io(bus->event, bus->input_fd, 0, io_callback, bus, &bus->input_io_event_source);
2448 r = sd_event_source_set_priority(bus->input_io_event_source, priority);
2452 if (bus->output_fd != bus->input_fd) {
2453 r = sd_event_add_io(bus->event, bus->output_fd, 0, io_callback, bus, &bus->output_io_event_source);
2457 r = sd_event_source_set_priority(bus->output_io_event_source, priority);
2462 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
2466 r = sd_event_add_monotonic(bus->event, 0, 0, time_callback, bus, &bus->time_event_source);
2470 r = sd_event_source_set_priority(bus->time_event_source, priority);
2474 r = sd_event_add_quit(bus->event, quit_callback, bus, &bus->quit_event_source);
2481 sd_bus_detach_event(bus);
2485 _public_ int sd_bus_detach_event(sd_bus *bus) {
2486 assert_return(bus, -EINVAL);
2487 assert_return(bus->event, -ENXIO);
2489 if (bus->input_io_event_source)
2490 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
2492 if (bus->output_io_event_source)
2493 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
2495 if (bus->time_event_source)
2496 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
2498 if (bus->quit_event_source)
2499 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
2502 bus->event = sd_event_unref(bus->event);
2507 _public_ sd_bus_message* sd_bus_get_current(sd_bus *bus) {
2508 assert_return(bus, NULL);
2510 return bus->current;
2513 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
2518 assert(default_bus);
2521 return !!*default_bus;
2524 *ret = sd_bus_ref(*default_bus);
2532 b->default_bus_ptr = default_bus;
2540 _public_ int sd_bus_default_system(sd_bus **ret) {
2541 static __thread sd_bus *default_system_bus = NULL;
2543 return bus_default(sd_bus_open_system, &default_system_bus, ret);
2546 _public_ int sd_bus_default_user(sd_bus **ret) {
2547 static __thread sd_bus *default_user_bus = NULL;
2549 return bus_default(sd_bus_open_user, &default_user_bus, ret);
2552 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
2553 assert_return(b, -EINVAL);
2554 assert_return(tid, -EINVAL);
2555 assert_return(!bus_pid_changed(b), -ECHILD);
2563 return sd_event_get_tid(b->event, tid);