From a87c6fa2c3aece16f809ddd65887a65a32c9870d Mon Sep 17 00:00:00 2001 From: Tom Hromatka Date: Wed, 17 May 2023 14:43:36 -0600 Subject: [PATCH] systemd: Set last_errno when ECGOTHER occurs Within libcgroup, ECGOTHER denotes an error when invoking a system call. The user can call cgroup_get_last_errno() to receive this value. Set last_errno any time a systemd function - cgroup_create_scope() cgroup_create_scope2(), etc. - returns ECGOTHER. Signed-off-by: Tom Hromatka Reviewed-by: Kamalesh Babulal --- src/systemd.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/systemd.c b/src/systemd.c index 5f96cb6f..47e19d31 100644 --- a/src/systemd.c +++ b/src/systemd.c @@ -118,6 +118,7 @@ int cgroup_create_scope(const char * const scope_name, const char * const slice_ if (opts->pid < 0) { child_pid = fork(); if (child_pid < 0) { + last_errno = errno; cgroup_err("fork failed: %d\n", errno); return ECGOTHER; } @@ -130,7 +131,9 @@ int cgroup_create_scope(const char * const scope_name, const char * const slice_ * there isn't a running process in it. */ execvp("libcgroup_systemd_idle_thread", args); + /* The child process should never get here */ + last_errno = errno; cgroup_err("failed to create system idle thread.\n"); return ECGOTHER; } @@ -231,6 +234,7 @@ int cgroup_create_scope(const char * const scope_name, const char * const slice_ ret = clock_gettime(CLOCK_MONOTONIC, &start); if (ret < 0) { + last_errno = errno; cgroup_err("Failed to get time: %d\n", errno); cgret = ECGOTHER; goto out; @@ -258,6 +262,7 @@ int cgroup_create_scope(const char * const scope_name, const char * const slice_ ret = clock_gettime(CLOCK_MONOTONIC, &now); if (ret < 0) { + last_errno = errno; cgroup_err("Failed to get time: %d\n", errno); cgret = ECGOTHER; goto out; @@ -306,6 +311,7 @@ int cgroup_create_scope2(struct cgroup *cgroup, int ignore_ownership, copy1 = strdup(cgroup->name); if (!copy1) { + last_errno = errno; ret = ECGOTHER; goto err; } @@ -314,6 +320,7 @@ int cgroup_create_scope2(struct cgroup *cgroup, int ignore_ownership, copy2 = strdup(cgroup->name); if (!copy2) { + last_errno = errno; ret = ECGOTHER; goto err; } -- 2.47.2