1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #ifdef HAVE_VALGRIND_MEMCHECK_H
23 #include <valgrind/memcheck.h>
29 #include <sys/prctl.h>
31 /* When we include libgen.h because we need dirname() we immediately
32 * undefine basename() since libgen.h defines it as a macro to the POSIX
33 * version which is really broken. We prefer GNU basename(). */
37 #include "bus-bloom.h"
38 #include "bus-internal.h"
39 #include "bus-kernel.h"
40 #include "bus-label.h"
41 #include "bus-message.h"
43 #include "capability-util.h"
46 #include "formats-util.h"
47 #include "memfd-util.h"
48 #include "parse-util.h"
49 #include "string-util.h"
51 #include "user-util.h"
54 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
56 int bus_kernel_parse_unique_name(const char *s
, uint64_t *id
) {
62 if (!startswith(s
, ":1."))
65 r
= safe_atou64(s
+ 3, id
);
72 static void append_payload_vec(struct kdbus_item
**d
, const void *p
, size_t sz
) {
78 /* Note that p can be NULL, which encodes a region full of
79 * zeroes, which is useful to optimize certain padding
82 (*d
)->size
= offsetof(struct kdbus_item
, vec
) + sizeof(struct kdbus_vec
);
83 (*d
)->type
= KDBUS_ITEM_PAYLOAD_VEC
;
84 (*d
)->vec
.address
= PTR_TO_UINT64(p
);
87 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
90 static void append_payload_memfd(struct kdbus_item
**d
, int memfd
, size_t start
, size_t sz
) {
96 (*d
)->size
= offsetof(struct kdbus_item
, memfd
) + sizeof(struct kdbus_memfd
);
97 (*d
)->type
= KDBUS_ITEM_PAYLOAD_MEMFD
;
98 (*d
)->memfd
.fd
= memfd
;
99 (*d
)->memfd
.start
= start
;
100 (*d
)->memfd
.size
= sz
;
102 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
105 static void append_destination(struct kdbus_item
**d
, const char *s
, size_t length
) {
111 (*d
)->size
= offsetof(struct kdbus_item
, str
) + length
+ 1;
112 (*d
)->type
= KDBUS_ITEM_DST_NAME
;
113 memcpy((*d
)->str
, s
, length
+ 1);
115 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
118 static struct kdbus_bloom_filter
*append_bloom(struct kdbus_item
**d
, size_t length
) {
119 struct kdbus_item
*i
;
125 i
->size
= offsetof(struct kdbus_item
, bloom_filter
) +
126 offsetof(struct kdbus_bloom_filter
, data
) +
128 i
->type
= KDBUS_ITEM_BLOOM_FILTER
;
130 *d
= (struct kdbus_item
*) ((uint8_t*) i
+ i
->size
);
132 return &i
->bloom_filter
;
135 static void append_fds(struct kdbus_item
**d
, const int fds
[], unsigned n_fds
) {
141 (*d
)->size
= offsetof(struct kdbus_item
, fds
) + sizeof(int) * n_fds
;
142 (*d
)->type
= KDBUS_ITEM_FDS
;
143 memcpy((*d
)->fds
, fds
, sizeof(int) * n_fds
);
145 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
148 static void add_bloom_arg(void *data
, size_t size
, unsigned n_hash
, unsigned i
, const char *t
) {
149 char buf
[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
157 e
= stpcpy(buf
, "arg");
159 *(e
++) = '0' + (char) i
;
161 *(e
++) = '0' + (char) (i
/ 10);
162 *(e
++) = '0' + (char) (i
% 10);
166 bloom_add_pair(data
, size
, n_hash
, buf
, t
);
168 strcpy(e
, "-dot-prefix");
169 bloom_add_prefixes(data
, size
, n_hash
, buf
, t
, '.');
170 strcpy(e
, "-slash-prefix");
171 bloom_add_prefixes(data
, size
, n_hash
, buf
, t
, '/');
174 static void add_bloom_arg_has(void *data
, size_t size
, unsigned n_hash
, unsigned i
, const char *t
) {
175 char buf
[sizeof("arg")-1 + 2 + sizeof("-has")];
183 e
= stpcpy(buf
, "arg");
185 *(e
++) = '0' + (char) i
;
187 *(e
++) = '0' + (char) (i
/ 10);
188 *(e
++) = '0' + (char) (i
% 10);
192 bloom_add_pair(data
, size
, n_hash
, buf
, t
);
195 static int bus_message_setup_bloom(sd_bus_message
*m
, struct kdbus_bloom_filter
*bloom
) {
204 memzero(data
, m
->bus
->bloom_size
);
205 bloom
->generation
= 0;
207 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "message-type", bus_message_type_to_string(m
->header
->type
));
210 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "interface", m
->interface
);
212 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "member", m
->member
);
214 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path", m
->path
);
215 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path-slash-prefix", m
->path
);
216 bloom_add_prefixes(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path-slash-prefix", m
->path
, '/');
219 r
= sd_bus_message_rewind(m
, true);
223 for (i
= 0; i
< 64; i
++) {
224 const char *t
, *contents
;
227 r
= sd_bus_message_peek_type(m
, &type
, &contents
);
231 if (IN_SET(type
, SD_BUS_TYPE_STRING
, SD_BUS_TYPE_OBJECT_PATH
, SD_BUS_TYPE_SIGNATURE
)) {
233 /* The bloom filter includes simple strings of any kind */
234 r
= sd_bus_message_read_basic(m
, type
, &t
);
238 add_bloom_arg(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, i
, t
);
241 if (type
== SD_BUS_TYPE_ARRAY
&& STR_IN_SET(contents
, "s", "o", "g")) {
243 /* As well as array of simple strings of any kinds */
244 r
= sd_bus_message_enter_container(m
, type
, contents
);
248 while ((r
= sd_bus_message_read_basic(m
, contents
[0], &t
)) > 0)
249 add_bloom_arg_has(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, i
, t
);
253 r
= sd_bus_message_exit_container(m
);
258 /* Stop adding to bloom filter as soon as we
259 * run into the first argument we cannot add
267 static int bus_message_setup_kmsg(sd_bus
*b
, sd_bus_message
*m
) {
268 struct bus_body_part
*part
;
269 struct kdbus_item
*d
;
270 const char *destination
;
281 /* We put this together only once, if this message is reused
282 * we reuse the earlier-built version */
286 destination
= m
->destination
?: m
->destination_ptr
;
289 r
= bus_kernel_parse_unique_name(destination
, &unique
);
297 sz
= offsetof(struct kdbus_msg
, items
);
299 /* Add in fixed header, fields header and payload */
300 sz
+= (1 + m
->n_body_parts
) * ALIGN8(offsetof(struct kdbus_item
, vec
) +
301 MAX(sizeof(struct kdbus_vec
),
302 sizeof(struct kdbus_memfd
)));
304 /* Add space for bloom filter */
305 sz
+= ALIGN8(offsetof(struct kdbus_item
, bloom_filter
) +
306 offsetof(struct kdbus_bloom_filter
, data
) +
309 /* Add in well-known destination header */
311 dl
= strlen(destination
);
312 sz
+= ALIGN8(offsetof(struct kdbus_item
, str
) + dl
+ 1);
315 /* Add space for unix fds */
317 sz
+= ALIGN8(offsetof(struct kdbus_item
, fds
) + sizeof(int)*m
->n_fds
);
319 m
->kdbus
= memalign(8, sz
);
325 m
->free_kdbus
= true;
326 memzero(m
->kdbus
, sz
);
329 ((m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) ? 0 : KDBUS_MSG_EXPECT_REPLY
) |
330 ((m
->header
->flags
& BUS_MESSAGE_NO_AUTO_START
) ? KDBUS_MSG_NO_AUTO_START
: 0) |
331 ((m
->header
->type
== SD_BUS_MESSAGE_SIGNAL
) ? KDBUS_MSG_SIGNAL
: 0);
334 /* verify_destination_id will usually be 0, which makes the kernel driver only look
335 * at the provided well-known name. Otherwise, the kernel will make sure the provided
336 * destination id matches the owner of the provided weel-known-name, and fail if they
337 * differ. Currently, this is only needed for bus-proxyd. */
338 m
->kdbus
->dst_id
= m
->verify_destination_id
;
340 m
->kdbus
->dst_id
= destination
? unique
: KDBUS_DST_ID_BROADCAST
;
342 m
->kdbus
->payload_type
= KDBUS_PAYLOAD_DBUS
;
343 m
->kdbus
->cookie
= m
->header
->dbus2
.cookie
;
344 m
->kdbus
->priority
= m
->priority
;
346 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
347 m
->kdbus
->cookie_reply
= m
->reply_cookie
;
351 assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE
, &now
) == 0);
352 m
->kdbus
->timeout_ns
= now
.tv_sec
* NSEC_PER_SEC
+ now
.tv_nsec
+
353 m
->timeout
* NSEC_PER_USEC
;
359 append_destination(&d
, destination
, dl
);
361 append_payload_vec(&d
, m
->header
, BUS_MESSAGE_BODY_BEGIN(m
));
363 MESSAGE_FOREACH_PART(part
, i
, m
) {
365 /* If this is padding then simply send a
366 * vector with a NULL data pointer which the
367 * kernel will just pass through. This is the
368 * most efficient way to encode zeroes */
370 append_payload_vec(&d
, NULL
, part
->size
);
374 if (part
->memfd
>= 0 && part
->sealed
&& destination
) {
375 /* Try to send a memfd, if the part is
376 * sealed and this is not a broadcast. Since we can only */
378 append_payload_memfd(&d
, part
->memfd
, part
->memfd_offset
, part
->size
);
382 /* Otherwise, let's send a vector to the actual data.
383 * For that, we need to map it first. */
384 r
= bus_body_part_map(part
);
388 append_payload_vec(&d
, part
->data
, part
->size
);
391 if (m
->header
->type
== SD_BUS_MESSAGE_SIGNAL
) {
392 struct kdbus_bloom_filter
*bloom
;
394 bloom
= append_bloom(&d
, m
->bus
->bloom_size
);
395 r
= bus_message_setup_bloom(m
, bloom
);
401 append_fds(&d
, m
->fds
, m
->n_fds
);
403 m
->kdbus
->size
= (uint8_t*) d
- (uint8_t*) m
->kdbus
;
404 assert(m
->kdbus
->size
<= sz
);
413 static void unset_memfds(struct sd_bus_message
*m
) {
414 struct bus_body_part
*part
;
419 /* Make sure the memfds are not freed twice */
420 MESSAGE_FOREACH_PART(part
, i
, m
)
421 if (part
->memfd
>= 0)
425 static void message_set_timestamp(sd_bus
*bus
, sd_bus_message
*m
, const struct kdbus_timestamp
*ts
) {
432 if (!(bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
))
435 m
->realtime
= ts
->realtime_ns
/ NSEC_PER_USEC
;
436 m
->monotonic
= ts
->monotonic_ns
/ NSEC_PER_USEC
;
437 m
->seqnum
= ts
->seqnum
;
440 static int bus_kernel_make_message(sd_bus
*bus
, struct kdbus_msg
*k
) {
441 sd_bus_message
*m
= NULL
;
442 struct kdbus_item
*d
;
444 _cleanup_free_
int *fds
= NULL
;
445 struct bus_header
*header
= NULL
;
447 size_t header_size
= 0, footer_size
= 0;
448 size_t n_bytes
= 0, idx
= 0;
449 const char *destination
= NULL
, *seclabel
= NULL
;
450 bool last_was_memfd
= false;
455 assert(k
->payload_type
== KDBUS_PAYLOAD_DBUS
);
457 KDBUS_ITEM_FOREACH(d
, k
, items
) {
460 l
= d
->size
- offsetof(struct kdbus_item
, data
);
464 case KDBUS_ITEM_PAYLOAD_OFF
:
466 header
= (struct bus_header
*)((uint8_t*) k
+ d
->vec
.offset
);
467 header_size
= d
->vec
.size
;
470 footer
= (uint8_t*) k
+ d
->vec
.offset
;
471 footer_size
= d
->vec
.size
;
473 n_bytes
+= d
->vec
.size
;
474 last_was_memfd
= false;
477 case KDBUS_ITEM_PAYLOAD_MEMFD
:
478 if (!header
) /* memfd cannot be first part */
481 n_bytes
+= d
->memfd
.size
;
482 last_was_memfd
= true;
485 case KDBUS_ITEM_FDS
: {
490 f
= realloc(fds
, sizeof(int) * (n_fds
+ j
));
495 memcpy(fds
+ n_fds
, d
->fds
, sizeof(int) * j
);
500 case KDBUS_ITEM_SECLABEL
:
506 if (last_was_memfd
) /* memfd cannot be last part */
512 if (header_size
< sizeof(struct bus_header
))
515 /* on kdbus we only speak native endian gvariant, never dbus1
516 * marshalling or reverse endian */
517 if (header
->version
!= 2 ||
518 header
->endian
!= BUS_NATIVE_ENDIAN
)
521 r
= bus_message_from_header(
531 /* The well-known names list is different from the other
532 credentials. If we asked for it, but nothing is there, this
533 means that the list of well-known names is simply empty, not
534 that we lack any data */
536 m
->creds
.mask
|= (SD_BUS_CREDS_UNIQUE_NAME
|SD_BUS_CREDS_WELL_KNOWN_NAMES
) & bus
->creds_mask
;
538 KDBUS_ITEM_FOREACH(d
, k
, items
) {
541 l
= d
->size
- offsetof(struct kdbus_item
, data
);
545 case KDBUS_ITEM_PAYLOAD_OFF
: {
548 begin_body
= BUS_MESSAGE_BODY_BEGIN(m
);
550 if (idx
+ d
->vec
.size
> begin_body
) {
551 struct bus_body_part
*part
;
553 /* Contains body material */
555 part
= message_append_part(m
);
561 /* A -1 offset is NUL padding. */
562 part
->is_zero
= d
->vec
.offset
== ~0ULL;
564 if (idx
>= begin_body
) {
566 part
->data
= (uint8_t* )k
+ d
->vec
.offset
;
567 part
->size
= d
->vec
.size
;
570 part
->data
= (uint8_t*) k
+ d
->vec
.offset
+ (begin_body
- idx
);
571 part
->size
= d
->vec
.size
- (begin_body
- idx
);
581 case KDBUS_ITEM_PAYLOAD_MEMFD
: {
582 struct bus_body_part
*part
;
584 if (idx
< BUS_MESSAGE_BODY_BEGIN(m
)) {
589 part
= message_append_part(m
);
595 part
->memfd
= d
->memfd
.fd
;
596 part
->memfd_offset
= d
->memfd
.start
;
597 part
->size
= d
->memfd
.size
;
600 idx
+= d
->memfd
.size
;
604 case KDBUS_ITEM_PIDS
:
606 /* The PID/TID might be missing, when the data
607 * is faked by a bus proxy and it lacks that
608 * information about the real client (since
609 * SO_PEERCRED is used for that). Also kernel
610 * namespacing might make some of this data
611 * unavailable when untranslatable. */
613 if (d
->pids
.pid
> 0) {
614 m
->creds
.pid
= (pid_t
) d
->pids
.pid
;
615 m
->creds
.mask
|= SD_BUS_CREDS_PID
& bus
->creds_mask
;
618 if (d
->pids
.tid
> 0) {
619 m
->creds
.tid
= (pid_t
) d
->pids
.tid
;
620 m
->creds
.mask
|= SD_BUS_CREDS_TID
& bus
->creds_mask
;
623 if (d
->pids
.ppid
> 0) {
624 m
->creds
.ppid
= (pid_t
) d
->pids
.ppid
;
625 m
->creds
.mask
|= SD_BUS_CREDS_PPID
& bus
->creds_mask
;
626 } else if (d
->pids
.pid
== 1) {
628 m
->creds
.mask
|= SD_BUS_CREDS_PPID
& bus
->creds_mask
;
633 case KDBUS_ITEM_CREDS
:
635 /* EUID/SUID/FSUID/EGID/SGID/FSGID might be
636 * missing too (see above). */
638 if ((uid_t
) d
->creds
.uid
!= UID_INVALID
) {
639 m
->creds
.uid
= (uid_t
) d
->creds
.uid
;
640 m
->creds
.mask
|= SD_BUS_CREDS_UID
& bus
->creds_mask
;
643 if ((uid_t
) d
->creds
.euid
!= UID_INVALID
) {
644 m
->creds
.euid
= (uid_t
) d
->creds
.euid
;
645 m
->creds
.mask
|= SD_BUS_CREDS_EUID
& bus
->creds_mask
;
648 if ((uid_t
) d
->creds
.suid
!= UID_INVALID
) {
649 m
->creds
.suid
= (uid_t
) d
->creds
.suid
;
650 m
->creds
.mask
|= SD_BUS_CREDS_SUID
& bus
->creds_mask
;
653 if ((uid_t
) d
->creds
.fsuid
!= UID_INVALID
) {
654 m
->creds
.fsuid
= (uid_t
) d
->creds
.fsuid
;
655 m
->creds
.mask
|= SD_BUS_CREDS_FSUID
& bus
->creds_mask
;
658 if ((gid_t
) d
->creds
.gid
!= GID_INVALID
) {
659 m
->creds
.gid
= (gid_t
) d
->creds
.gid
;
660 m
->creds
.mask
|= SD_BUS_CREDS_GID
& bus
->creds_mask
;
663 if ((gid_t
) d
->creds
.egid
!= GID_INVALID
) {
664 m
->creds
.egid
= (gid_t
) d
->creds
.egid
;
665 m
->creds
.mask
|= SD_BUS_CREDS_EGID
& bus
->creds_mask
;
668 if ((gid_t
) d
->creds
.sgid
!= GID_INVALID
) {
669 m
->creds
.sgid
= (gid_t
) d
->creds
.sgid
;
670 m
->creds
.mask
|= SD_BUS_CREDS_SGID
& bus
->creds_mask
;
673 if ((gid_t
) d
->creds
.fsgid
!= GID_INVALID
) {
674 m
->creds
.fsgid
= (gid_t
) d
->creds
.fsgid
;
675 m
->creds
.mask
|= SD_BUS_CREDS_FSGID
& bus
->creds_mask
;
680 case KDBUS_ITEM_TIMESTAMP
:
681 message_set_timestamp(bus
, m
, &d
->timestamp
);
684 case KDBUS_ITEM_PID_COMM
:
685 m
->creds
.comm
= d
->str
;
686 m
->creds
.mask
|= SD_BUS_CREDS_COMM
& bus
->creds_mask
;
689 case KDBUS_ITEM_TID_COMM
:
690 m
->creds
.tid_comm
= d
->str
;
691 m
->creds
.mask
|= SD_BUS_CREDS_TID_COMM
& bus
->creds_mask
;
695 m
->creds
.exe
= d
->str
;
696 m
->creds
.mask
|= SD_BUS_CREDS_EXE
& bus
->creds_mask
;
699 case KDBUS_ITEM_CMDLINE
:
700 m
->creds
.cmdline
= d
->str
;
701 m
->creds
.cmdline_size
= l
;
702 m
->creds
.mask
|= SD_BUS_CREDS_CMDLINE
& bus
->creds_mask
;
705 case KDBUS_ITEM_CGROUP
:
706 m
->creds
.cgroup
= d
->str
;
707 m
->creds
.mask
|= (SD_BUS_CREDS_CGROUP
|SD_BUS_CREDS_UNIT
|SD_BUS_CREDS_USER_UNIT
|SD_BUS_CREDS_SLICE
|SD_BUS_CREDS_SESSION
|SD_BUS_CREDS_OWNER_UID
) & bus
->creds_mask
;
709 r
= bus_get_root_path(bus
);
713 m
->creds
.cgroup_root
= bus
->cgroup_root
;
716 case KDBUS_ITEM_AUDIT
:
717 m
->creds
.audit_session_id
= (uint32_t) d
->audit
.sessionid
;
718 m
->creds
.mask
|= SD_BUS_CREDS_AUDIT_SESSION_ID
& bus
->creds_mask
;
720 m
->creds
.audit_login_uid
= (uid_t
) d
->audit
.loginuid
;
721 m
->creds
.mask
|= SD_BUS_CREDS_AUDIT_LOGIN_UID
& bus
->creds_mask
;
724 case KDBUS_ITEM_CAPS
:
725 if (d
->caps
.last_cap
!= cap_last_cap() ||
726 d
->size
- offsetof(struct kdbus_item
, caps
.caps
) < DIV_ROUND_UP(d
->caps
.last_cap
, 32U) * 4 * 4) {
731 m
->creds
.capability
= d
->caps
.caps
;
732 m
->creds
.mask
|= (SD_BUS_CREDS_EFFECTIVE_CAPS
|SD_BUS_CREDS_PERMITTED_CAPS
|SD_BUS_CREDS_INHERITABLE_CAPS
|SD_BUS_CREDS_BOUNDING_CAPS
) & bus
->creds_mask
;
735 case KDBUS_ITEM_DST_NAME
:
736 if (!service_name_is_valid(d
->str
)) {
741 destination
= d
->str
;
744 case KDBUS_ITEM_OWNED_NAME
:
745 if (!service_name_is_valid(d
->name
.name
)) {
750 if (bus
->creds_mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
) {
754 /* We just extend the array here, but
755 * do not allocate the strings inside
756 * of it, instead we just point to our
757 * buffer directly. */
758 n
= strv_length(m
->creds
.well_known_names
);
759 wkn
= realloc(m
->creds
.well_known_names
, (n
+ 2) * sizeof(char*));
765 wkn
[n
] = d
->name
.name
;
767 m
->creds
.well_known_names
= wkn
;
769 m
->creds
.mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
;
773 case KDBUS_ITEM_CONN_DESCRIPTION
:
774 m
->creds
.description
= d
->str
;
775 m
->creds
.mask
|= SD_BUS_CREDS_DESCRIPTION
& bus
->creds_mask
;
778 case KDBUS_ITEM_AUXGROUPS
:
780 if (bus
->creds_mask
& SD_BUS_CREDS_SUPPLEMENTARY_GIDS
) {
784 n
= (d
->size
- offsetof(struct kdbus_item
, data64
)) / sizeof(uint64_t);
791 for (i
= 0; i
< n
; i
++)
794 m
->creds
.supplementary_gids
= g
;
795 m
->creds
.n_supplementary_gids
= n
;
796 m
->creds
.mask
|= SD_BUS_CREDS_SUPPLEMENTARY_GIDS
;
802 case KDBUS_ITEM_SECLABEL
:
803 case KDBUS_ITEM_BLOOM_FILTER
:
807 log_debug("Got unknown field from kernel %llu", d
->type
);
811 /* If we requested the list of well-known names to be appended
812 * and the sender had none no item for it will be
813 * attached. However, this does *not* mean that the kernel
814 * didn't want to provide this information to us. Hence, let's
815 * explicitly mark this information as available if it was
817 m
->creds
.mask
|= bus
->creds_mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
;
819 r
= bus_message_parse_fields(m
);
823 /* Refuse messages if kdbus and dbus1 cookie doesn't match up */
824 if ((uint64_t) m
->header
->dbus2
.cookie
!= k
->cookie
) {
829 /* Refuse messages where the reply flag doesn't match up */
830 if (!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) != !!(k
->flags
& KDBUS_MSG_EXPECT_REPLY
)) {
835 /* Refuse reply messages where the reply cookie doesn't match up */
836 if ((m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) && m
->reply_cookie
!= k
->cookie_reply
) {
841 /* Refuse messages where the autostart flag doesn't match up */
842 if (!(m
->header
->flags
& BUS_MESSAGE_NO_AUTO_START
) != !(k
->flags
& KDBUS_MSG_NO_AUTO_START
)) {
847 /* Override information from the user header with data from the kernel */
848 if (k
->src_id
== KDBUS_SRC_ID_KERNEL
)
849 bus_message_set_sender_driver(bus
, m
);
851 snprintf(m
->sender_buffer
, sizeof(m
->sender_buffer
), ":1.%llu", (unsigned long long) k
->src_id
);
852 m
->sender
= m
->creds
.unique_name
= m
->sender_buffer
;
856 m
->destination
= destination
;
857 else if (k
->dst_id
== KDBUS_DST_ID_BROADCAST
)
858 m
->destination
= NULL
;
859 else if (k
->dst_id
== KDBUS_DST_ID_NAME
)
860 m
->destination
= bus
->unique_name
; /* fill in unique name if the well-known name is missing */
862 snprintf(m
->destination_buffer
, sizeof(m
->destination_buffer
), ":1.%llu", (unsigned long long) k
->dst_id
);
863 m
->destination
= m
->destination_buffer
;
866 /* We take possession of the kmsg struct now */
868 m
->release_kdbus
= true;
872 bus
->rqueue
[bus
->rqueue_size
++] = m
;
878 sd_bus_message_unref(m
);
883 int bus_kernel_take_fd(sd_bus
*b
) {
884 struct kdbus_bloom_parameter
*bloom
= NULL
;
885 struct kdbus_item
*items
, *item
;
886 struct kdbus_cmd_hello
*hello
;
887 _cleanup_free_
char *g
= NULL
;
889 size_t l
= 0, m
= 0, sz
;
899 if (b
->description
) {
900 g
= bus_label_escape(b
->description
);
908 /* If no name is explicitly set, we'll include a hint
909 * indicating the library implementation, a hint which
910 * kind of bus this is and the thread name */
912 assert_se(prctl(PR_GET_NAME
, (unsigned long) pr
) >= 0);
915 name
= b
->is_system
? "sd-system" :
916 b
->is_user
? "sd-user" : "sd";
918 _cleanup_free_
char *e
= NULL
;
920 e
= bus_label_escape(pr
);
924 g
= strappend(b
->is_system
? "sd-system-" :
925 b
->is_user
? "sd-user-" : "sd-",
933 b
->description
= bus_label_unescape(name
);
940 sz
= ALIGN8(offsetof(struct kdbus_cmd_hello
, items
)) +
941 ALIGN8(offsetof(struct kdbus_item
, str
) + m
+ 1);
943 if (b
->fake_creds_valid
)
944 sz
+= ALIGN8(offsetof(struct kdbus_item
, creds
) + sizeof(struct kdbus_creds
));
946 if (b
->fake_pids_valid
)
947 sz
+= ALIGN8(offsetof(struct kdbus_item
, pids
) + sizeof(struct kdbus_pids
));
950 l
= strlen(b
->fake_label
);
951 sz
+= ALIGN8(offsetof(struct kdbus_item
, str
) + l
+ 1);
954 hello
= alloca0_align(sz
, 8);
956 hello
->flags
= b
->hello_flags
;
957 hello
->attach_flags_send
= _KDBUS_ATTACH_ANY
;
958 hello
->attach_flags_recv
= b
->attach_flags
;
959 hello
->pool_size
= KDBUS_POOL_SIZE
;
963 item
->size
= offsetof(struct kdbus_item
, str
) + m
+ 1;
964 item
->type
= KDBUS_ITEM_CONN_DESCRIPTION
;
965 memcpy(item
->str
, name
, m
+ 1);
966 item
= KDBUS_ITEM_NEXT(item
);
968 if (b
->fake_creds_valid
) {
969 item
->size
= offsetof(struct kdbus_item
, creds
) + sizeof(struct kdbus_creds
);
970 item
->type
= KDBUS_ITEM_CREDS
;
971 item
->creds
= b
->fake_creds
;
973 item
= KDBUS_ITEM_NEXT(item
);
976 if (b
->fake_pids_valid
) {
977 item
->size
= offsetof(struct kdbus_item
, pids
) + sizeof(struct kdbus_pids
);
978 item
->type
= KDBUS_ITEM_PIDS
;
979 item
->pids
= b
->fake_pids
;
981 item
= KDBUS_ITEM_NEXT(item
);
985 item
->size
= offsetof(struct kdbus_item
, str
) + l
+ 1;
986 item
->type
= KDBUS_ITEM_SECLABEL
;
987 memcpy(item
->str
, b
->fake_label
, l
+1);
990 r
= ioctl(b
->input_fd
, KDBUS_CMD_HELLO
, hello
);
993 /* If the ioctl is not supported we assume that the
994 * API version changed in a major incompatible way,
995 * let's indicate an API incompatibility in this
997 return -ESOCKTNOSUPPORT
;
1002 if (!b
->kdbus_buffer
) {
1003 b
->kdbus_buffer
= mmap(NULL
, KDBUS_POOL_SIZE
, PROT_READ
, MAP_SHARED
, b
->input_fd
, 0);
1004 if (b
->kdbus_buffer
== MAP_FAILED
) {
1005 b
->kdbus_buffer
= NULL
;
1011 /* The higher 32bit of the bus_flags fields are considered
1012 * 'incompatible flags'. Refuse them all for now. */
1013 if (hello
->bus_flags
> 0xFFFFFFFFULL
) {
1014 r
= -ESOCKTNOSUPPORT
;
1018 /* extract bloom parameters from items */
1019 items
= (void*)((uint8_t*)b
->kdbus_buffer
+ hello
->offset
);
1020 KDBUS_FOREACH(item
, items
, hello
->items_size
) {
1021 switch (item
->type
) {
1022 case KDBUS_ITEM_BLOOM_PARAMETER
:
1023 bloom
= &item
->bloom_parameter
;
1028 if (!bloom
|| !bloom_validate_parameters((size_t) bloom
->size
, (unsigned) bloom
->n_hash
)) {
1033 b
->bloom_size
= (size_t) bloom
->size
;
1034 b
->bloom_n_hash
= (unsigned) bloom
->n_hash
;
1036 if (asprintf(&b
->unique_name
, ":1.%llu", (unsigned long long) hello
->id
) < 0) {
1041 b
->unique_id
= hello
->id
;
1043 b
->is_kernel
= true;
1044 b
->bus_client
= true;
1045 b
->can_fds
= !!(hello
->flags
& KDBUS_HELLO_ACCEPT_FD
);
1046 b
->message_version
= 2;
1047 b
->message_endian
= BUS_NATIVE_ENDIAN
;
1049 /* the kernel told us the UUID of the underlying bus */
1050 memcpy(b
->server_id
.bytes
, hello
->id128
, sizeof(b
->server_id
.bytes
));
1052 /* free returned items */
1053 (void) bus_kernel_cmd_free(b
, hello
->offset
);
1054 return bus_start_running(b
);
1057 (void) bus_kernel_cmd_free(b
, hello
->offset
);
1061 int bus_kernel_connect(sd_bus
*b
) {
1063 assert(b
->input_fd
< 0);
1064 assert(b
->output_fd
< 0);
1070 b
->input_fd
= open(b
->kernel
, O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1071 if (b
->input_fd
< 0)
1074 b
->output_fd
= b
->input_fd
;
1076 return bus_kernel_take_fd(b
);
1079 int bus_kernel_cmd_free(sd_bus
*bus
, uint64_t offset
) {
1080 struct kdbus_cmd_free cmd
= {
1081 .size
= sizeof(cmd
),
1087 assert(bus
->is_kernel
);
1089 r
= ioctl(bus
->input_fd
, KDBUS_CMD_FREE
, &cmd
);
1096 static void close_kdbus_msg(sd_bus
*bus
, struct kdbus_msg
*k
) {
1097 struct kdbus_item
*d
;
1102 KDBUS_ITEM_FOREACH(d
, k
, items
) {
1103 if (d
->type
== KDBUS_ITEM_FDS
)
1104 close_many(d
->fds
, (d
->size
- offsetof(struct kdbus_item
, fds
)) / sizeof(int));
1105 else if (d
->type
== KDBUS_ITEM_PAYLOAD_MEMFD
)
1106 safe_close(d
->memfd
.fd
);
1109 bus_kernel_cmd_free(bus
, (uint8_t*) k
- (uint8_t*) bus
->kdbus_buffer
);
1112 int bus_kernel_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
) {
1113 struct kdbus_cmd_send cmd
= { };
1118 assert(bus
->state
== BUS_RUNNING
);
1120 /* If we can't deliver, we want room for the error message */
1121 r
= bus_rqueue_make_room(bus
);
1125 r
= bus_message_setup_kmsg(bus
, m
);
1129 cmd
.size
= sizeof(cmd
);
1130 cmd
.msg_address
= (uintptr_t)m
->kdbus
;
1132 /* If this is a synchronous method call, then let's tell the
1133 * kernel, so that it can pass CPU time/scheduling to the
1134 * destination for the time, if it wants to. If we
1135 * synchronously wait for the result anyway, we won't need CPU
1137 if (hint_sync_call
) {
1138 m
->kdbus
->flags
|= KDBUS_MSG_EXPECT_REPLY
;
1139 cmd
.flags
|= KDBUS_SEND_SYNC_REPLY
;
1142 r
= ioctl(bus
->output_fd
, KDBUS_CMD_SEND
, &cmd
);
1144 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1145 sd_bus_message
*reply
;
1147 if (errno
== EAGAIN
|| errno
== EINTR
)
1149 else if (errno
== ENXIO
|| errno
== ESRCH
) {
1151 /* ENXIO: unique name not known
1152 * ESRCH: well-known name not known */
1154 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
)
1155 sd_bus_error_setf(&error
, SD_BUS_ERROR_SERVICE_UNKNOWN
, "Destination %s not known", m
->destination
);
1157 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m
->destination
);
1161 } else if (errno
== EADDRNOTAVAIL
) {
1163 /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
1165 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
)
1166 sd_bus_error_setf(&error
, SD_BUS_ERROR_SERVICE_UNKNOWN
, "Activation of %s not requested", m
->destination
);
1168 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m
->destination
);
1174 r
= bus_message_new_synthetic_error(
1176 BUS_MESSAGE_COOKIE(m
),
1183 r
= bus_seal_synthetic_message(bus
, reply
);
1187 bus
->rqueue
[bus
->rqueue_size
++] = reply
;
1189 } else if (hint_sync_call
) {
1190 struct kdbus_msg
*k
;
1192 k
= (struct kdbus_msg
*)((uint8_t *)bus
->kdbus_buffer
+ cmd
.reply
.offset
);
1195 if (k
->payload_type
== KDBUS_PAYLOAD_DBUS
) {
1197 r
= bus_kernel_make_message(bus
, k
);
1199 close_kdbus_msg(bus
, k
);
1201 /* Anybody can send us invalid messages, let's just drop them. */
1202 if (r
== -EBADMSG
|| r
== -EPROTOTYPE
)
1203 log_debug_errno(r
, "Ignoring invalid synchronous reply: %m");
1208 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k
->payload_type
);
1209 close_kdbus_msg(bus
, k
);
1216 static int push_name_owner_changed(
1219 const char *old_owner
,
1220 const char *new_owner
,
1221 const struct kdbus_timestamp
*ts
) {
1223 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
1228 r
= sd_bus_message_new_signal(
1231 "/org/freedesktop/DBus",
1232 "org.freedesktop.DBus",
1233 "NameOwnerChanged");
1237 r
= sd_bus_message_append(m
, "sss", name
, old_owner
, new_owner
);
1241 bus_message_set_sender_driver(bus
, m
);
1242 message_set_timestamp(bus
, m
, ts
);
1244 r
= bus_seal_synthetic_message(bus
, m
);
1248 bus
->rqueue
[bus
->rqueue_size
++] = m
;
1254 static int translate_name_change(
1256 const struct kdbus_msg
*k
,
1257 const struct kdbus_item
*d
,
1258 const struct kdbus_timestamp
*ts
) {
1260 char new_owner
[UNIQUE_NAME_MAX
], old_owner
[UNIQUE_NAME_MAX
];
1266 if (d
->type
== KDBUS_ITEM_NAME_ADD
|| (d
->name_change
.old_id
.flags
& (KDBUS_NAME_IN_QUEUE
|KDBUS_NAME_ACTIVATOR
)))
1269 sprintf(old_owner
, ":1.%llu", (unsigned long long) d
->name_change
.old_id
.id
);
1271 if (d
->type
== KDBUS_ITEM_NAME_REMOVE
|| (d
->name_change
.new_id
.flags
& (KDBUS_NAME_IN_QUEUE
|KDBUS_NAME_ACTIVATOR
))) {
1273 if (isempty(old_owner
))
1278 sprintf(new_owner
, ":1.%llu", (unsigned long long) d
->name_change
.new_id
.id
);
1280 return push_name_owner_changed(bus
, d
->name_change
.name
, old_owner
, new_owner
, ts
);
1283 static int translate_id_change(
1285 const struct kdbus_msg
*k
,
1286 const struct kdbus_item
*d
,
1287 const struct kdbus_timestamp
*ts
) {
1289 char owner
[UNIQUE_NAME_MAX
];
1295 sprintf(owner
, ":1.%llu", d
->id_change
.id
);
1297 return push_name_owner_changed(
1299 d
->type
== KDBUS_ITEM_ID_ADD
? NULL
: owner
,
1300 d
->type
== KDBUS_ITEM_ID_ADD
? owner
: NULL
,
1304 static int translate_reply(
1306 const struct kdbus_msg
*k
,
1307 const struct kdbus_item
*d
,
1308 const struct kdbus_timestamp
*ts
) {
1310 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
1317 r
= bus_message_new_synthetic_error(
1320 d
->type
== KDBUS_ITEM_REPLY_TIMEOUT
?
1321 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out") :
1322 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call peer died"),
1327 message_set_timestamp(bus
, m
, ts
);
1329 r
= bus_seal_synthetic_message(bus
, m
);
1333 bus
->rqueue
[bus
->rqueue_size
++] = m
;
1339 static int bus_kernel_translate_message(sd_bus
*bus
, struct kdbus_msg
*k
) {
1340 static int (* const translate
[])(sd_bus
*bus
, const struct kdbus_msg
*k
, const struct kdbus_item
*d
, const struct kdbus_timestamp
*ts
) = {
1341 [KDBUS_ITEM_NAME_ADD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1342 [KDBUS_ITEM_NAME_REMOVE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1343 [KDBUS_ITEM_NAME_CHANGE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1345 [KDBUS_ITEM_ID_ADD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_id_change
,
1346 [KDBUS_ITEM_ID_REMOVE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_id_change
,
1348 [KDBUS_ITEM_REPLY_TIMEOUT
- _KDBUS_ITEM_KERNEL_BASE
] = translate_reply
,
1349 [KDBUS_ITEM_REPLY_DEAD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_reply
,
1352 struct kdbus_item
*d
, *found
= NULL
;
1353 struct kdbus_timestamp
*ts
= NULL
;
1357 assert(k
->payload_type
== KDBUS_PAYLOAD_KERNEL
);
1359 KDBUS_ITEM_FOREACH(d
, k
, items
) {
1360 if (d
->type
== KDBUS_ITEM_TIMESTAMP
)
1362 else if (d
->type
>= _KDBUS_ITEM_KERNEL_BASE
&& d
->type
< _KDBUS_ITEM_KERNEL_BASE
+ ELEMENTSOF(translate
)) {
1367 log_debug("Got unknown field from kernel %llu", d
->type
);
1371 log_debug("Didn't find a kernel message to translate.");
1375 return translate
[found
->type
- _KDBUS_ITEM_KERNEL_BASE
](bus
, k
, found
, ts
);
1378 int bus_kernel_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1379 struct kdbus_cmd_recv recv
= { .size
= sizeof(recv
) };
1380 struct kdbus_msg
*k
;
1385 r
= bus_rqueue_make_room(bus
);
1389 if (hint_priority
) {
1390 recv
.flags
|= KDBUS_RECV_USE_PRIORITY
;
1391 recv
.priority
= priority
;
1394 r
= ioctl(bus
->input_fd
, KDBUS_CMD_RECV
, &recv
);
1395 if (recv
.return_flags
& KDBUS_RECV_RETURN_DROPPED_MSGS
)
1396 log_debug("%s: kdbus reports %" PRIu64
" dropped broadcast messages, ignoring.", strna(bus
->description
), (uint64_t) recv
.dropped_msgs
);
1398 if (errno
== EAGAIN
)
1404 k
= (struct kdbus_msg
*)((uint8_t *)bus
->kdbus_buffer
+ recv
.msg
.offset
);
1405 if (k
->payload_type
== KDBUS_PAYLOAD_DBUS
) {
1406 r
= bus_kernel_make_message(bus
, k
);
1408 /* Anybody can send us invalid messages, let's just drop them. */
1409 if (r
== -EBADMSG
|| r
== -EPROTOTYPE
) {
1410 log_debug_errno(r
, "Ignoring invalid message: %m");
1415 close_kdbus_msg(bus
, k
);
1416 } else if (k
->payload_type
== KDBUS_PAYLOAD_KERNEL
) {
1417 r
= bus_kernel_translate_message(bus
, k
);
1418 close_kdbus_msg(bus
, k
);
1420 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k
->payload_type
);
1422 close_kdbus_msg(bus
, k
);
1425 return r
< 0 ? r
: 1;
1428 int bus_kernel_pop_memfd(sd_bus
*bus
, void **address
, size_t *mapped
, size_t *allocated
) {
1429 struct memfd_cache
*c
;
1436 if (!bus
|| !bus
->is_kernel
)
1439 assert_se(pthread_mutex_lock(&bus
->memfd_cache_mutex
) == 0);
1441 if (bus
->n_memfd_cache
<= 0) {
1444 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) == 0);
1446 r
= memfd_new(bus
->description
);
1456 c
= &bus
->memfd_cache
[--bus
->n_memfd_cache
];
1459 assert(c
->mapped
== 0 || c
->address
);
1461 *address
= c
->address
;
1462 *mapped
= c
->mapped
;
1463 *allocated
= c
->allocated
;
1466 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) == 0);
1471 static void close_and_munmap(int fd
, void *address
, size_t size
) {
1473 assert_se(munmap(address
, PAGE_ALIGN(size
)) >= 0);
1478 void bus_kernel_push_memfd(sd_bus
*bus
, int fd
, void *address
, size_t mapped
, size_t allocated
) {
1479 struct memfd_cache
*c
;
1480 uint64_t max_mapped
= PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX
);
1483 assert(mapped
== 0 || address
);
1485 if (!bus
|| !bus
->is_kernel
) {
1486 close_and_munmap(fd
, address
, mapped
);
1490 assert_se(pthread_mutex_lock(&bus
->memfd_cache_mutex
) == 0);
1492 if (bus
->n_memfd_cache
>= ELEMENTSOF(bus
->memfd_cache
)) {
1493 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) == 0);
1495 close_and_munmap(fd
, address
, mapped
);
1499 c
= &bus
->memfd_cache
[bus
->n_memfd_cache
++];
1501 c
->address
= address
;
1503 /* If overly long, let's return a bit to the OS */
1504 if (mapped
> max_mapped
) {
1505 assert_se(memfd_set_size(fd
, max_mapped
) >= 0);
1506 assert_se(munmap((uint8_t*) address
+ max_mapped
, PAGE_ALIGN(mapped
- max_mapped
)) >= 0);
1507 c
->mapped
= c
->allocated
= max_mapped
;
1510 c
->allocated
= allocated
;
1513 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) == 0);
1516 void bus_kernel_flush_memfd(sd_bus
*b
) {
1521 for (i
= 0; i
< b
->n_memfd_cache
; i
++)
1522 close_and_munmap(b
->memfd_cache
[i
].fd
, b
->memfd_cache
[i
].address
, b
->memfd_cache
[i
].mapped
);
1525 uint64_t request_name_flags_to_kdbus(uint64_t flags
) {
1528 if (flags
& SD_BUS_NAME_ALLOW_REPLACEMENT
)
1529 f
|= KDBUS_NAME_ALLOW_REPLACEMENT
;
1531 if (flags
& SD_BUS_NAME_REPLACE_EXISTING
)
1532 f
|= KDBUS_NAME_REPLACE_EXISTING
;
1534 if (flags
& SD_BUS_NAME_QUEUE
)
1535 f
|= KDBUS_NAME_QUEUE
;
1540 uint64_t attach_flags_to_kdbus(uint64_t mask
) {
1543 if (mask
& (SD_BUS_CREDS_UID
|SD_BUS_CREDS_EUID
|SD_BUS_CREDS_SUID
|SD_BUS_CREDS_FSUID
|
1544 SD_BUS_CREDS_GID
|SD_BUS_CREDS_EGID
|SD_BUS_CREDS_SGID
|SD_BUS_CREDS_FSGID
))
1545 m
|= KDBUS_ATTACH_CREDS
;
1547 if (mask
& (SD_BUS_CREDS_PID
|SD_BUS_CREDS_TID
|SD_BUS_CREDS_PPID
))
1548 m
|= KDBUS_ATTACH_PIDS
;
1550 if (mask
& SD_BUS_CREDS_COMM
)
1551 m
|= KDBUS_ATTACH_PID_COMM
;
1553 if (mask
& SD_BUS_CREDS_TID_COMM
)
1554 m
|= KDBUS_ATTACH_TID_COMM
;
1556 if (mask
& SD_BUS_CREDS_EXE
)
1557 m
|= KDBUS_ATTACH_EXE
;
1559 if (mask
& SD_BUS_CREDS_CMDLINE
)
1560 m
|= KDBUS_ATTACH_CMDLINE
;
1562 if (mask
& (SD_BUS_CREDS_CGROUP
|SD_BUS_CREDS_UNIT
|SD_BUS_CREDS_USER_UNIT
|SD_BUS_CREDS_SLICE
|SD_BUS_CREDS_SESSION
|SD_BUS_CREDS_OWNER_UID
))
1563 m
|= KDBUS_ATTACH_CGROUP
;
1565 if (mask
& (SD_BUS_CREDS_EFFECTIVE_CAPS
|SD_BUS_CREDS_PERMITTED_CAPS
|SD_BUS_CREDS_INHERITABLE_CAPS
|SD_BUS_CREDS_BOUNDING_CAPS
))
1566 m
|= KDBUS_ATTACH_CAPS
;
1568 if (mask
& SD_BUS_CREDS_SELINUX_CONTEXT
)
1569 m
|= KDBUS_ATTACH_SECLABEL
;
1571 if (mask
& (SD_BUS_CREDS_AUDIT_SESSION_ID
|SD_BUS_CREDS_AUDIT_LOGIN_UID
))
1572 m
|= KDBUS_ATTACH_AUDIT
;
1574 if (mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
)
1575 m
|= KDBUS_ATTACH_NAMES
;
1577 if (mask
& SD_BUS_CREDS_DESCRIPTION
)
1578 m
|= KDBUS_ATTACH_CONN_DESCRIPTION
;
1580 if (mask
& SD_BUS_CREDS_SUPPLEMENTARY_GIDS
)
1581 m
|= KDBUS_ATTACH_AUXGROUPS
;
1586 int bus_kernel_create_bus(const char *name
, bool world
, char **s
) {
1587 struct kdbus_cmd
*make
;
1588 struct kdbus_item
*n
;
1595 fd
= open("/sys/fs/kdbus/control", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1600 make
= alloca0_align(offsetof(struct kdbus_cmd
, items
) +
1601 ALIGN8(offsetof(struct kdbus_item
, bloom_parameter
) + sizeof(struct kdbus_bloom_parameter
)) +
1602 ALIGN8(offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t)) +
1603 ALIGN8(offsetof(struct kdbus_item
, str
) + DECIMAL_STR_MAX(uid_t
) + 1 + l
+ 1),
1606 make
->size
= offsetof(struct kdbus_cmd
, items
);
1608 /* Set the bloom parameters */
1610 n
->size
= offsetof(struct kdbus_item
, bloom_parameter
) +
1611 sizeof(struct kdbus_bloom_parameter
);
1612 n
->type
= KDBUS_ITEM_BLOOM_PARAMETER
;
1613 n
->bloom_parameter
.size
= DEFAULT_BLOOM_SIZE
;
1614 n
->bloom_parameter
.n_hash
= DEFAULT_BLOOM_N_HASH
;
1616 assert_cc(DEFAULT_BLOOM_SIZE
> 0);
1617 assert_cc(DEFAULT_BLOOM_N_HASH
> 0);
1619 make
->size
+= ALIGN8(n
->size
);
1621 /* Provide all metadata via bus-owner queries */
1622 n
= KDBUS_ITEM_NEXT(n
);
1623 n
->type
= KDBUS_ITEM_ATTACH_FLAGS_SEND
;
1624 n
->size
= offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t);
1625 n
->data64
[0] = _KDBUS_ATTACH_ANY
;
1626 make
->size
+= ALIGN8(n
->size
);
1628 /* Set the a good name */
1629 n
= KDBUS_ITEM_NEXT(n
);
1630 sprintf(n
->str
, UID_FMT
"-%s", getuid(), name
);
1631 n
->size
= offsetof(struct kdbus_item
, str
) + strlen(n
->str
) + 1;
1632 n
->type
= KDBUS_ITEM_MAKE_NAME
;
1633 make
->size
+= ALIGN8(n
->size
);
1635 make
->flags
= world
? KDBUS_MAKE_ACCESS_WORLD
: 0;
1637 if (ioctl(fd
, KDBUS_CMD_BUS_MAKE
, make
) < 0) {
1640 /* Major API change? then the ioctls got shuffled around. */
1641 if (errno
== ENOTTY
)
1642 return -ESOCKTNOSUPPORT
;
1650 p
= strjoin("/sys/fs/kdbus/", n
->str
, "/bus", NULL
);
1662 int bus_kernel_open_bus_fd(const char *bus
, char **path
) {
1669 len
= strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t
) + 1 + strlen(bus
) + strlen("/bus") + 1;
1676 p
= newa(char, len
);
1678 sprintf(p
, "/sys/fs/kdbus/" UID_FMT
"-%s/bus", getuid(), bus
);
1680 fd
= open(p
, O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1694 int bus_kernel_create_endpoint(const char *bus_name
, const char *ep_name
, char **ep_path
) {
1695 _cleanup_free_
char *path
= NULL
;
1696 struct kdbus_cmd
*make
;
1697 struct kdbus_item
*n
;
1701 fd
= bus_kernel_open_bus_fd(bus_name
, &path
);
1705 make
= alloca0_align(ALIGN8(offsetof(struct kdbus_cmd
, items
)) +
1706 ALIGN8(offsetof(struct kdbus_item
, str
) + DECIMAL_STR_MAX(uid_t
) + 1 + strlen(ep_name
) + 1),
1708 make
->size
= ALIGN8(offsetof(struct kdbus_cmd
, items
));
1709 make
->flags
= KDBUS_MAKE_ACCESS_WORLD
;
1712 sprintf(n
->str
, UID_FMT
"-%s", getuid(), ep_name
);
1713 n
->size
= offsetof(struct kdbus_item
, str
) + strlen(n
->str
) + 1;
1714 n
->type
= KDBUS_ITEM_MAKE_NAME
;
1715 make
->size
+= ALIGN8(n
->size
);
1718 if (ioctl(fd
, KDBUS_CMD_ENDPOINT_MAKE
, make
) < 0) {
1726 p
= strjoin(dirname(path
), "/", name
, NULL
);
1738 int bus_kernel_try_close(sd_bus
*bus
) {
1739 struct kdbus_cmd byebye
= { .size
= sizeof(byebye
) };
1742 assert(bus
->is_kernel
);
1744 if (ioctl(bus
->input_fd
, KDBUS_CMD_BYEBYE
, &byebye
) < 0)
1750 int bus_kernel_drop_one(int fd
) {
1751 struct kdbus_cmd_recv recv
= {
1752 .size
= sizeof(recv
),
1753 .flags
= KDBUS_RECV_DROP
,
1758 if (ioctl(fd
, KDBUS_CMD_RECV
, &recv
) < 0)
1764 int bus_kernel_realize_attach_flags(sd_bus
*bus
) {
1765 struct kdbus_cmd
*update
;
1766 struct kdbus_item
*n
;
1769 assert(bus
->is_kernel
);
1771 update
= alloca0_align(offsetof(struct kdbus_cmd
, items
) +
1772 ALIGN8(offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t)),
1776 n
->type
= KDBUS_ITEM_ATTACH_FLAGS_RECV
;
1777 n
->size
= offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t);
1778 n
->data64
[0] = bus
->attach_flags
;
1781 offsetof(struct kdbus_cmd
, items
) +
1784 if (ioctl(bus
->input_fd
, KDBUS_CMD_UPDATE
, update
) < 0)
1790 int bus_kernel_get_bus_name(sd_bus
*bus
, char **name
) {
1791 struct kdbus_cmd_info cmd
= {
1792 .size
= sizeof(struct kdbus_cmd_info
),
1794 struct kdbus_info
*info
;
1795 struct kdbus_item
*item
;
1801 assert(bus
->is_kernel
);
1803 r
= ioctl(bus
->input_fd
, KDBUS_CMD_BUS_CREATOR_INFO
, &cmd
);
1807 info
= (struct kdbus_info
*) ((uint8_t*) bus
->kdbus_buffer
+ cmd
.offset
);
1809 KDBUS_ITEM_FOREACH(item
, info
, items
)
1810 if (item
->type
== KDBUS_ITEM_MAKE_NAME
) {
1811 r
= free_and_strdup(&n
, item
->str
);
1815 bus_kernel_cmd_free(bus
, cmd
.offset
);