#include "util.h"
#include "strv.h"
#include "memfd-util.h"
+#include "cgroup-util.h"
+#include "fileio.h"
#include "bus-internal.h"
#include "bus-message.h"
#include "bus-bloom.h"
#include "bus-util.h"
#include "bus-label.h"
-#include "cgroup-util.h"
#define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
}
}
+ /* If we requested the list of well-known names to be appended
+ * and the sender had none no item for it will be
+ * attached. However, this does *not* mean that we the kernel
+ * didn't want to provide this information to us. Hence, let's
+ * explicitly mark this information as available if it was
+ * requested. */
+ m->creds.mask |= bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES;
+
r = bus_message_parse_fields(m);
if (r < 0)
goto fail;
return 0;
}
+
+int bus_kernel_fix_attach_mask(void) {
+ _cleanup_free_ char *mask = NULL;
+ uint64_t m = (uint64_t) -1;
+ char buf[2+16+2];
+ int r;
+
+ /* By default we don't want any kdbus metadata fields to be
+ * suppressed, hence we reset the kernel mask for it to
+ * (uint64_t) -1. This is overridable via a kernel command
+ * line option, however. */
+
+ r = get_proc_cmdline_key("systemd.kdbus_attach_flags_mask=", &mask);
+ if (r < 0)
+ return log_warning_errno(r, "Failed to read kernel command line: %m");
+
+ if (mask) {
+ const char *p = mask;
+
+ if (startswith(p, "0x"))
+ p += 2;
+
+ if (sscanf(p, "%" PRIx64, &m) != 1)
+ log_warning("Couldn't parse systemd.kdbus_attach_flags_mask= kernel command line parameter.");
+ }
+
+ sprintf(buf, "0x%" PRIx64 "\n", m);
+ r = write_string_file("/sys/module/kdbus/parameters/attach_flags_mask", buf);
+ if (r < 0)
+ return log_full_errno(
+ r == -EROFS ? LOG_DEBUG : LOG_WARNING, r,
+ "Failed to write kdbus attach mask: %m");
+
+ return 0;
+}