Merge pull request #932 from kaysievers/bus
sd-bus: do not connect to dbus-1 socket when kdbus is available
This commit is contained in:
@@ -63,7 +63,6 @@
|
||||
|
||||
#define UNIX_SYSTEM_BUS_ADDRESS "unix:path=/var/run/dbus/system_bus_socket"
|
||||
#define KERNEL_SYSTEM_BUS_ADDRESS "kernel:path=/sys/fs/kdbus/0-system/bus"
|
||||
#define DEFAULT_SYSTEM_BUS_ADDRESS KERNEL_SYSTEM_BUS_ADDRESS ";" UNIX_SYSTEM_BUS_ADDRESS
|
||||
#define UNIX_USER_BUS_ADDRESS_FMT "unix:path=%s/bus"
|
||||
#define KERNEL_USER_BUS_ADDRESS_FMT "kernel:path=/sys/fs/kdbus/"UID_FMT"-user/bus"
|
||||
|
||||
|
||||
@@ -177,8 +177,9 @@ static int help(void) {
|
||||
" --configuration=PATH Configuration file or directory\n"
|
||||
" --machine=MACHINE Connect to specified machine\n"
|
||||
" --address=ADDRESS Connect to the bus specified by ADDRESS\n"
|
||||
" (default: " DEFAULT_SYSTEM_BUS_ADDRESS ")\n",
|
||||
program_invocation_short_name);
|
||||
" (default: %s)\n",
|
||||
program_invocation_short_name,
|
||||
is_kdbus_available() ? KERNEL_SYSTEM_BUS_ADDRESS : UNIX_SYSTEM_BUS_ADDRESS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -262,7 +263,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
if (!arg_address) {
|
||||
arg_address = strdup(DEFAULT_SYSTEM_BUS_ADDRESS);
|
||||
arg_address = strdup(is_kdbus_available() ? KERNEL_SYSTEM_BUS_ADDRESS : UNIX_SYSTEM_BUS_ADDRESS);
|
||||
if (!arg_address)
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
@@ -50,8 +50,9 @@ static int help(void) {
|
||||
" --version Show package version\n"
|
||||
" --machine=MACHINE Connect to specified machine\n"
|
||||
" --address=ADDRESS Connect to the bus specified by ADDRESS\n"
|
||||
" (default: " DEFAULT_SYSTEM_BUS_ADDRESS ")\n",
|
||||
program_invocation_short_name);
|
||||
" (default: %s)\n",
|
||||
program_invocation_short_name,
|
||||
is_kdbus_available() ? KERNEL_SYSTEM_BUS_ADDRESS : UNIX_SYSTEM_BUS_ADDRESS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -137,7 +138,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
if (!arg_address) {
|
||||
arg_address = strdup(DEFAULT_SYSTEM_BUS_ADDRESS);
|
||||
arg_address = strdup(is_kdbus_available() ? KERNEL_SYSTEM_BUS_ADDRESS : UNIX_SYSTEM_BUS_ADDRESS);
|
||||
if (!arg_address)
|
||||
return log_oom();
|
||||
}
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
#include "path-util.h"
|
||||
#include "dbus-automount.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-error.h"
|
||||
#include "formats-util.h"
|
||||
#include "process-util.h"
|
||||
#include "async.h"
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
#include "utf8.h"
|
||||
#include "env-util.h"
|
||||
#include "fileio.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-kernel.h"
|
||||
#include "formats-util.h"
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
#include "def.h"
|
||||
#include "smack-util.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-error.h"
|
||||
#include "selinux-util.h"
|
||||
#include "dbus-socket.h"
|
||||
#include "unit.h"
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "dbus-timer.h"
|
||||
#include "special.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-error.h"
|
||||
|
||||
static const UnitActiveState state_translation_table[_TIMER_STATE_MAX] = {
|
||||
[TIMER_DEAD] = UNIT_INACTIVE,
|
||||
|
||||
@@ -84,7 +84,8 @@ static int create_dbus_files(
|
||||
fprintf(f, "Environment=DBUS_STARTER_BUS_TYPE=%s\n", type);
|
||||
|
||||
if (streq(type, "system"))
|
||||
fprintf(f, "Environment=DBUS_STARTER_ADDRESS=" DEFAULT_SYSTEM_BUS_ADDRESS "\n");
|
||||
fprintf(f, "Environment=DBUS_STARTER_ADDRESS=%s\n",
|
||||
is_kdbus_available() ? KERNEL_SYSTEM_BUS_ADDRESS : UNIX_SYSTEM_BUS_ADDRESS);
|
||||
else if (streq(type, "session")) {
|
||||
char *run;
|
||||
|
||||
@@ -94,8 +95,10 @@ static int create_dbus_files(
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
fprintf(f, "Environment=DBUS_STARTER_ADDRESS="KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT "\n",
|
||||
getuid(), run);
|
||||
if (is_kdbus_available())
|
||||
fprintf(f, "Environment=DBUS_STARTER_ADDRESS="KERNEL_USER_BUS_ADDRESS_FMT "\n", getuid());
|
||||
else
|
||||
fprintf(f, "Environment=DBUS_STARTER_ADDRESS="UNIX_USER_BUS_ADDRESS_FMT "\n", run);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#include "bus-message.h"
|
||||
#include "bus-control.h"
|
||||
#include "bus-bloom.h"
|
||||
#include "bus-util.h"
|
||||
#include "capability.h"
|
||||
|
||||
_public_ int sd_bus_get_unique_name(sd_bus *bus, const char **unique) {
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "bus-internal.h"
|
||||
#include "bus-message.h"
|
||||
#include "bus-signature.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-type.h"
|
||||
|
||||
_public_ int sd_bus_emit_signal(
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
#include "fileio.h"
|
||||
#include "audit.h"
|
||||
#include "bus-message.h"
|
||||
#include "bus-util.h"
|
||||
#include "strv.h"
|
||||
#include "bus-creds.h"
|
||||
#include "bus-label.h"
|
||||
#include "bus-internal.h"
|
||||
|
||||
enum {
|
||||
CAP_OFFSET_INHERITABLE = 0,
|
||||
|
||||
@@ -371,3 +371,45 @@ int bus_maybe_reply_error(sd_bus_message *m, int r, sd_bus_error *error) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool is_kdbus_wanted(void) {
|
||||
_cleanup_free_ char *value = NULL;
|
||||
#ifdef ENABLE_KDBUS
|
||||
const bool configured = true;
|
||||
#else
|
||||
const bool configured = false;
|
||||
#endif
|
||||
int r;
|
||||
|
||||
if (get_proc_cmdline_key("kdbus", NULL) > 0)
|
||||
return true;
|
||||
|
||||
r = get_proc_cmdline_key("kdbus=", &value);
|
||||
if (r <= 0)
|
||||
return configured;
|
||||
|
||||
return parse_boolean(value) == 1;
|
||||
}
|
||||
|
||||
bool is_kdbus_available(void) {
|
||||
static int cached = -1;
|
||||
_cleanup_close_ int fd = -1;
|
||||
struct kdbus_cmd cmd = { .size = sizeof(cmd), .flags = KDBUS_FLAG_NEGOTIATE };
|
||||
|
||||
if (cached >= 0)
|
||||
return (bool) cached;
|
||||
|
||||
if (!is_kdbus_wanted()) {
|
||||
cached = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
fd = open("/sys/fs/kdbus/control", O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY);
|
||||
if (fd < 0) {
|
||||
cached = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
cached = ioctl(fd, KDBUS_CMD_BUS_MAKE, &cmd) >= 0;
|
||||
return cached;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,29 @@
|
||||
#include "bus-kernel.h"
|
||||
#include "kdbus.h"
|
||||
|
||||
typedef enum BusTransport {
|
||||
BUS_TRANSPORT_LOCAL,
|
||||
BUS_TRANSPORT_REMOTE,
|
||||
BUS_TRANSPORT_MACHINE,
|
||||
_BUS_TRANSPORT_MAX,
|
||||
_BUS_TRANSPORT_INVALID = -1
|
||||
} BusTransport;
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_flush_close_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_slot*, sd_bus_slot_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_message*, sd_bus_message_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_creds*, sd_bus_creds_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_track*, sd_bus_track_unref);
|
||||
|
||||
#define _cleanup_bus_unref_ _cleanup_(sd_bus_unrefp)
|
||||
#define _cleanup_bus_flush_close_unref_ _cleanup_(sd_bus_flush_close_unrefp)
|
||||
#define _cleanup_bus_slot_unref_ _cleanup_(sd_bus_slot_unrefp)
|
||||
#define _cleanup_bus_message_unref_ _cleanup_(sd_bus_message_unrefp)
|
||||
#define _cleanup_bus_creds_unref_ _cleanup_(sd_bus_creds_unrefp)
|
||||
#define _cleanup_bus_track_unref_ _cleanup_(sd_bus_slot_unrefp)
|
||||
#define _cleanup_bus_error_free_ _cleanup_(sd_bus_error_free)
|
||||
|
||||
struct reply_callback {
|
||||
sd_bus_message_handler_t callback;
|
||||
usec_t timeout;
|
||||
@@ -393,3 +416,6 @@ int bus_remove_match_by_string(sd_bus *bus, const char *match, sd_bus_message_ha
|
||||
int bus_get_root_path(sd_bus *bus);
|
||||
|
||||
int bus_maybe_reply_error(sd_bus_message *m, int r, sd_bus_error *error);
|
||||
|
||||
bool is_kdbus_wanted(void);
|
||||
bool is_kdbus_available(void);
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
#include "bus-message.h"
|
||||
#include "bus-kernel.h"
|
||||
#include "bus-bloom.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-label.h"
|
||||
|
||||
#define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "bus-internal.h"
|
||||
#include "bus-message.h"
|
||||
#include "bus-match.h"
|
||||
#include "bus-util.h"
|
||||
#include "strv.h"
|
||||
|
||||
/* Example:
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#include "bus-type.h"
|
||||
#include "bus-signature.h"
|
||||
#include "bus-gvariant.h"
|
||||
#include "bus-util.h"
|
||||
|
||||
static int message_append_basic(sd_bus_message *m, char type, const void *p, const void **stored);
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "bus-type.h"
|
||||
#include "bus-signature.h"
|
||||
#include "bus-introspect.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-slot.h"
|
||||
#include "bus-objects.h"
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
***/
|
||||
|
||||
#include "sd-bus.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-track.h"
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "set.h"
|
||||
|
||||
#include "sd-bus.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-dump.h"
|
||||
#include "bus-signature.h"
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
#include "bus-kernel.h"
|
||||
#include "bus-control.h"
|
||||
#include "bus-objects.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-container.h"
|
||||
#include "bus-protocol.h"
|
||||
#include "bus-track.h"
|
||||
@@ -1173,7 +1172,10 @@ int bus_set_address_system(sd_bus *b) {
|
||||
if (e)
|
||||
return sd_bus_set_address(b, e);
|
||||
|
||||
return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
|
||||
if (is_kdbus_available())
|
||||
return sd_bus_set_address(b, KERNEL_SYSTEM_BUS_ADDRESS);
|
||||
|
||||
return sd_bus_set_address(b, UNIX_SYSTEM_BUS_ADDRESS);
|
||||
}
|
||||
|
||||
_public_ int sd_bus_open_system(sd_bus **ret) {
|
||||
@@ -1221,16 +1223,17 @@ int bus_set_address_user(sd_bus *b) {
|
||||
return sd_bus_set_address(b, e);
|
||||
|
||||
e = secure_getenv("XDG_RUNTIME_DIR");
|
||||
if (e) {
|
||||
if (is_kdbus_available())
|
||||
(void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
|
||||
else if (e) {
|
||||
_cleanup_free_ char *ee = NULL;
|
||||
|
||||
ee = bus_address_escape(e);
|
||||
if (!ee)
|
||||
return -ENOMEM;
|
||||
|
||||
(void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, getuid(), ee);
|
||||
} else
|
||||
(void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
|
||||
(void) asprintf(&b->address, UNIX_USER_BUS_ADDRESS_FMT, ee);
|
||||
}
|
||||
|
||||
if (!b->address)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "sd-bus.h"
|
||||
#include "bus-kernel.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-util.h"
|
||||
|
||||
#define MAX_SIZE (2*1024*1024)
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#include "bus-error.h"
|
||||
#include "bus-match.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-util.h"
|
||||
|
||||
static int match_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
|
||||
log_info("Match triggered! interface=%s member=%s", strna(sd_bus_message_get_interface(m)), strna(sd_bus_message_get_member(m)));
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "sd-bus.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-message.h"
|
||||
#include "refcnt.h"
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
***/
|
||||
|
||||
#include "sd-bus.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-util.h"
|
||||
#include "errno-list.h"
|
||||
#include "bus-common-errors.h"
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "macro.h"
|
||||
#include "sd-bus.h"
|
||||
#include "bus-gvariant.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-message.h"
|
||||
#include "bus-dump.h"
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
#include "log.h"
|
||||
|
||||
#include "sd-bus.h"
|
||||
#include "bus-kernel.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-kernel.h"
|
||||
#include "bus-dump.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#include "bus-match.h"
|
||||
#include "bus-message.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-slot.h"
|
||||
|
||||
static bool mask[32];
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "sd-bus.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-message.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-dump.h"
|
||||
|
||||
struct context {
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
|
||||
#include "sd-bus.h"
|
||||
#include "bus-internal.h"
|
||||
#include "bus-util.h"
|
||||
|
||||
struct context {
|
||||
int fds[2];
|
||||
|
||||
@@ -2027,37 +2027,3 @@ int bus_path_decode_unique(const char *path, const char *prefix, char **ret_send
|
||||
*ret_external = external;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool is_kdbus_wanted(void) {
|
||||
_cleanup_free_ char *value = NULL;
|
||||
#ifdef ENABLE_KDBUS
|
||||
const bool configured = true;
|
||||
#else
|
||||
const bool configured = false;
|
||||
#endif
|
||||
|
||||
int r;
|
||||
|
||||
if (get_proc_cmdline_key("kdbus", NULL) > 0)
|
||||
return true;
|
||||
|
||||
r = get_proc_cmdline_key("kdbus=", &value);
|
||||
if (r <= 0)
|
||||
return configured;
|
||||
|
||||
return parse_boolean(value) == 1;
|
||||
}
|
||||
|
||||
bool is_kdbus_available(void) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
struct kdbus_cmd cmd = { .size = sizeof(cmd), .flags = KDBUS_FLAG_NEGOTIATE };
|
||||
|
||||
if (!is_kdbus_wanted())
|
||||
return false;
|
||||
|
||||
fd = open("/sys/fs/kdbus/control", O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY);
|
||||
if (fd < 0)
|
||||
return false;
|
||||
|
||||
return ioctl(fd, KDBUS_CMD_BUS_MAKE, &cmd) >= 0;
|
||||
}
|
||||
|
||||
+2
-26
@@ -23,18 +23,12 @@
|
||||
|
||||
#include "sd-event.h"
|
||||
#include "sd-bus.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-internal.h"
|
||||
#include "hashmap.h"
|
||||
#include "install.h"
|
||||
#include "time-util.h"
|
||||
|
||||
typedef enum BusTransport {
|
||||
BUS_TRANSPORT_LOCAL,
|
||||
BUS_TRANSPORT_REMOTE,
|
||||
BUS_TRANSPORT_MACHINE,
|
||||
_BUS_TRANSPORT_MAX,
|
||||
_BUS_TRANSPORT_INVALID = -1
|
||||
} BusTransport;
|
||||
|
||||
typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
|
||||
|
||||
struct bus_properties_map {
|
||||
@@ -135,21 +129,6 @@ typedef struct UnitInfo {
|
||||
|
||||
int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u);
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_flush_close_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_slot*, sd_bus_slot_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_message*, sd_bus_message_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_creds*, sd_bus_creds_unref);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_track*, sd_bus_track_unref);
|
||||
|
||||
#define _cleanup_bus_unref_ _cleanup_(sd_bus_unrefp)
|
||||
#define _cleanup_bus_flush_close_unref_ _cleanup_(sd_bus_flush_close_unrefp)
|
||||
#define _cleanup_bus_slot_unref_ _cleanup_(sd_bus_slot_unrefp)
|
||||
#define _cleanup_bus_message_unref_ _cleanup_(sd_bus_message_unrefp)
|
||||
#define _cleanup_bus_creds_unref_ _cleanup_(sd_bus_creds_unrefp)
|
||||
#define _cleanup_bus_track_unref_ _cleanup_(sd_bus_slot_unrefp)
|
||||
#define _cleanup_bus_error_free_ _cleanup_(sd_bus_error_free)
|
||||
|
||||
#define BUS_DEFINE_PROPERTY_GET_ENUM(function, name, type) \
|
||||
int function(sd_bus *bus, \
|
||||
const char *path, \
|
||||
@@ -197,6 +176,3 @@ int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, Un
|
||||
|
||||
int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path);
|
||||
int bus_path_decode_unique(const char *path, const char *prefix, char **ret_sender, char **ret_external);
|
||||
|
||||
bool is_kdbus_wanted(void);
|
||||
bool is_kdbus_available(void);
|
||||
|
||||
Reference in New Issue
Block a user