From bc9e9af13706dd89dd826c021f6a94f87e637abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 30 May 2017 20:21:45 -0400 Subject: [PATCH 1/5] sd-login: translate -ENOMEDIUM to -ENODATA The -ENOMEDIUM return value was introduced in v232-1001-g2977724b09, ('core: make hybrid cgroup unified mode keep compat /sys/fs/cgroup/systemd hierarchy'), and would be returned by cg_pid_get_path_shifted(), but the documented and expected return value is -ENODATA. Let's just catch ENXIO/ENOMEDIUM and translate it to ENODATA in all cases. Complements 171f8f591ff27ebb5ff475b7a9d1f13a846c9331, fixes #6012. --- man/sd_pid_get_session.xml | 2 +- src/libsystemd/sd-login/sd-login.c | 22 +++++++++++++++------- src/libsystemd/sd-login/test-login.c | 9 +++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/man/sd_pid_get_session.xml b/man/sd_pid_get_session.xml index 0c135ba871..14ebd53e36 100644 --- a/man/sd_pid_get_session.xml +++ b/man/sd_pid_get_session.xml @@ -285,7 +285,7 @@ - -BADF + -EBADF The specified socket file descriptor was invalid. diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index 25dff7738f..49573a7d34 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -62,7 +62,7 @@ _public_ int sd_pid_get_session(pid_t pid, char **session) { assert_return(session, -EINVAL); r = cg_pid_get_session(pid, session); - return r == -ENXIO ? -ENODATA : r; + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_unit(pid_t pid, char **unit) { @@ -72,7 +72,7 @@ _public_ int sd_pid_get_unit(pid_t pid, char **unit) { assert_return(unit, -EINVAL); r = cg_pid_get_unit(pid, unit); - return r == -ENXIO ? -ENODATA : r; + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_user_unit(pid_t pid, char **unit) { @@ -82,39 +82,47 @@ _public_ int sd_pid_get_user_unit(pid_t pid, char **unit) { assert_return(unit, -EINVAL); r = cg_pid_get_user_unit(pid, unit); - return r == -ENXIO ? -ENODATA : r; + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_machine_name(pid_t pid, char **name) { + int r; assert_return(pid >= 0, -EINVAL); assert_return(name, -EINVAL); - return cg_pid_get_machine_name(pid, name); + r = cg_pid_get_machine_name(pid, name); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_slice(pid_t pid, char **slice) { + int r; assert_return(pid >= 0, -EINVAL); assert_return(slice, -EINVAL); - return cg_pid_get_slice(pid, slice); + r = cg_pid_get_slice(pid, slice); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_user_slice(pid_t pid, char **slice) { + int r; assert_return(pid >= 0, -EINVAL); assert_return(slice, -EINVAL); - return cg_pid_get_user_slice(pid, slice); + r = cg_pid_get_user_slice(pid, slice); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) { + int r; assert_return(pid >= 0, -EINVAL); assert_return(uid, -EINVAL); - return cg_pid_get_owner_uid(pid, uid); + r = cg_pid_get_owner_uid(pid, uid); + return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r; } _public_ int sd_pid_get_cgroup(pid_t pid, char **cgroup) { diff --git a/src/libsystemd/sd-login/test-login.c b/src/libsystemd/sd-login/test-login.c index 6a51ae6a91..bc8488c4de 100644 --- a/src/libsystemd/sd-login/test-login.c +++ b/src/libsystemd/sd-login/test-login.c @@ -61,14 +61,15 @@ static void test_login(void) { r = sd_pid_get_unit(0, &unit); assert_se(r >= 0 || r == -ENODATA); - log_info("sd_pid_get_unit(0, …) → \"%s\"", unit); + log_info("sd_pid_get_unit(0, …) → \"%s\"", strna(unit)); r = sd_pid_get_user_unit(0, &user_unit); assert_se(r >= 0 || r == -ENODATA); - log_info("sd_pid_get_user_unit(0, …) → \"%s\"", user_unit); + log_info("sd_pid_get_user_unit(0, …) → \"%s\"", strna(user_unit)); - assert_se(sd_pid_get_slice(0, &slice) >= 0); - log_info("sd_pid_get_slice(0, …) → \"%s\"", slice); + r = sd_pid_get_slice(0, &slice); + assert_se(r >= 0 || r == -ENODATA); + log_info("sd_pid_get_slice(0, …) → \"%s\"", strna(slice)); r = sd_pid_get_session(0, &session); if (r < 0) { From f00237563eb49c9370983161a41b5c2f09a3cb3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 30 May 2017 20:36:18 -0400 Subject: [PATCH 2/5] test-bus-vtable: it's OK if dbus is not running Fixes #5989. --- src/libsystemd/sd-bus/test-bus-vtable.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libsystemd/sd-bus/test-bus-vtable.c b/src/libsystemd/sd-bus/test-bus-vtable.c index 31c35e8540..fd9ad81217 100644 --- a/src/libsystemd/sd-bus/test-bus-vtable.c +++ b/src/libsystemd/sd-bus/test-bus-vtable.c @@ -4,6 +4,7 @@ /* We use system assert.h here, because we don't want to keep macro.h and log.h C++ compatible */ #undef NDEBUG #include +#include #include "sd-bus-vtable.h" @@ -58,6 +59,7 @@ static const sd_bus_vtable vtable[] = { static void test_vtable(void) { sd_bus *bus = NULL; struct context c = {}; + int r; assert(sd_bus_new(&bus) >= 0); @@ -65,7 +67,9 @@ static void test_vtable(void) { assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable2", vtable, &c) >= 0); assert(sd_bus_set_address(bus, DEFAULT_BUS_PATH) >= 0); - assert(sd_bus_start(bus) >= 0); + r = sd_bus_start(bus); + assert(r == 0 || /* success */ + r == -ENOENT /* dbus is inactive */ ); sd_bus_unref(bus); } From 2b5e92673d9ed864bb9dad1a7e816f093b75f8cb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 31 May 2017 23:48:47 +0900 Subject: [PATCH 3/5] sd-login: treat missing /run/systemd/{seats,sessions,users} the same as empty C.f. 0543105b0fb13e4243b71a78f62f81fb9dde5d51. This makes if /run/systemd/{seats,sessions,users} are missing, then sd_get_seats(), sd_get_sessions() and sd_get_uids() return 0, that is, an empty list, instead of -ENOENT. --- src/libsystemd/sd-login/sd-login.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index 49573a7d34..ce080acd4c 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -798,11 +798,27 @@ _public_ int sd_seat_can_graphical(const char *seat) { } _public_ int sd_get_seats(char ***seats) { - return get_files_in_directory("/run/systemd/seats/", seats); + int r; + + r = get_files_in_directory("/run/systemd/seats/", seats); + if (r == -ENOENT) { + if (seats) + *seats = NULL; + return 0; + } + return r; } _public_ int sd_get_sessions(char ***sessions) { - return get_files_in_directory("/run/systemd/sessions/", sessions); + int r; + + r = get_files_in_directory("/run/systemd/sessions/", sessions); + if (r == -ENOENT) { + if (sessions) + *sessions = NULL; + return 0; + } + return r; } _public_ int sd_get_uids(uid_t **users) { @@ -813,8 +829,14 @@ _public_ int sd_get_uids(uid_t **users) { _cleanup_free_ uid_t *l = NULL; d = opendir("/run/systemd/users/"); - if (!d) + if (!d) { + if (errno == ENOENT) { + if (users) + *users = NULL; + return 0; + } return -errno; + } FOREACH_DIRENT_ALL(de, d, return -errno) { int k; From 76ed21e1e68493b60167fb746872d0dd11278bce Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 1 Jun 2017 00:12:32 +0900 Subject: [PATCH 4/5] sd-login: sd_get_machine_names(): do not return -EINVAL when output parameter is NULL Other functions in sd-login generally allow the output parameter to be NULL, in which case only the number of items that would be stored in the array is returned. Be nice and do the same here. --- src/libsystemd/sd-login/sd-login.c | 12 ++++++------ src/libsystemd/sd-login/test-login.c | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index ce080acd4c..b75acef82c 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -878,14 +878,13 @@ _public_ int sd_get_uids(uid_t **users) { } _public_ int sd_get_machine_names(char ***machines) { - char **l = NULL, **a, **b; + char **l, **a, **b; int r; - assert_return(machines, -EINVAL); - r = get_files_in_directory("/run/systemd/machines/", &l); if (r == -ENOENT) { - *machines = NULL; + if (machines) + *machines = NULL; return 0; } if (r < 0) @@ -895,7 +894,7 @@ _public_ int sd_get_machine_names(char ***machines) { r = 0; /* Filter out the unit: symlinks */ - for (a = l, b = l; *a; a++) { + for (a = b = l; *a; a++) { if (startswith(*a, "unit:") || !machine_name_is_valid(*a)) free(*a); else { @@ -908,7 +907,8 @@ _public_ int sd_get_machine_names(char ***machines) { *b = NULL; } - *machines = l; + if (machines) + *machines = l; return r; } diff --git a/src/libsystemd/sd-login/test-login.c b/src/libsystemd/sd-login/test-login.c index bc8488c4de..b618b79b28 100644 --- a/src/libsystemd/sd-login/test-login.c +++ b/src/libsystemd/sd-login/test-login.c @@ -249,8 +249,9 @@ static void test_login(void) { assert_se(r >= 0); assert_se(r == (int) strv_length(machines)); assert_se(buf = strv_join(machines, " ")); - log_info("sd_get_machines(…) → [%i] \"%s\"", r, buf); + + assert_se(sd_get_machine_names(NULL) == r); } } From ff5d2cd03dc4a285f0f13cab53dfb9f78af2edf6 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 1 Jun 2017 00:27:47 +0900 Subject: [PATCH 5/5] man: update sd_get_seats(3) --- man/sd_get_seats.xml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/man/sd_get_seats.xml b/man/sd_get_seats.xml index 37eb3fc894..c053144483 100644 --- a/man/sd_get_seats.xml +++ b/man/sd_get_seats.xml @@ -81,8 +81,10 @@ Description sd_get_seats() may be used to determine - all currently available local seats. Returns a - NULL terminated array of seat identifiers. + all currently available local seats. Returns the number of seat + identifiers and if the input pointer is non-NULL, a + NULL-terminated array of seat identifiers + is stored at the address. The returned array and all strings it references need to be freed with the libc free3 @@ -123,13 +125,6 @@ - - -EINVAL - - An input parameter was invalid (out of range, - or NULL, where that is not accepted). - - -ENOMEM