From: Zbigniew Jędrzejewski-Szmek Date: Wed, 31 May 2017 00:21:45 +0000 (-0400) Subject: sd-login: translate -ENOMEDIUM to -ENODATA X-Git-Tag: v234~150^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc9e9af13706dd89dd826c021f6a94f87e637abf;p=thirdparty%2Fsystemd.git 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. --- diff --git a/man/sd_pid_get_session.xml b/man/sd_pid_get_session.xml index 0c135ba8712..14ebd53e36a 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 25dff7738fa..49573a7d343 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 6a51ae6a913..bc8488c4de6 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) {