chiark / gitweb /
sd-login: translate -ENOMEDIUM to -ENODATA
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 31 May 2017 00:21:45 +0000 (20:21 -0400)
committerSven Eden <yamakuzure@gmx.net>
Tue, 25 Jul 2017 07:46:52 +0000 (09:46 +0200)
The -ENOMEDIUM return value was introduced in v232-1001-g2977724b09,
('core: make hybrid cgroup unified mode keep compat /sys/fs/cgroup/elogind 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
src/libelogind/sd-login/sd-login.c
src/libelogind/sd-login/test-login.c

index 5bc5efd..a4be941 100644 (file)
       </varlistentry>
 
       <varlistentry>
-        <term><constant>-BADF</constant></term>
+        <term><constant>-EBADF</constant></term>
 
         <listitem><para>The specified socket file descriptor was
         invalid.</para></listitem>
index 96d7e44..161eccd 100644 (file)
@@ -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) {
@@ -75,7 +75,7 @@ _public_ int sd_pid_get_unit(pid_t pid, char **unit) {
 
 #if 0 /// elogind does not support systemd units
         r = cg_pid_get_unit(pid, unit);
-        return r == -ENXIO ? -ENODATA : r;
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 #else
         return -ESRCH;
 #endif // 0
@@ -91,55 +91,71 @@ _public_ int sd_pid_get_user_unit(pid_t pid, char **unit) {
 
 #if 0 /// elogind does not support systemd units
         r = cg_pid_get_user_unit(pid, unit);
-        return r == -ENXIO ? -ENODATA : r;
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 #else
         return -ESRCH;
 #endif // 0
 }
 
 _public_ int sd_pid_get_machine_name(pid_t pid, char **name) {
+#if 0 /// UNNEEDED by elogind
+        int r;
+#endif // 0
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(name, -EINVAL);
 
 #if 0 /// elogind does not support systemd units
-        return cg_pid_get_machine_name(pid, name);
+        r = cg_pid_get_machine_name(pid, name);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 #else
         return -ESRCH;
 #endif // 0
 }
 
 _public_ int sd_pid_get_slice(pid_t pid, char **slice) {
+#if 0 /// UNNEEDED by elogind
+        int r;
+#endif // 0
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(slice, -EINVAL);
 
 #if 0 /// elogind does not support systemd slices
-        return cg_pid_get_slice(pid, slice);
+        r = cg_pid_get_slice(pid, slice);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 #else
         return -ESRCH;
 #endif // 0
 }
 
 _public_ int sd_pid_get_user_slice(pid_t pid, char **slice) {
+#if 0 /// UNNEEDED by elogind
+        int r;
+#endif // 0
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(slice, -EINVAL);
 
 #if 0 /// elogind does not support systemd slices
-        return cg_pid_get_user_slice(pid, slice);
+        r = cg_pid_get_user_slice(pid, slice);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 #else
         return -ESRCH;
 #endif // 0
 }
 
 _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
+#if 0 /// UNNEEDED by elogind
+        int r;
+#endif // 0
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(uid, -EINVAL);
 
 #if 0 /// elogind does not support systemd slices
-        return cg_pid_get_owner_uid(pid, uid);
+        r = cg_pid_get_owner_uid(pid, uid);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 #else
         return -ESRCH;
 #endif // 0
index 589776a..3dc7975 100644 (file)
@@ -63,14 +63,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) {