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