diff options
author | Lennart Poettering <lennart@poettering.net> | 2016-11-22 20:19:08 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2016-12-13 21:22:13 +0100 |
commit | 835552511ef5edec94b567441251ada2a37ea333 (patch) | |
tree | 120f0cd18708151cbdfe34e74792e6d24c3da42e /src/core | |
parent | 9ef4e1e5a2d0a9cc50406f1cae05f3918d6f0c2a (diff) |
core: hook up MountFlags= to the transient unit logic
This makes "systemd-run -p MountFlags=shared -t /bin/sh" work, by making
MountFlags= to the list of properties that may be accessed transiently.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/dbus-execute.c | 18 | ||||
-rw-r--r-- | src/core/load-fragment.c | 39 |
2 files changed, 37 insertions, 20 deletions
diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c index 23c1b44573..78b177e107 100644 --- a/src/core/dbus-execute.c +++ b/src/core/dbus-execute.c @@ -34,6 +34,7 @@ #include "fileio.h" #include "ioprio.h" #include "missing.h" +#include "mount-util.h" #include "namespace.h" #include "parse-util.h" #include "path-util.h" @@ -1613,8 +1614,23 @@ int bus_exec_context_set_transient_property( } return 1; - } + } else if (streq(name, "MountFlags")) { + uint64_t flags; + + r = sd_bus_message_read(message, "t", &flags); + if (r < 0) + return r; + if (!IN_SET(flags, 0, MS_SHARED, MS_PRIVATE, MS_SLAVE)) + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown mount propagation flags"); + if (mode != UNIT_CHECK) { + c->mount_flags = flags; + + unit_write_drop_in_private_format(u, mode, name, "%s=%s", name, strempty(mount_propagation_flags_to_string(flags))); + } + + return 1; + } ri = rlimit_from_string(name); if (ri < 0) { soft = endswith(name, "Soft"); diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 687cd1dd31..a2e7097de0 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -49,6 +49,7 @@ #include "load-fragment.h" #include "log.h" #include "missing.h" +#include "mount-util.h" #include "parse-util.h" #include "path-util.h" #include "process-util.h" @@ -1264,19 +1265,20 @@ int config_parse_sysv_priority(const char *unit, DEFINE_CONFIG_PARSE_ENUM(config_parse_exec_utmp_mode, exec_utmp_mode, ExecUtmpMode, "Failed to parse utmp mode"); DEFINE_CONFIG_PARSE_ENUM(config_parse_kill_mode, kill_mode, KillMode, "Failed to parse kill mode"); -int config_parse_exec_mount_flags(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_exec_mount_flags( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { - unsigned long flags = 0; + unsigned long flags; ExecContext *c = data; assert(filename); @@ -1284,15 +1286,14 @@ int config_parse_exec_mount_flags(const char *unit, assert(rvalue); assert(data); - if (streq(rvalue, "shared")) - flags = MS_SHARED; - else if (streq(rvalue, "slave")) - flags = MS_SLAVE; - else if (streq(rvalue, "private")) - flags = MS_PRIVATE; + if (isempty(rvalue)) + flags = 0; else { - log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse mount flag %s, ignoring.", rvalue); - return 0; + flags = mount_propagation_flags_from_string(rvalue); + if (flags == 0) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse mount flag %s, ignoring.", rvalue); + return 0; + } } c->mount_flags = flags; |