]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
systemd: Set last_errno when ECGOTHER occurs
authorTom Hromatka <tom.hromatka@oracle.com>
Wed, 17 May 2023 20:43:36 +0000 (14:43 -0600)
committerTom Hromatka <tom.hromatka@oracle.com>
Tue, 23 May 2023 21:42:59 +0000 (15:42 -0600)
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 <tom.hromatka@oracle.com>
Reviewed-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
src/systemd.c

index 5f96cb6f1137bb80081bfe4b186cb990d9af8479..47e19d31e0b14ab81cffc53b10819b52288df0c6 100644 (file)
@@ -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;
        }