From: Tom Hromatka Date: Wed, 17 May 2023 20:43:36 +0000 (-0600) Subject: systemd: Set last_errno when ECGOTHER occurs X-Git-Tag: v3.1.0~65 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a87c6fa2c3aece16f809ddd65887a65a32c9870d;p=thirdparty%2Flibcgroup.git 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 --- 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; }