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