summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am6
-rw-r--r--src/core/busname.c57
-rw-r--r--src/core/busname.h2
-rw-r--r--src/core/load-fragment-gperf.gperf.m41
-rw-r--r--src/libsystemd/sd-bus/bus-kernel.c6
-rw-r--r--src/libsystemd/sd-bus/bus-kernel.h2
-rw-r--r--units/org.freedesktop.systemd1.busname15
7 files changed, 63 insertions, 26 deletions
diff --git a/Makefile.am b/Makefile.am
index f0cfe46e76..65a7ffeb27 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3851,10 +3851,12 @@ nodist_systemunit_DATA += \
units/systemd-bus-driverd.service
dist_systemunit_DATA += \
- units/org.freedesktop.DBus.busname
+ units/org.freedesktop.DBus.busname \
+ units/org.freedesktop.systemd1.busname
BUSNAMES_TARGET_WANTS += \
- org.freedesktop.DBus.busname
+ org.freedesktop.DBus.busname \
+ org.freedesktop.systemd1.busname
nodist_userunit_DATA += \
units/user/systemd-bus-driverd.service
diff --git a/src/core/busname.c b/src/core/busname.c
index ccef32e9e7..0cae20d2d1 100644
--- a/src/core/busname.c
+++ b/src/core/busname.c
@@ -29,6 +29,7 @@
static const UnitActiveState state_translation_table[_BUSNAME_STATE_MAX] = {
[BUSNAME_DEAD] = UNIT_INACTIVE,
+ [BUSNAME_REGISTERED] = UNIT_ACTIVE,
[BUSNAME_LISTENING] = UNIT_ACTIVE,
[BUSNAME_RUNNING] = UNIT_ACTIVE,
[BUSNAME_FAILED] = UNIT_FAILED
@@ -96,20 +97,22 @@ static int busname_add_extras(BusName *n) {
return r;
}
- if (!UNIT_DEREF(n->service)) {
- Unit *x;
+ if (n->activating) {
+ if (!UNIT_DEREF(n->service)) {
+ Unit *x;
- r = unit_load_related_unit(u, ".service", &x);
+ r = unit_load_related_unit(u, ".service", &x);
+ if (r < 0)
+ return r;
+
+ unit_ref_set(&n->service, x);
+ }
+
+ r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(n->service), true);
if (r < 0)
return r;
-
- unit_ref_set(&n->service, x);
}
- r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(n->service), true);
- if (r < 0)
- return r;
-
if (u->default_dependencies) {
r = busname_add_default_default_dependencies(n);
if (r < 0)
@@ -172,10 +175,12 @@ static void busname_dump(Unit *u, FILE *f, const char *prefix) {
"%sBus Name State: %s\n"
"%sResult: %s\n"
"%sName: %s\n"
+ "%sActivating: %s\n"
"%sAccept FD: %s\n",
prefix, busname_state_to_string(n->state),
prefix, busname_result_to_string(n->result),
prefix, n->name,
+ prefix, yes_no(n->activating),
prefix, yes_no(n->accept_fd));
}
@@ -231,7 +236,7 @@ static int busname_open_fd(BusName *n) {
n->starter_fd = bus_kernel_create_starter(
UNIT(n)->manager->running_as == SYSTEMD_SYSTEM ? "system" : "user",
- n->name, n->accept_fd, n->policy);
+ n->name, n->activating, n->accept_fd, n->policy);
if (n->starter_fd < 0) {
log_warning_unit(UNIT(n)->id, "Failed to create starter fd: %s", strerror(-n->starter_fd));
@@ -251,7 +256,7 @@ static void busname_set_state(BusName *n, BusNameState state) {
if (state != BUSNAME_LISTENING)
busname_unwatch_fd(n);
- if (!IN_SET(state, BUSNAME_LISTENING, BUSNAME_RUNNING))
+ if (!IN_SET(state, BUSNAME_LISTENING, BUSNAME_REGISTERED, BUSNAME_RUNNING))
busname_close_fd(n);
if (state != old_state)
@@ -271,7 +276,7 @@ static int busname_coldplug(Unit *u) {
if (n->deserialized_state == n->state)
return 0;
- if (IN_SET(n->deserialized_state, BUSNAME_LISTENING, BUSNAME_RUNNING)) {
+ if (IN_SET(n->deserialized_state, BUSNAME_LISTENING, BUSNAME_REGISTERED, BUSNAME_RUNNING)) {
r = busname_open_fd(n);
if (r < 0)
return r;
@@ -303,17 +308,23 @@ static void busname_enter_listening(BusName *n) {
r = busname_open_fd(n);
if (r < 0) {
- log_warning_unit(UNIT(n)->id, "%s failed to listen on bus names: %s", UNIT(n)->id, strerror(-r));
+ log_warning_unit(UNIT(n)->id, "%s failed to %s: %s", UNIT(n)->id,
+ n->activating ? "listen on bus name" : "register policy for name",
+ strerror(-r));
goto fail;
}
- r = busname_watch_fd(n);
- if (r < 0) {
- log_warning_unit(UNIT(n)->id, "%s failed to watch names: %s", UNIT(n)->id, strerror(-r));
- goto fail;
- }
+ if (n->activating) {
+ r = busname_watch_fd(n);
+ if (r < 0) {
+ log_warning_unit(UNIT(n)->id, "%s failed to watch names: %s", UNIT(n)->id, strerror(-r));
+ goto fail;
+ }
+
+ busname_set_state(n, BUSNAME_LISTENING);
+ } else
+ busname_set_state(n, BUSNAME_REGISTERED);
- busname_set_state(n, BUSNAME_LISTENING);
return;
fail:
@@ -329,6 +340,9 @@ static void busname_enter_running(BusName *n) {
assert(n);
+ if (!n->activating)
+ return;
+
/* We don't take conenctions anymore if we are supposed to
* shut down anyway */
@@ -369,7 +383,7 @@ static int busname_start(Unit *u) {
assert(n);
- if (UNIT_ISSET(n->service)) {
+ if (n->activating && UNIT_ISSET(n->service)) {
Service *service;
service = SERVICE(UNIT_DEREF(n->service));
@@ -392,7 +406,7 @@ static int busname_stop(Unit *u) {
BusName *n = BUSNAME(u);
assert(n);
- assert(n->state == BUSNAME_LISTENING || n->state == BUSNAME_RUNNING);
+ assert(IN_SET(n->state, BUSNAME_REGISTERED, BUSNAME_LISTENING, BUSNAME_RUNNING));
busname_enter_dead(n, BUSNAME_SUCCESS);
return 0;
@@ -536,6 +550,7 @@ static void busname_trigger_notify(Unit *u, Unit *other) {
static const char* const busname_state_table[_BUSNAME_STATE_MAX] = {
[BUSNAME_DEAD] = "dead",
+ [BUSNAME_REGISTERED] = "registered",
[BUSNAME_LISTENING] = "listening",
[BUSNAME_RUNNING] = "running",
[BUSNAME_FAILED] = "failed"
diff --git a/src/core/busname.h b/src/core/busname.h
index 7f591974de..0009c6a65e 100644
--- a/src/core/busname.h
+++ b/src/core/busname.h
@@ -28,6 +28,7 @@ typedef struct BusNamePolicy BusNamePolicy;
typedef enum BusNameState {
BUSNAME_DEAD,
+ BUSNAME_REGISTERED,
BUSNAME_LISTENING,
BUSNAME_RUNNING,
BUSNAME_FAILED,
@@ -48,6 +49,7 @@ struct BusName {
char *name;
int starter_fd;
+ bool activating;
UnitRef service;
diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4
index c793a1e25f..1dd9f2b909 100644
--- a/src/core/load-fragment-gperf.gperf.m4
+++ b/src/core/load-fragment-gperf.gperf.m4
@@ -251,6 +251,7 @@ CGROUP_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
KILL_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
m4_dnl
BusName.Name, config_parse_string, 0, offsetof(BusName, name)
+BusName.Activating, config_parse_bool, 0, offsetof(BusName, activating)
BusName.Service, config_parse_busname_service, 0, 0
BusName.AllowUser, config_parse_bus_policy, 0, 0
BusName.AllowGroup, config_parse_bus_policy, 0, 0
diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c
index 977a7cda40..00f58114ac 100644
--- a/src/libsystemd/sd-bus/bus-kernel.c
+++ b/src/libsystemd/sd-bus/bus-kernel.c
@@ -1378,7 +1378,7 @@ static void bus_kernel_translate_policy(const BusNamePolicy *policy, struct kdbu
}
}
-int bus_kernel_create_starter(const char *bus, const char *name, bool accept_fd, BusNamePolicy *policy) {
+int bus_kernel_create_starter(const char *bus, const char *name, bool activating, bool accept_fd, BusNamePolicy *policy) {
struct kdbus_cmd_hello *hello;
struct kdbus_item *n;
size_t policy_cnt = 0;
@@ -1420,7 +1420,9 @@ int bus_kernel_create_starter(const char *bus, const char *name, bool accept_fd,
}
hello->size = size;
- hello->conn_flags = KDBUS_HELLO_ACTIVATOR | (accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
+ hello->conn_flags =
+ (activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) |
+ (accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
hello->pool_size = KDBUS_POOL_SIZE;
hello->attach_flags = _KDBUS_ATTACH_ALL;
diff --git a/src/libsystemd/sd-bus/bus-kernel.h b/src/libsystemd/sd-bus/bus-kernel.h
index 3a9794fbe3..4ef26fce64 100644
--- a/src/libsystemd/sd-bus/bus-kernel.h
+++ b/src/libsystemd/sd-bus/bus-kernel.h
@@ -67,7 +67,7 @@ int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority);
int bus_kernel_create_bus(const char *name, bool world, char **s);
int bus_kernel_create_domain(const char *name, char **s);
-int bus_kernel_create_starter(const char *bus, const char *name, bool accept_fd, BusNamePolicy *policy);
+int bus_kernel_create_starter(const char *bus, const char *name, bool activating, bool accept_fd, BusNamePolicy *policy);
int bus_kernel_create_monitor(const char *bus);
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *allocated);
diff --git a/units/org.freedesktop.systemd1.busname b/units/org.freedesktop.systemd1.busname
new file mode 100644
index 0000000000..3020f1ab65
--- /dev/null
+++ b/units/org.freedesktop.systemd1.busname
@@ -0,0 +1,15 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=systemd busname unit
+Documentation=man:systemd-hostnamed.service(8)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd
+
+[BusName]
+Activating=no
+AllowWorld=talk