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