[systemd-commits] 3 commits - man/systemd.unit.xml.in src/core src/libsystemd-bus src/shared src/test

Zbigniew Jędrzejewski-Szmek zbyszek at kemper.freedesktop.org
Tue Mar 26 20:51:58 PDT 2013


 man/systemd.unit.xml.in            |    9 ++++++-
 src/core/unit-printf.c             |   33 ++++++++++++++++---------
 src/libsystemd-bus/test-bus-chat.c |    7 +++--
 src/shared/macro.h                 |    3 ++
 src/shared/util.c                  |   47 -------------------------------------
 src/shared/util.h                  |    1 
 src/test/test-sched-prio.c         |    4 +--
 src/test/test-strxcpyx.c           |    2 -
 src/test/test-unit-name.c          |   14 +++++------
 9 files changed, 47 insertions(+), 73 deletions(-)

New commits:
commit 49e5de64e22ea4794092b91393545ab08e658e0a
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Tue Mar 26 21:07:46 2013 -0400

    tests: skip bus test if bus cannot be opened
    
    To make the result more visible, special return value
    is used to tell automake that the test was skipped. While
    at it, use the same return value in other skipped tests.

diff --git a/src/libsystemd-bus/test-bus-chat.c b/src/libsystemd-bus/test-bus-chat.c
index bdcca18..e124b24 100644
--- a/src/libsystemd-bus/test-bus-chat.c
+++ b/src/libsystemd-bus/test-bus-chat.c
@@ -27,6 +27,7 @@
 
 #include "log.h"
 #include "util.h"
+#include "macro.h"
 
 #include "sd-bus.h"
 #include "bus-message.h"
