summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUmut Tezduyar <umut@tezduyar.com>2013-06-09 07:08:46 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-06-20 16:27:45 -0400
commit97d0e5f83ba4dd713170f802b90149b7325bc992 (patch)
tree21bd3c2a72f7d2c352513f1ceaf6ca0505889a4c
parent8c1396b1c2dfecbb59af61064f6a0f624385004d (diff)
manager: add DefaultEnvironment option
This complements existing functionality of setting variables through 'systemctl set-environment', the kernel command line, and through normal environment variables for systemd in session mode.
-rw-r--r--man/systemd-system.conf.xml21
-rw-r--r--man/systemd.exec.xml5
-rw-r--r--src/core/load-fragment.c8
-rw-r--r--src/core/main.c5
-rw-r--r--src/core/manager.c12
-rw-r--r--src/core/manager.h1
-rw-r--r--src/core/system.conf1
7 files changed, 49 insertions, 4 deletions
diff --git a/man/systemd-system.conf.xml b/man/systemd-system.conf.xml
index d8bfd1279d..5886855407 100644
--- a/man/systemd-system.conf.xml
+++ b/man/systemd-system.conf.xml
@@ -263,6 +263,27 @@
</varlistentry>
<varlistentry>
+ <term><varname>DefaultEnvironment=</varname></term>
+
+ <listitem><para>Sets systemd manager
+ environment variables for executed
+ processes. Takes a space-separated
+ list of variable assignments.
+ </para>
+
+ <para>Example:
+ <programlisting>Environment="VAR1=word1 word2" VAR2=word3 "VAR3=word 5 6"</programlisting>
+ gives three variables <literal>VAR1</literal>,
+ <literal>VAR2</literal>, <literal>VAR3</literal>.
+ </para>
+
+ <para>
+ See
+ <citerefentry><refentrytitle>environ</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+ for details about environment variables.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><varname>DefaultLimitCPU=</varname></term>
<term><varname>DefaultLimitFSIZE=</varname></term>
<term><varname>DefaultLimitDATA=</varname></term>
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index ab1712efeb..8d5948ab07 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -288,8 +288,9 @@
variables is reset, all prior
assignments have no effect.
Variable expansion is not performed
- inside the strings, and $ has no special
- meaning.
+ inside the strings, however, specifier
+ expansion is possible. $ character has
+ no special meaning.
If you need to assign a value containing spaces
to a variable, use double quotes (")
for the assignment.</para>
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 4a835b6e8b..15fabe860e 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -1564,7 +1564,7 @@ int config_parse_environ(const char *unit,
assert(filename);
assert(lvalue);
assert(rvalue);
- assert(u);
+ assert(data);
if (isempty(rvalue)) {
/* Empty assignment resets the list */
@@ -1573,7 +1573,11 @@ int config_parse_environ(const char *unit,
return 0;
}
- k = unit_full_printf(u, rvalue);
+ if (u)
+ k = unit_full_printf(u, rvalue);
+ else
+ k = strdup(rvalue);
+
if (!k)
return log_oom();
diff --git a/src/core/main.c b/src/core/main.c
index 26aa561218..470fecf15d 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -94,6 +94,7 @@ static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
static usec_t arg_runtime_watchdog = 0;
static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
+static char **arg_default_environment = NULL;
static struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {};
static uint64_t arg_capability_bounding_set_drop = 0;
static nsec_t arg_timer_slack_nsec = (nsec_t) -1;
@@ -646,6 +647,7 @@ static int parse_config_file(void) {
{ "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
{ "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
{ "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
+ { "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
{ "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU]},
{ "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE]},
{ "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA]},
@@ -1630,6 +1632,9 @@ int main(int argc, char *argv[]) {
if (arg_default_controllers)
manager_set_default_controllers(m, arg_default_controllers);
+ if (arg_default_environment)
+ manager_set_default_environment(m, arg_default_environment);
+
manager_set_show_status(m, arg_show_status);
/* Remember whether we should queue the default job */
diff --git a/src/core/manager.c b/src/core/manager.c
index f16621ac2b..5c3a2c72f3 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -2570,6 +2570,18 @@ void manager_undo_generators(Manager *m) {
remove_generator_dir(m, &m->generator_unit_path_late);
}
+int manager_set_default_environment(Manager *m, char **environment) {
+
+ char **e = NULL;
+ assert(m);
+ e = strv_env_merge(2, m->environment, environment);
+ if (!e)
+ return -ENOMEM;
+ strv_free(m->environment);
+ m->environment = e;
+ return 0;
+}
+
int manager_set_default_controllers(Manager *m, char **controllers) {
char **l;
diff --git a/src/core/manager.h b/src/core/manager.h
index e21c8f7abf..f0bb2eb035 100644
--- a/src/core/manager.h
+++ b/src/core/manager.h
@@ -272,6 +272,7 @@ unsigned manager_dispatch_load_queue(Manager *m);
unsigned manager_dispatch_run_queue(Manager *m);
unsigned manager_dispatch_dbus_queue(Manager *m);
+int manager_set_default_environment(Manager *m, char **environment);
int manager_set_default_controllers(Manager *m, char **controllers);
int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
diff --git a/src/core/system.conf b/src/core/system.conf
index 508e0f5fa4..f2817bc507 100644
--- a/src/core/system.conf
+++ b/src/core/system.conf
@@ -25,6 +25,7 @@
#ShutdownWatchdogSec=10min
#CapabilityBoundingSet=
#TimerSlackNSec=
+#DefaultEnvironment=
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=