dbus1: hook busnames.target into normal boot if kdbus is enabled

This commit is contained in:
Lennart Poettering
2013-12-03 01:41:02 +01:00
parent 4c3a127cb6
commit 5c817d31d9
+46 -20
View File
@@ -43,6 +43,7 @@ static int create_dbus_files(
assert(path);
assert(name);
assert(service || exec);
if (!service) {
_cleanup_free_ char *a = NULL;
@@ -64,7 +65,7 @@ static int create_dbus_files(
fprintf(f,
"# Automatically generated by systemd-dbus1-generator\n\n"
"[Unit]\n"
"Source=%s\n"
"SourcePath=%s\n"
"Description=DBUS1: %s\n\n"
"[Service]\n"
"ExecStart=%s\n"
@@ -110,7 +111,7 @@ static int create_dbus_files(
fprintf(f,
"# Automatically generated by systemd-dbus1-generator\n\n"
"[Unit]\n"
"Source=%s\n"
"SourcePath=%s\n"
"Description=DBUS1: %s\n\n"
"[BusName]\n"
"Name=%s\n"
@@ -132,7 +133,7 @@ static int create_dbus_files(
mkdir_parents_label(lnk, 0755);
if (symlink(b, lnk)) {
log_error("Failed to create symlinks %s: %m", lnk);
log_error("Failed to create symlink %s: %m", lnk);
return -errno;
}
@@ -212,25 +213,15 @@ static int add_dbus(const char *path, const char *fname, const char *type) {
return create_dbus_files(p, name, service, exec, user, type);
}
static int parse_dbus_fragments(void) {
static int parse_dbus_fragments(const char *path, const char *type) {
_cleanup_closedir_ DIR *d = NULL;
struct dirent *de;
const char *p, *type;
int r;
r = cg_pid_get_owner_uid(0, NULL);
if (r >= 0) {
p = "/usr/share/dbus-1/services";
type = "session";
} else if (r == -ENOENT) {
p = "/usr/share/dbus-1/system-services";
type = "system";
} else if (r < 0) {
log_error("Failed to determine whether we are running as user or system instance: %s", strerror(-r));
return r;
}
assert(path);
assert(type);
d = opendir(p);
d = opendir(path);
if (!d) {
if (errno == -ENOENT)
return 0;
@@ -246,7 +237,7 @@ static int parse_dbus_fragments(void) {
if (!endswith(de->d_name, ".service"))
continue;
q = add_dbus(p, de->d_name, type);
q = add_dbus(path, de->d_name, type);
if (q < 0)
r = q;
}
@@ -258,8 +249,24 @@ fail:
return -errno;
}
static int link_busnames_target(const char *units) {
const char *f, *t;
f = strappenda(units, "/" SPECIAL_BUSNAMES_TARGET);
t = strappenda(arg_dest, "/" SPECIAL_BASIC_TARGET ".wants/" SPECIAL_BUSNAMES_TARGET);
mkdir_parents_label(t, 0755);
if (symlink(f, t) < 0) {
log_error("Failed to create symlink %s: %m", t);
return -errno;
}
return 0;
}
int main(int argc, char *argv[]) {
int r;
const char *path, *type, *units;
int r, q;
if (argc > 1 && argc != 4) {
log_error("This program takes three or no arguments.");
@@ -278,7 +285,26 @@ int main(int argc, char *argv[]) {
if (access("/dev/kdbus/control", F_OK) < 0)
return 0;
r = parse_dbus_fragments();
r = cg_pid_get_owner_uid(0, NULL);
if (r >= 0) {
path = "/usr/share/dbus-1/services";
type = "session";
units = USER_DATA_UNIT_PATH;
} else if (r == -ENOENT) {
path = "/usr/share/dbus-1/system-services";
type = "system";
units = SYSTEM_DATA_UNIT_PATH;
} else if (r < 0) {
log_error("Failed to determine whether we are running as user or system instance: %s", strerror(-r));
return r;
}
r = parse_dbus_fragments(path, type);
/* FIXME: One day this should just be pulled in statically from basic.target */
q = link_busnames_target(units);
if (q < 0)
r = q;
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}