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