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
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-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);
}
diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c
index 25dff7738f..b75acef82c 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) {
@@ -790,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) {
@@ -805,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;
@@ -848,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)
@@ -865,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 {
@@ -878,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 6a51ae6a91..b618b79b28 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) {
@@ -248,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);
}
}