#include "unit-name.h"
#include "cgroup-util.h"
-static const char *arg_dest = "/tmp";
+static const char *arg_dest_late = "/tmp", *arg_dest = "/tmp";
static int create_dbus_files(
const char *path,
if (!s)
return log_oom();
- a = strjoin(arg_dest, "/", s, NULL);
+ a = strjoin(arg_dest_late, "/", s, NULL);
if (!a)
return log_oom();
"# Automatically generated by systemd-dbus1-generator\n\n"
"[Unit]\n"
"SourcePath=%s\n"
- "Description=DBUS1: %s\n\n"
+ "Description=DBUS1: %s\n"
+ "Documentation=man:systemd-dbus1-generator(8)\n\n"
"[Service]\n"
"ExecStart=%s\n"
"Type=dbus\n"
fprintf(f, "Environment=DBUS_STARTER_BUS_TYPE=%s\n", type);
if (streq(type, "system"))
- fprintf(f, "Environment=DBUS_STARTER_ADDRESS=kernel:/dev/kdbus/0-system\n");
- else if (streq(type, "session"))
- fprintf(f, "Environment=DBUS_STARTER_ADDRESS=kernel:/dev/kdbus/%lu-user\n", (unsigned long) getuid());
+ fprintf(f, "Environment=DBUS_STARTER_ADDRESS=" DEFAULT_SYSTEM_BUS_PATH "\n");
+ else if (streq(type, "session")) {
+ char *run;
+
+ run = getenv("XDG_RUNTIME_DIR");
+ if (!run) {
+ log_error("XDG_RUNTIME_DIR not set.");
+ return -EINVAL;
+ }
+
+ fprintf(f, "Environment=DBUS_STARTER_ADDRESS="KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT "\n",
+ (unsigned long) getuid(), run);
+ }
}
fflush(f);
service = s;
}
- b = strjoin(arg_dest, "/", name, ".busname", NULL);
+ b = strjoin(arg_dest_late, "/", name, ".busname", NULL);
if (!b)
return log_oom();
"# Automatically generated by systemd-dbus1-generator\n\n"
"[Unit]\n"
"SourcePath=%s\n"
- "Description=DBUS1: %s\n\n"
+ "Description=DBUS1: %s\n"
+ "Documentation=man:systemd-dbus1-generator(8)\n\n"
"[BusName]\n"
"Name=%s\n"
- "Service=%s\n",
+ "Service=%s\n"
+ "AllowWorld=talk\n",
path,
name,
name,
return -errno;
}
- lnk = strjoin(arg_dest, "/" SPECIAL_BUSNAMES_TARGET ".wants/", name, ".busname", NULL);
+ lnk = strjoin(arg_dest_late, "/" SPECIAL_BUSNAMES_TARGET ".wants/", name, ".busname", NULL);
if (!lnk)
return log_oom();
}
if (service) {
- if (!unit_name_is_valid(service, false)) {
+ if (!unit_name_is_valid(service, TEMPLATE_INVALID)) {
log_warning("Unit name %s is not valid, ignoring.", service);
return 0;
}
return 0;
}
+static int link_compatibility(const char *units) {
+ const char *f, *t;
+
+ f = strappenda(units, "/systemd-bus-proxyd.socket");
+ t = strappenda(arg_dest, "/" SPECIAL_DBUS_SOCKET);
+ mkdir_parents_label(t, 0755);
+ if (symlink(f, t) < 0) {
+ log_error("Failed to create symlink %s: %m", t);
+ return -errno;
+ }
+
+ f = strappenda(units, "/systemd-bus-proxyd.socket");
+ t = strappenda(arg_dest, "/" SPECIAL_SOCKETS_TARGET ".wants/systemd-bus-proxyd.socket");
+ mkdir_parents_label(t, 0755);
+ if (symlink(f, t) < 0) {
+ log_error("Failed to create symlink %s: %m", t);
+ return -errno;
+ }
+
+ t = strappenda(arg_dest, "/" SPECIAL_DBUS_SERVICE);
+ if (symlink("/dev/null", t) < 0) {
+ log_error("Failed to mask %s: %m", t);
+ return -errno;
+ }
+
+ return 0;
+}
+
int main(int argc, char *argv[]) {
const char *path, *type, *units;
int r, q;
return EXIT_FAILURE;
}
- if (argc > 1)
- arg_dest = argv[3];
+ if (argc > 1) {
+ arg_dest = argv[1];
+ arg_dest_late = argv[3];
+ }
log_set_target(LOG_TARGET_SAFE);
log_parse_environment();
path = "/usr/share/dbus-1/system-services";
type = "system";
units = SYSTEM_DATA_UNIT_PATH;
- } else if (r < 0) {
+ } else {
log_error("Failed to determine whether we are running as user or system instance: %s", strerror(-r));
return r;
}
if (q < 0)
r = q;
+ q = link_compatibility(units);
+ if (q < 0)
+ r = q;
+
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}