aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/spawni.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/spawni.c')
-rw-r--r--sysdeps/unix/sysv/linux/spawni.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c
index ec687cb..f0d4c62 100644
--- a/sysdeps/unix/sysv/linux/spawni.c
+++ b/sysdeps/unix/sysv/linux/spawni.c
@@ -380,14 +380,19 @@ __spawnix (pid_t * pid, const char *file,
need for CLONE_SETTLS. Although parent and child share the same TLS
namespace, there will be no concurrent access for TLS variables (errno
for instance). */
+ bool set_cgroup = attrp ? (attrp->__flags & POSIX_SPAWN_SETCGROUP) : false;
struct clone_args clone_args =
{
/* Unsupported flags like CLONE_CLEAR_SIGHAND will be cleared up by
__clone_internal_fallback. */
- .flags = CLONE_CLEAR_SIGHAND | CLONE_VM | CLONE_VFORK,
+ .flags = (set_cgroup ? CLONE_INTO_CGROUP : 0)
+ | CLONE_CLEAR_SIGHAND
+ | CLONE_VM
+ | CLONE_VFORK,
.exit_signal = SIGCHLD,
.stack = (uintptr_t) stack,
.stack_size = stack_size,
+ .cgroup = (set_cgroup ? attrp->__cgroup : 0)
};
#ifdef HAVE_CLONE3_WRAPPER
args.use_clone3 = true;
@@ -398,8 +403,19 @@ __spawnix (pid_t * pid, const char *file,
#endif
{
args.use_clone3 = false;
- new_pid = __clone_internal_fallback (&clone_args, __spawni_child,
- &args);
+ if (!set_cgroup)
+ new_pid = __clone_internal_fallback (&clone_args, __spawni_child,
+ &args);
+ else
+ {
+ /* No fallback for POSIX_SPAWN_SETCGROUP if clone3 is not
+ supported. */
+ new_pid = -1;
+#ifdef HAVE_CLONE3_WRAPPER
+ if (errno == ENOSYS)
+#endif
+ errno = ENOTSUP;
+ }
}
/* It needs to collect the case where the auxiliary process was created