blob: 2aa00beb1a191d8c4a68a96ba529fc48d3777e84 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-or-later
/* Copyright (c) 2021 SUSE LLC
* Richard Palethorpe <rpalethorpe@suse.com>
*/
#define TST_NO_DEFAULT_MAIN
#include <stddef.h>
#include "tst_test.h"
#include "lapi/sched.h"
pid_t tst_clone(const struct tst_clone_args *tst_args)
{
struct clone_args args = {
.flags = tst_args->flags,
.exit_signal = tst_args->exit_signal,
.cgroup = tst_args->cgroup,
};
int flags;
pid_t pid = -1;
tst_flush();
errno = ENOSYS;
if (__NR_clone3 != __LTP__NR_INVALID_SYSCALL)
pid = syscall(__NR_clone3, &args, sizeof(args));
if (pid == -1 && errno != ENOSYS)
return -1;
if (pid != -1)
return pid;
flags = args.exit_signal | args.flags;
#ifdef __s390x__
pid = syscall(__NR_clone, NULL, flags);
#else
pid = syscall(__NR_clone, flags, NULL);
#endif
if (pid == -1)
return -2;
return pid;
}