summaryrefslogtreecommitdiff
path: root/lib/libsys/rfork_thread_gen.c
blob: 5a8f6e3f650f462aff8937273d7dd881422dacaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*-
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright 2026 The FreeBSD Foundation
 *
 * This software were developed by
 * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
 * the FreeBSD Foundation.
 */

#include <errno.h>
#include <unistd.h>

pid_t
rfork_thread(int flags, void *stack_addr, int (*start_fn)(void *), void *arg)
{
	pid_t res;
	int ret;

	/*
	 * Generic implementation cannot switch stacks.  Only
	 * architecture-specific code knows how to do it.  Require
	 * that caller knows that, and refuse to do operate if the
	 * stack was supplied.
	 *
	 * Note that implementations that do switch stack, would fault
	 * immediately if the passed stack is NULL.  They do not need to
	 * specifically check for the NULL stack value.
	 */
	if (stack_addr != NULL) {
		errno = EOPNOTSUPP;
		return (-1);
	}
	res = rfork(flags);
	if (res == 0) {
		ret = start_fn(arg);
		_exit(ret);
	}
	return (res);
}