Zbigniew Jędrzejewski-Szmek 794d16
From 0a1d15d3b802128cc9be10c849c29b76a8fae3ed Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 794d16
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 794d16
Date: Wed, 2 Oct 2013 13:23:10 +0200
Zbigniew Jędrzejewski-Szmek 794d16
Subject: [PATCH] execute.c: always set $SHELL
Zbigniew Jędrzejewski-Szmek 794d16
Zbigniew Jędrzejewski-Szmek 794d16
In e6dca81 $SHELL was added to user@.service. Let's
Zbigniew Jędrzejewski-Szmek 794d16
instead provide it to all units which have a user.
Zbigniew Jędrzejewski-Szmek 794d16
---
Zbigniew Jędrzejewski-Szmek 794d16
 TODO                   |  2 --
Zbigniew Jędrzejewski-Szmek 794d16
 man/systemd.exec.xml   | 21 +++++++++++++++++--
Zbigniew Jędrzejewski-Szmek 794d16
 src/core/execute.c     | 56 +++++++++++++++++---------------------------------
Zbigniew Jędrzejewski-Szmek 794d16
 units/user@.service.in |  1 -
Zbigniew Jędrzejewski-Szmek 794d16
 4 files changed, 38 insertions(+), 42 deletions(-)
Zbigniew Jędrzejewski-Szmek 794d16
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/TODO b/TODO
Zbigniew Jędrzejewski-Szmek 794d16
index 07269f4..425f673 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/TODO
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/TODO
Zbigniew Jędrzejewski-Szmek 794d16
@@ -54,8 +54,6 @@ CGroup Rework Completion:
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
 Features:
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-* set $SHELL where we set $HOME and $USER when User= is set of a service, drop its manual setting from user@.service
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
 * we probably should replace the left-over uses of strv_append() and replace them by strv_push() or strv_extend()
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
 * move config_parse_path_strv() out of conf-parser.c
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
Zbigniew Jędrzejewski-Szmek 794d16
index f50161f..e213ec4 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/man/systemd.exec.xml
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/man/systemd.exec.xml
Zbigniew Jędrzejewski-Szmek 794d16
@@ -1021,10 +1021,13 @@
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                         <varlistentry>
Zbigniew Jędrzejewski-Szmek 794d16
                                 <term><varname>$USER</varname></term>
Zbigniew Jędrzejewski-Szmek 794d16
+                                <term><varname>$LOGNAME</varname></term>
Zbigniew Jędrzejewski-Szmek 794d16
                                 <term><varname>$HOME</varname></term>
Zbigniew Jędrzejewski-Szmek 794d16
+                                <term><varname>$SHELL</varname></term>
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                                <listitem><para>User name and home
Zbigniew Jędrzejewski-Szmek 794d16
-                                directory.  Set for the units which
Zbigniew Jędrzejewski-Szmek 794d16
+                                <listitem><para>User name (twice), home
Zbigniew Jędrzejewski-Szmek 794d16
+                                directory, and the login shell.
Zbigniew Jędrzejewski-Szmek 794d16
+                                Set for the units which
Zbigniew Jędrzejewski-Szmek 794d16
                                 have <varname>User=</varname> set,
Zbigniew Jędrzejewski-Szmek 794d16
                                 which includes user
Zbigniew Jędrzejewski-Szmek 794d16
                                 <command>systemd</command> instances.
Zbigniew Jędrzejewski-Szmek 794d16
@@ -1080,6 +1083,20 @@
Zbigniew Jędrzejewski-Szmek 794d16
                                 <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
Zbigniew Jędrzejewski-Szmek 794d16
                                 </para></listitem>