@@ -543,8 +544,10 @@ int main(int argc, char *argv[]) {
         int q, r;
 
         r = server_init(&bus);
-        if (r < 0)
-                return EXIT_FAILURE;
+        if (r < 0) {
+                log_info("Failed to connect to bus, skipping tests.");
+                return EXIT_TEST_SKIP;
+        }
 
         log_info("Initialized...");
 
diff --git a/src/shared/macro.h b/src/shared/macro.h
index 80cb2f0..898784a 100644
--- a/src/shared/macro.h
+++ b/src/shared/macro.h
@@ -46,6 +46,9 @@
 #define _introspect_(x) __attribute__((section("introspect." x)))
 #define _alignas_(x) __attribute__((aligned(__alignof(x))))
 
+/* automake test harness */
+#define EXIT_TEST_SKIP 77
+
 #define XSTRINGIFY(x) #x
 #define STRINGIFY(x) XSTRINGIFY(x)
 
diff --git a/src/test/test-sched-prio.c b/src/test/test-sched-prio.c
index c57f6a3..ba0aacf 100644
--- a/src/test/test-sched-prio.c
+++ b/src/test/test-sched-prio.c
@@ -22,7 +22,7 @@
 #include <sched.h>
 
 #include "manager.h"
-
+#include "macro.h"
 
 int main(int argc, char *argv[]) {
         Manager *m;
@@ -37,7 +37,7 @@ int main(int argc, char *argv[]) {
         r = manager_new(SYSTEMD_USER, &m);
         if (r == -EPERM) {
                 puts("manager_new: Permission denied. Skipping test.");
-                return EXIT_SUCCESS;
+                return EXIT_TEST_SKIP;
         }
         assert(r >= 0);
         assert_se(manager_startup(m, serial, fdset) >= 0);
diff --git a/src/test/test-unit-name.c b/src/test/test-unit-name.c
index 0b6b563..aba36e4 100644
--- a/src/test/test-unit-name.c
+++ b/src/test/test-unit-name.c
@@ -108,7 +108,7 @@ static void test_replacements(void) {
 #undef expect
 }
 
-static void test_unit_printf(void) {
+static int test_unit_printf(void) {
         Manager *m;
         Unit *u, *u2;
         int r;
@@ -126,7 +126,7 @@ static void test_unit_printf(void) {
         r = manager_new(SYSTEMD_USER, &m);
         if (r == -EPERM) {
                 puts("manager_new: Permission denied. Skipping test.");
-                return;
+                return EXIT_TEST_SKIP;
         }
         assert(r == 0);
 
@@ -189,11 +189,11 @@ static void test_unit_printf(void) {
         expect(u2, "%b", bid);
         expect(u2, "%H", host);
         expect(u2, "%t", "/run/user/*");
+
+        return 0;
 }
 
 int main(int argc, char* argv[]) {
         test_replacements();
-        test_unit_printf();
-
-        return 0;
+        return test_unit_printf();
 }

commit f7703533a4d6bac9ba708218a3244cdc60376446
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Tue Mar 26 23:47:25 2013 -0400

    tests: fix size_t in format string

diff --git a/src/test/test-strxcpyx.c b/src/test/test-strxcpyx.c
index 9b4dae8..b7b70d4 100644
--- a/src/test/test-strxcpyx.c
+++ b/src/test/test-strxcpyx.c
@@ -48,7 +48,7 @@ static void test_strpcpyf(void) {
         size_t space_left;
 
         space_left = sizeof(target);
-        space_left = strpcpyf(&s, space_left, "space left: %ld. ", space_left);
+        space_left = strpcpyf(&s, space_left, "space left: %zd. ", space_left);
         space_left = strpcpyf(&s, space_left, "foo%s", "bar");
 
         assert(streq(target, "space left: 25. foobar"));

commit 3baed19327663d012c3313b72cc5b3d02a58720a
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Tue Mar 26 19:37:14 2013 -0400

    Simplify the meaning of %s
    
    The rules governing %s where just too complicated. First of
    all, looking at $SHELL is dangerous. For systemd --system,
    it usually wouldn't be set. But it could be set if the admin
    first started a debug shell, let's say /sbin/sash, and then
    launched systemd from it. This shouldn't influence how daemons
    are started later on, so is better ignored. Similar reasoning
    holds for session mode. Some shells set $SHELL, while other
    set it only when it wasn't set previously (e.g. zsh). This
    results in fragility that is better avoided by ignoring $SHELL
    totally.
    
    With $SHELL out of the way, simplify things by saying that
    %s==/bin/sh for root, and the configured shell otherwise.
    get_shell() is the only caller, so it can be inlined.
    
    Fixes one issue seen with 'make check'.

diff --git a/man/systemd.unit.xml.in b/man/systemd.unit.xml.in
index e99703f..2196e73 100644
--- a/man/systemd.unit.xml.in
+++ b/man/systemd.unit.xml.in
@@ -1270,7 +1270,14 @@
                       <row>
                         <entry><literal>%s</literal></entry>
                         <entry>User shell</entry>
-                        <entry>This is the shell of the configured user of the unit, or (if none is set) the user running the systemd instance.</entry>
+                        <entry>This is the shell of the configured
+                        user of the unit, or (if none is set) the user
+                        running the systemd instance.  If the user is
+                        <literal>root</literal> (UID equal to 0), the
+                        shell configured in account database is
+                        ignored and <filename>/bin/sh</filename> is
+                        always used.
+                        </entry>
                       </row>
                       <row>
                         <entry><literal>%m</literal></entry>
diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
index 7415824..98274ee 100644
--- a/src/core/unit-printf.c
+++ b/src/core/unit-printf.c
@@ -190,28 +190,37 @@ static char *specifier_user_shell(char specifier, void *data, void *userdata) {
         ExecContext *c;
         int r;
         const char *username, *shell;
+        char *ret;
 
         assert(u);
 
         c = unit_get_exec_context(u);
 
-        /* return HOME if set, otherwise from passwd */
-        if (!c || !c->user) {
-                char *sh;
+        if (c && c->user)
+                username = c->user;
+        else
+                username = "root";
 
-                r = get_shell(&sh);
-                if (r < 0)
-                        return strdup("/bin/sh");
+        /* return /bin/sh for root, otherwise the value from passwd */
+        r = get_user_creds(&username, NULL, NULL, NULL, &shell);
+        if (r < 0) {
+                log_warning_unit(u->id,
+                                 "Failed to determine shell: %s",
+                                 strerror(-r));
+                return NULL;
+        }
 
-                return sh;
+        if (!path_is_absolute(shell)) {
+                log_warning_unit(u->id,
+                                 "Shell %s is not absolute, ignoring.",
+                                 shell);
         }
 
-        username = c->user;
-        r = get_user_creds(&username, NULL, NULL, NULL, &shell);
-        if (r < 0)
-                return strdup("/bin/sh");
+        ret = strdup(shell);
+        if (!ret)
+                log_oom();
 
-        return strdup(shell);
+        return ret;
 }
 
 char *unit_name_printf(Unit *u, const char* format) {
diff --git a/src/shared/util.c b/src/shared/util.c
index 03d6f00..0444cf4 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -5246,53 +5246,6 @@ int get_home_dir(char **_h) {
         return 0;
 }
 
-int get_shell(char **_sh) {
-        char *sh;
-        const char *e;
-        uid_t u;
-        struct passwd *p;
-
-        assert(_sh);
-
-        /* Take the user specified one */
-        e = getenv("SHELL");
-        if (e) {
-                sh = strdup(e);
-                if (!sh)
-                        return -ENOMEM;
-
-                *_sh = sh;
-                return 0;
-        }
-
-        /* Hardcode home directory for root to avoid NSS */
-        u = getuid();
-        if (u == 0) {
-                sh = strdup("/bin/sh");
-                if (!sh)
-                        return -ENOMEM;
-
-                *_sh = sh;
-                return 0;
-        }
-
-        /* Check the database... */
-        errno = 0;
-        p = getpwuid(u);
-        if (!p)
-                return errno ? -errno : -ESRCH;
-
-        if (!path_is_absolute(p->pw_shell))
-                return -EINVAL;
-
-        sh = strdup(p->pw_shell);
-        if (!sh)
-                return -ENOMEM;
-
-        *_sh = sh;
-        return 0;
-}
-
 void fclosep(FILE **f) {
         if (*f)
                 fclose(*f);
diff --git a/src/shared/util.h b/src/shared/util.h
index 7a38421..52c3323 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -519,7 +519,6 @@ bool in_initrd(void);
 
 void warn_melody(void);
 
-int get_shell(char **ret);
 int get_home_dir(char **ret);
 
 static inline void freep(void *p) {
diff --git a/src/test/test-unit-name.c b/src/test/test-unit-name.c
index 7bd99d3..0b6b563 100644
--- a/src/test/test-unit-name.c
+++ b/src/test/test-unit-name.c
@@ -164,7 +164,7 @@ static void test_unit_printf(void) {
         expect(u, "%u", root->pw_name);
         expect(u, "%U", root_uid);
         expect(u, "%h", root->pw_dir);
-        expect(u, "%s", root->pw_shell);
+        expect(u, "%s", "/bin/sh");
         expect(u, "%m", mid);
         expect(u, "%b", bid);
         expect(u, "%H", host);
@@ -184,7 +184,7 @@ static void test_unit_printf(void) {
         expect(u2, "%u", root->pw_name);
         expect(u2, "%U", root_uid);
         expect(u2, "%h", root->pw_dir);
-        expect(u2, "%s", root->pw_shell);
+        expect(u2, "%s", "/bin/sh");
         expect(u2, "%m", mid);
         expect(u2, "%b", bid);
         expect(u2, "%H", host);



More information about the systemd-commits mailing list