[systemd-devel] [PATCH] manager: add DefaultEnvironment option
Umut Tezduyar
umut at tezduyar.com
Wed Jun 19 23:12:00 PDT 2013
On Sun, Jun 9, 2013 at 7:08 AM, Umut Tezduyar <umut at tezduyar.com> wrote:
> ---
> man/systemd-system.conf.xml | 21 +++++++++++++++++++++
> man/systemd.exec.xml | 5 +++--
> src/core/load-fragment.c | 8 ++++++--
> src/core/main.c | 5 +++++
> src/core/manager.c | 12 ++++++++++++
> src/core/manager.h | 1 +
> src/core/system.conf | 1 +
> 7 files changed, 49 insertions(+), 4 deletions(-)
>
> diff --git a/man/systemd-system.conf.xml b/man/systemd-system.conf.xml
> index d8bfd12..5886855 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 ab1712e..8d5948a 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 e2015ed..53381d3 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 26aa561..470fecf 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 f16621a..5c3a2c7 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 dcc4ebe..1635159 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 508e0f5..f2817bc 100644
> --- a/src/core/system.conf
> +++ b/src/core/system.conf
> @@ -25,6 +25,7 @@
> #ShutdownWatchdogSec=10min
> #CapabilityBoundingSet=
> #TimerSlackNSec=
> +#DefaultEnvironment=
> #DefaultLimitCPU=
> #DefaultLimitFSIZE=
> #DefaultLimitDATA=
> --
> 1.8.2.3
>
Hi. Does anyone have time to look at this?
More information about the systemd-devel
mailing list