Zbigniew Jędrzejewski-Szmek 794d16
                         </varlistentry>
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
+                        <varlistentry>
Zbigniew Jędrzejewski-Szmek 794d16
+                                <term><varname>$TERM</varname></term>
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
+                                <listitem><para>Terminal type, set
Zbigniew Jędrzejewski-Szmek 794d16
+                                only for units connected to a terminal
Zbigniew Jędrzejewski-Szmek 794d16
+                                (<varname>StandardInput=tty</varname>,
Zbigniew Jędrzejewski-Szmek 794d16
+                                <varname>StandardOutput=tty</varname>,
Zbigniew Jędrzejewski-Szmek 794d16
+                                or
Zbigniew Jędrzejewski-Szmek 794d16
+                                <varname>StandardError=tty</varname>).
Zbigniew Jędrzejewski-Szmek 794d16
+                                See
Zbigniew Jędrzejewski-Szmek 794d16
+                                <citerefentry><refentrytitle>termcap</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
Zbigniew Jędrzejewski-Szmek 794d16
+                                </para></listitem>
Zbigniew Jędrzejewski-Szmek 794d16
+                        </varlistentry>
Zbigniew Jędrzejewski-Szmek 794d16
                 </variablelist>
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 <para>Additional variables may be configured by the
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/src/core/execute.c b/src/core/execute.c
Zbigniew Jędrzejewski-Szmek 794d16
index a53ef48..3979f35 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/src/core/execute.c
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/src/core/execute.c
Zbigniew Jędrzejewski-Szmek 794d16
@@ -1094,7 +1094,7 @@ int exec_spawn(ExecCommand *command,
Zbigniew Jędrzejewski-Szmek 794d16
         if (pid == 0) {
Zbigniew Jędrzejewski-Szmek 794d16
                 int i, err;
Zbigniew Jędrzejewski-Szmek 794d16
                 sigset_t ss;
Zbigniew Jędrzejewski-Szmek 794d16
-                const char *username = NULL, *home = NULL;
Zbigniew Jędrzejewski-Szmek 794d16
+                const char *username = NULL, *home = NULL, *shell = NULL;
Zbigniew Jędrzejewski-Szmek 794d16
                 uid_t uid = (uid_t) -1;
Zbigniew Jędrzejewski-Szmek 794d16
                 gid_t gid = (gid_t) -1;
Zbigniew Jędrzejewski-Szmek 794d16
                 _cleanup_strv_free_ char **our_env = NULL, **pam_env = NULL,
Zbigniew Jędrzejewski-Szmek 794d16
@@ -1277,7 +1277,7 @@ int exec_spawn(ExecCommand *command,
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 if (context->user) {
Zbigniew Jędrzejewski-Szmek 794d16
                         username = context->user;
Zbigniew Jędrzejewski-Szmek 794d16
-                        err = get_user_creds(&username, &uid, &gid, &home, NULL);
Zbigniew Jędrzejewski-Szmek 794d16
+                        err = get_user_creds(&username, &uid, &gid, &home, &shell);
Zbigniew Jędrzejewski-Szmek 794d16
                         if (err < 0) {
Zbigniew Jędrzejewski-Szmek 794d16
                                 r = EXIT_USER;
Zbigniew Jędrzejewski-Szmek 794d16
                                 goto fail_child;
Zbigniew Jędrzejewski-Szmek 794d16
@@ -1462,46 +1462,28 @@ int exec_spawn(ExecCommand *command,
Zbigniew Jędrzejewski-Szmek 794d16
                         }
Zbigniew Jędrzejewski-Szmek 794d16
                 }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                our_env = new0(char*, 7);
Zbigniew Jędrzejewski-Szmek 794d16
-                if (!our_env) {
Zbigniew Jędrzejewski-Szmek 794d16
+                our_env = new(char*, 8);
Zbigniew Jędrzejewski-Szmek 794d16
+                if (!our_env ||
Zbigniew Jędrzejewski-Szmek 794d16
+                    (n_fds > 0 && (
Zbigniew Jędrzejewski-Szmek 794d16
+                            asprintf(our_env + n_env++, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
+                            asprintf(our_env + n_env++, "LISTEN_FDS=%u", n_fds) < 0)) ||
Zbigniew Jędrzejewski-Szmek 794d16
+                    (home && asprintf(our_env + n_env++, "HOME=%s", home) < 0) ||
Zbigniew Jędrzejewski-Szmek 794d16
+                    (username && (
Zbigniew Jędrzejewski-Szmek 794d16
+                            asprintf(our_env + n_env++, "LOGNAME=%s", username) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
+                            asprintf(our_env + n_env++, "USER=%s", username) < 0)) ||
Zbigniew Jędrzejewski-Szmek 794d16
+                    (shell && asprintf(our_env + n_env++, "SHELL=%s", shell) < 0) ||
Zbigniew Jędrzejewski-Szmek 794d16
+                    ((is_terminal_input(context->std_input) ||
Zbigniew Jędrzejewski-Szmek 794d16
+                      context->std_output == EXEC_OUTPUT_TTY ||
Zbigniew Jędrzejewski-Szmek 794d16
+                      context->std_error == EXEC_OUTPUT_TTY) && (
Zbigniew Jędrzejewski-Szmek 794d16
+                              !(our_env[n_env++] = strdup(default_term_for_tty(tty_path(context))))))) {
Zbigniew Jędrzejewski-Szmek 794d16
+
Zbigniew Jędrzejewski-Szmek 794d16
                         err = -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
                         r = EXIT_MEMORY;
Zbigniew Jędrzejewski-Szmek 794d16
                         goto fail_child;
Zbigniew Jędrzejewski-Szmek 794d16
                 }
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
-                if (n_fds > 0)
Zbigniew Jędrzejewski-Szmek 794d16
-                        if (asprintf(our_env + n_env++, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
-                            asprintf(our_env + n_env++, "LISTEN_FDS=%u", n_fds) < 0) {
Zbigniew Jędrzejewski-Szmek 794d16
-                                err = -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
-                                r = EXIT_MEMORY;
Zbigniew Jędrzejewski-Szmek 794d16
-                                goto fail_child;
Zbigniew Jędrzejewski-Szmek 794d16
-                        }
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
-                if (home)
Zbigniew Jędrzejewski-Szmek 794d16
-                        if (asprintf(our_env + n_env++, "HOME=%s", home) < 0) {
Zbigniew Jędrzejewski-Szmek 794d16
-                                err = -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
-                                r = EXIT_MEMORY;
Zbigniew Jędrzejewski-Szmek 794d16
-                                goto fail_child;
Zbigniew Jędrzejewski-Szmek 794d16
-                        }
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
-                if (username)
Zbigniew Jędrzejewski-Szmek 794d16
-                        if (asprintf(our_env + n_env++, "LOGNAME=%s", username) < 0 ||
Zbigniew Jędrzejewski-Szmek 794d16
-                            asprintf(our_env + n_env++, "USER=%s", username) < 0) {
Zbigniew Jędrzejewski-Szmek 794d16
-                                err = -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
-                                r = EXIT_MEMORY;
Zbigniew Jędrzejewski-Szmek 794d16
-                                goto fail_child;
Zbigniew Jędrzejewski-Szmek 794d16
-                        }
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
-                if (is_terminal_input(context->std_input) ||
Zbigniew Jędrzejewski-Szmek 794d16
-                    context->std_output == EXEC_OUTPUT_TTY ||
Zbigniew Jędrzejewski-Szmek 794d16
-                    context->std_error == EXEC_OUTPUT_TTY)
Zbigniew Jędrzejewski-Szmek 794d16
-                        if (!(our_env[n_env++] = strdup(default_term_for_tty(tty_path(context))))) {
Zbigniew Jędrzejewski-Szmek 794d16
-                                err = -ENOMEM;
Zbigniew Jędrzejewski-Szmek 794d16
-                                r = EXIT_MEMORY;
Zbigniew Jędrzejewski-Szmek 794d16
-                                goto fail_child;
Zbigniew Jędrzejewski-Szmek 794d16
-                        }
Zbigniew Jędrzejewski-Szmek 794d16
-
Zbigniew Jędrzejewski-Szmek 794d16
-                assert(n_env <= 7);
Zbigniew Jędrzejewski-Szmek 794d16
+                our_env[n_env++] = NULL;
Zbigniew Jędrzejewski-Szmek 794d16
+                assert(n_env <= 8);
Zbigniew Jędrzejewski-Szmek 794d16
 
Zbigniew Jędrzejewski-Szmek 794d16
                 final_env = strv_env_merge(5,
Zbigniew Jędrzejewski-Szmek 794d16
                                            environment,
Zbigniew Jędrzejewski-Szmek 794d16
diff --git a/units/user@.service.in b/units/user@.service.in
Zbigniew Jędrzejewski-Szmek 794d16
index 3718a57..3f8b59d 100644
Zbigniew Jędrzejewski-Szmek 794d16
--- a/units/user@.service.in
Zbigniew Jędrzejewski-Szmek 794d16
+++ b/units/user@.service.in
Zbigniew Jędrzejewski-Szmek 794d16
@@ -13,7 +13,6 @@ After=systemd-user-sessions.service
Zbigniew Jędrzejewski-Szmek 794d16
 User=%I
Zbigniew Jędrzejewski-Szmek 794d16
 PAMName=systemd-user
Zbigniew Jędrzejewski-Szmek 794d16
 Type=notify
Zbigniew Jędrzejewski-Szmek 794d16
-Environment=SHELL=%s
Zbigniew Jędrzejewski-Szmek 794d16
 ExecStart=-@rootlibexecdir@/systemd --user
Zbigniew Jędrzejewski-Szmek 794d16
 Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/dbus/user_bus_socket
Zbigniew Jędrzejewski-Szmek 794d16
 Slice=user-%i.slice