xref: /xnu-11417.121.6/libsyscall/wrappers/spawn/posix_spawn.c (revision a1e26a70f38d1d7daa7b49b258e2f8538ad81650)
1*a1e26a70SApple OSS Distributions /*
2*a1e26a70SApple OSS Distributions  * Copyright (c) 2006-2012 Apple Inc. All rights reserved.
3*a1e26a70SApple OSS Distributions  *
4*a1e26a70SApple OSS Distributions  * @APPLE_LICENSE_HEADER_START@
5*a1e26a70SApple OSS Distributions  *
6*a1e26a70SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*a1e26a70SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*a1e26a70SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*a1e26a70SApple OSS Distributions  * compliance with the License. Please obtain a copy of the License at
10*a1e26a70SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this
11*a1e26a70SApple OSS Distributions  * file.
12*a1e26a70SApple OSS Distributions  *
13*a1e26a70SApple OSS Distributions  * The Original Code and all software distributed under the License are
14*a1e26a70SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15*a1e26a70SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16*a1e26a70SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17*a1e26a70SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18*a1e26a70SApple OSS Distributions  * Please see the License for the specific language governing rights and
19*a1e26a70SApple OSS Distributions  * limitations under the License.
20*a1e26a70SApple OSS Distributions  *
21*a1e26a70SApple OSS Distributions  * @APPLE_LICENSE_HEADER_END@
22*a1e26a70SApple OSS Distributions  */
23*a1e26a70SApple OSS Distributions 
24*a1e26a70SApple OSS Distributions /*
25*a1e26a70SApple OSS Distributions  * [SPN] Support for _POSIX_SPAWN
26*a1e26a70SApple OSS Distributions  */
27*a1e26a70SApple OSS Distributions 
28*a1e26a70SApple OSS Distributions #define CONFIG_MEMORYSTATUS 1 // <rdar://problem/13604997>
29*a1e26a70SApple OSS Distributions #include <sys/types.h> /* for user_size_t */
30*a1e26a70SApple OSS Distributions #include <spawn.h>
31*a1e26a70SApple OSS Distributions #include <spawn_private.h>
32*a1e26a70SApple OSS Distributions #include <sys/spawn_internal.h>
33*a1e26a70SApple OSS Distributions #include <sys/process_policy.h>
34*a1e26a70SApple OSS Distributions #include <stdlib.h>
35*a1e26a70SApple OSS Distributions #include <errno.h>
36*a1e26a70SApple OSS Distributions #include <limits.h>     /* for OPEN_MAX, PATH_MAX */
37*a1e26a70SApple OSS Distributions #include <string.h>
38*a1e26a70SApple OSS Distributions #include <strings.h>
39*a1e26a70SApple OSS Distributions #include <mach/port.h>
40*a1e26a70SApple OSS Distributions #include <mach/mach_param.h> /* for TASK_PORT_REGISTER_MAX */
41*a1e26a70SApple OSS Distributions #include <mach/exception_types.h>
42*a1e26a70SApple OSS Distributions #include <mach/coalition.h> /* for COALITION_TYPE_MAX */
43*a1e26a70SApple OSS Distributions #include <sys/kern_memorystatus.h>
44*a1e26a70SApple OSS Distributions 
45*a1e26a70SApple OSS Distributions /*
46*a1e26a70SApple OSS Distributions  * Actual syscall wrappers.
47*a1e26a70SApple OSS Distributions  */
48*a1e26a70SApple OSS Distributions extern int __posix_spawn(pid_t * __restrict, const char * __restrict,
49*a1e26a70SApple OSS Distributions     struct _posix_spawn_args_desc *, char *const argv[__restrict],
50*a1e26a70SApple OSS Distributions     char *const envp[__restrict]);
51*a1e26a70SApple OSS Distributions extern int __execve(const char *fname, char * const *argp, char * const *envp);
52*a1e26a70SApple OSS Distributions 
53*a1e26a70SApple OSS Distributions /*
54*a1e26a70SApple OSS Distributions  * Function pointers that are NULL in Libsyscall_static, and get populated with
55*a1e26a70SApple OSS Distributions  * the real implementations in Libsyscall_dynamic from _libkernel_init.c when
56*a1e26a70SApple OSS Distributions  * os_feature_enabled(Libsystem, posix_spawn_filtering) is on.
57*a1e26a70SApple OSS Distributions  *
58*a1e26a70SApple OSS Distributions  * Since launchd cannot read feature flags during process startup (data volume
59*a1e26a70SApple OSS Distributions  * is not mounted yet), it reads them later and sets these function pointers via
60*a1e26a70SApple OSS Distributions  * Libsystem and __libkernel_init_after_boot_tasks.
61*a1e26a70SApple OSS Distributions  *
62*a1e26a70SApple OSS Distributions  * Usually NULL. Always NULL on customer installs.
63*a1e26a70SApple OSS Distributions  */
64*a1e26a70SApple OSS Distributions __attribute__((visibility("hidden")))
65*a1e26a70SApple OSS Distributions bool (*posix_spawn_with_filter)(pid_t *pid, const char *fname,
66*a1e26a70SApple OSS Distributions     char * const *argp, char * const *envp, struct _posix_spawn_args_desc *adp,
67*a1e26a70SApple OSS Distributions     int *ret);
68*a1e26a70SApple OSS Distributions 
69*a1e26a70SApple OSS Distributions __attribute__((visibility("hidden")))
70*a1e26a70SApple OSS Distributions int (*execve_with_filter)(const char *fname, char * const *argp,
71*a1e26a70SApple OSS Distributions     char * const *envp);
72*a1e26a70SApple OSS Distributions 
73*a1e26a70SApple OSS Distributions __attribute__((visibility("hidden")))
74*a1e26a70SApple OSS Distributions void
__posix_spawnattr_init(struct _posix_spawnattr * psattrp)75*a1e26a70SApple OSS Distributions __posix_spawnattr_init(struct _posix_spawnattr *psattrp)
76*a1e26a70SApple OSS Distributions {
77*a1e26a70SApple OSS Distributions 	/*
78*a1e26a70SApple OSS Distributions 	 * The default value of this attribute shall be as if no
79*a1e26a70SApple OSS Distributions 	 * flags were set
80*a1e26a70SApple OSS Distributions 	 */
81*a1e26a70SApple OSS Distributions 	psattrp->psa_flags = 0;
82*a1e26a70SApple OSS Distributions 
83*a1e26a70SApple OSS Distributions 	/*
84*a1e26a70SApple OSS Distributions 	 * The default value of this attribute shall be an empty
85*a1e26a70SApple OSS Distributions 	 * signal set
86*a1e26a70SApple OSS Distributions 	 */
87*a1e26a70SApple OSS Distributions 	psattrp->psa_sigdefault = 0;
88*a1e26a70SApple OSS Distributions 
89*a1e26a70SApple OSS Distributions 	/* The default value of this attribute is unspecified */
90*a1e26a70SApple OSS Distributions 	psattrp->psa_sigmask = 0;
91*a1e26a70SApple OSS Distributions 
92*a1e26a70SApple OSS Distributions 	/* The default value of this attribute shall be zero */
93*a1e26a70SApple OSS Distributions 	psattrp->psa_pgroup = 0;     /* doesn't matter */
94*a1e26a70SApple OSS Distributions 
95*a1e26a70SApple OSS Distributions 	/* Default is no binary preferences, i.e. use normal grading */
96*a1e26a70SApple OSS Distributions 	memset(psattrp->psa_binprefs, 0,
97*a1e26a70SApple OSS Distributions 	    sizeof(psattrp->psa_binprefs));
98*a1e26a70SApple OSS Distributions 	memset(psattrp->psa_subcpuprefs, 0xff /* CPU_SUBTYPE_ANY */,
99*a1e26a70SApple OSS Distributions 	    sizeof(psattrp->psa_subcpuprefs));
100*a1e26a70SApple OSS Distributions 
101*a1e26a70SApple OSS Distributions 	/* Default is no port actions to take */
102*a1e26a70SApple OSS Distributions 	psattrp->psa_ports = NULL;
103*a1e26a70SApple OSS Distributions 
104*a1e26a70SApple OSS Distributions 	/*
105*a1e26a70SApple OSS Distributions 	 * The default value of this attribute shall be an no
106*a1e26a70SApple OSS Distributions 	 * process control on resource starvation
107*a1e26a70SApple OSS Distributions 	 */
108*a1e26a70SApple OSS Distributions 	psattrp->psa_pcontrol = 0;
109*a1e26a70SApple OSS Distributions 
110*a1e26a70SApple OSS Distributions 	/*
111*a1e26a70SApple OSS Distributions 	 * Initializing the alignment paddings.
112*a1e26a70SApple OSS Distributions 	 */
113*a1e26a70SApple OSS Distributions 
114*a1e26a70SApple OSS Distributions 	psattrp->short_padding = 0;
115*a1e26a70SApple OSS Distributions 	psattrp->flags_padding = 0;
116*a1e26a70SApple OSS Distributions 
117*a1e26a70SApple OSS Distributions 	/* Default is no new apptype requested */
118*a1e26a70SApple OSS Distributions 	psattrp->psa_apptype = POSIX_SPAWN_PROCESS_TYPE_DEFAULT;
119*a1e26a70SApple OSS Distributions 
120*a1e26a70SApple OSS Distributions 	/* Jetsam related */
121*a1e26a70SApple OSS Distributions 	psattrp->psa_jetsam_flags = 0;
122*a1e26a70SApple OSS Distributions 	psattrp->psa_priority = -1;
123*a1e26a70SApple OSS Distributions 	psattrp->psa_memlimit_active = -1;
124*a1e26a70SApple OSS Distributions 	psattrp->psa_memlimit_inactive = -1;
125*a1e26a70SApple OSS Distributions 
126*a1e26a70SApple OSS Distributions 	/* Default is no thread limit */
127*a1e26a70SApple OSS Distributions 	psattrp->psa_thread_limit = 0;
128*a1e26a70SApple OSS Distributions 
129*a1e26a70SApple OSS Distributions 	/* Default is no CPU usage monitor active. */
130*a1e26a70SApple OSS Distributions 	psattrp->psa_cpumonitor_percent = 0;
131*a1e26a70SApple OSS Distributions 	psattrp->psa_cpumonitor_interval = 0;
132*a1e26a70SApple OSS Distributions 
133*a1e26a70SApple OSS Distributions 	/* Default is no MAC policy extensions. */
134*a1e26a70SApple OSS Distributions 	psattrp->psa_mac_extensions = NULL;
135*a1e26a70SApple OSS Distributions 
136*a1e26a70SApple OSS Distributions 	/* Default is to inherit parent's coalition(s) */
137*a1e26a70SApple OSS Distributions 	psattrp->psa_coalition_info = NULL;
138*a1e26a70SApple OSS Distributions 
139*a1e26a70SApple OSS Distributions 	psattrp->psa_persona_info = NULL;
140*a1e26a70SApple OSS Distributions 
141*a1e26a70SApple OSS Distributions 	psattrp->psa_posix_cred_info = NULL;
142*a1e26a70SApple OSS Distributions 
143*a1e26a70SApple OSS Distributions 	/*
144*a1e26a70SApple OSS Distributions 	 * old coalition field
145*a1e26a70SApple OSS Distributions 	 * For backwards compatibility reasons, we set this to 1
146*a1e26a70SApple OSS Distributions 	 * which is the first valid coalition id. This will allow
147*a1e26a70SApple OSS Distributions 	 * newer user space code to properly spawn processes on
148*a1e26a70SApple OSS Distributions 	 * older kernels
149*a1e26a70SApple OSS Distributions 	 * (they will just all end up in the same coalition).
150*a1e26a70SApple OSS Distributions 	 */
151*a1e26a70SApple OSS Distributions 	psattrp->psa_reserved = 1;
152*a1e26a70SApple OSS Distributions 
153*a1e26a70SApple OSS Distributions 	/* Default is no new clamp */
154*a1e26a70SApple OSS Distributions 	psattrp->psa_qos_clamp = POSIX_SPAWN_PROC_CLAMP_NONE;
155*a1e26a70SApple OSS Distributions 
156*a1e26a70SApple OSS Distributions 	/* Default is no change to role */
157*a1e26a70SApple OSS Distributions 	psattrp->psa_darwin_role = POSIX_SPAWN_DARWIN_ROLE_NONE;
158*a1e26a70SApple OSS Distributions 
159*a1e26a70SApple OSS Distributions 	psattrp->psa_max_addr = 0;
160*a1e26a70SApple OSS Distributions 
161*a1e26a70SApple OSS Distributions 	psattrp->psa_no_smt = false;
162*a1e26a70SApple OSS Distributions 	psattrp->psa_tecs = false;
163*a1e26a70SApple OSS Distributions 
164*a1e26a70SApple OSS Distributions 	psattrp->psa_crash_count = 0;
165*a1e26a70SApple OSS Distributions 	psattrp->psa_throttle_timeout = 0;
166*a1e26a70SApple OSS Distributions 
167*a1e26a70SApple OSS Distributions 	/* Default is no subsystem root path */
168*a1e26a70SApple OSS Distributions 	psattrp->psa_subsystem_root_path = NULL;
169*a1e26a70SApple OSS Distributions 
170*a1e26a70SApple OSS Distributions 	/* Default is no platform given */
171*a1e26a70SApple OSS Distributions 	psattrp->psa_platform = 0;
172*a1e26a70SApple OSS Distributions 
173*a1e26a70SApple OSS Distributions 	/* Default is no option */
174*a1e26a70SApple OSS Distributions 	psattrp->psa_options = PSA_OPTION_NONE;
175*a1e26a70SApple OSS Distributions 
176*a1e26a70SApple OSS Distributions 	/* Default is no port limit */
177*a1e26a70SApple OSS Distributions 	psattrp->psa_port_soft_limit = 0;
178*a1e26a70SApple OSS Distributions 	psattrp->psa_port_hard_limit = 0;
179*a1e26a70SApple OSS Distributions 
180*a1e26a70SApple OSS Distributions 	/* Default is no file descriptor limit */
181*a1e26a70SApple OSS Distributions 	psattrp->psa_filedesc_soft_limit = 0;
182*a1e26a70SApple OSS Distributions 	psattrp->psa_filedesc_hard_limit = 0;
183*a1e26a70SApple OSS Distributions 
184*a1e26a70SApple OSS Distributions 	/* Default is no kqworkloop limit */
185*a1e26a70SApple OSS Distributions 	psattrp->psa_kqworkloop_soft_limit = 0;
186*a1e26a70SApple OSS Distributions 	psattrp->psa_kqworkloop_hard_limit = 0;
187*a1e26a70SApple OSS Distributions 
188*a1e26a70SApple OSS Distributions 	psattrp->psa_crash_behavior = 0;
189*a1e26a70SApple OSS Distributions 	psattrp->psa_crash_behavior_deadline = 0;
190*a1e26a70SApple OSS Distributions 	psattrp->psa_launch_type = 0;
191*a1e26a70SApple OSS Distributions 	psattrp->psa_dataless_iopolicy = 0;
192*a1e26a70SApple OSS Distributions 
193*a1e26a70SApple OSS Distributions 	psattrp->psa_conclave_id = NULL;
194*a1e26a70SApple OSS Distributions 
195*a1e26a70SApple OSS Distributions 	psattrp->psa_sec_flags = 0;
196*a1e26a70SApple OSS Distributions }
197*a1e26a70SApple OSS Distributions 
198*a1e26a70SApple OSS Distributions /*
199*a1e26a70SApple OSS Distributions  * posix_spawnattr_init
200*a1e26a70SApple OSS Distributions  *
201*a1e26a70SApple OSS Distributions  * Description:	Initialize a spawn attributes object attr with default values
202*a1e26a70SApple OSS Distributions  *
203*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object to be
204*a1e26a70SApple OSS Distributions  *					initialized
205*a1e26a70SApple OSS Distributions  *
206*a1e26a70SApple OSS Distributions  * Returns:	0			Success
207*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to
208*a1e26a70SApple OSS Distributions  *					initialize the spawn attributes object.
209*a1e26a70SApple OSS Distributions  *
210*a1e26a70SApple OSS Distributions  * Note:	As an implementation detail, the externally visibily type
211*a1e26a70SApple OSS Distributions  *		posix_spawnattr_t is defined to be a void *, and initialization
212*a1e26a70SApple OSS Distributions  *		involves allocation of a memory object.  Subsequent changes to
213*a1e26a70SApple OSS Distributions  *		the spawn attributes may result in reallocation under the
214*a1e26a70SApple OSS Distributions  *		covers.
215*a1e26a70SApple OSS Distributions  *
216*a1e26a70SApple OSS Distributions  *		Reinitialization of an already initialized spawn attributes
217*a1e26a70SApple OSS Distributions  *		object will result in memory being leaked.  Because spawn
218*a1e26a70SApple OSS Distributions  *		attributes are not required to be used in conjunction with a
219*a1e26a70SApple OSS Distributions  *		static initializer, there is no way to distinguish a spawn
220*a1e26a70SApple OSS Distributions  *		attribute with stack garbage from one that's been initialized.
221*a1e26a70SApple OSS Distributions  *		This is arguably an API design error.
222*a1e26a70SApple OSS Distributions  */
223*a1e26a70SApple OSS Distributions int
posix_spawnattr_init(posix_spawnattr_t * attr)224*a1e26a70SApple OSS Distributions posix_spawnattr_init(posix_spawnattr_t *attr)
225*a1e26a70SApple OSS Distributions {
226*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t *psattrp = (_posix_spawnattr_t *)attr;
227*a1e26a70SApple OSS Distributions 	int     err = 0;
228*a1e26a70SApple OSS Distributions 
229*a1e26a70SApple OSS Distributions 	if ((*psattrp = (_posix_spawnattr_t)malloc(sizeof(struct _posix_spawnattr))) == NULL) {
230*a1e26a70SApple OSS Distributions 		err = ENOMEM;
231*a1e26a70SApple OSS Distributions 	} else {
232*a1e26a70SApple OSS Distributions 		__posix_spawnattr_init(*psattrp);
233*a1e26a70SApple OSS Distributions 	}
234*a1e26a70SApple OSS Distributions 
235*a1e26a70SApple OSS Distributions 	return err;
236*a1e26a70SApple OSS Distributions }
237*a1e26a70SApple OSS Distributions 
238*a1e26a70SApple OSS Distributions 
239*a1e26a70SApple OSS Distributions /*
240*a1e26a70SApple OSS Distributions  * posix_spawnattr_destroy
241*a1e26a70SApple OSS Distributions  *
242*a1e26a70SApple OSS Distributions  * Description:	Destroy a spawn attributes object that was previously
243*a1e26a70SApple OSS Distributions  *		initialized via posix_spawnattr_init() by freeing any
244*a1e26a70SApple OSS Distributions  *		memory associated with it and setting it to an invalid value.
245*a1e26a70SApple OSS Distributions  *
246*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object to be
247*a1e26a70SApple OSS Distributions  *					destroyed.
248*a1e26a70SApple OSS Distributions  *
249*a1e26a70SApple OSS Distributions  * Returns:	0			Success
250*a1e26a70SApple OSS Distributions  *
251*a1e26a70SApple OSS Distributions  * Notes:	The destroyed spawn attribute results in the void * pointer
252*a1e26a70SApple OSS Distributions  *		being set to NULL; subsequent use without reinitialization
253*a1e26a70SApple OSS Distributions  *		will result in explicit program failure (rather than merely
254*a1e26a70SApple OSS Distributions  *		"undefined behaviour").
255*a1e26a70SApple OSS Distributions  *
256*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
257*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by attr is invalid.
258*a1e26a70SApple OSS Distributions  */
259*a1e26a70SApple OSS Distributions static int posix_spawn_destroyportactions_np(posix_spawnattr_t *);
260*a1e26a70SApple OSS Distributions static int posix_spawn_destroycoalition_info_np(posix_spawnattr_t *);
261*a1e26a70SApple OSS Distributions static int posix_spawn_destroypersona_info_np(posix_spawnattr_t *);
262*a1e26a70SApple OSS Distributions static int posix_spawn_destroyposix_cred_info_np(posix_spawnattr_t *);
263*a1e26a70SApple OSS Distributions static int posix_spawn_destroymacpolicy_info_np(posix_spawnattr_t *);
264*a1e26a70SApple OSS Distributions static int posix_spawn_destroysubsystem_root_path_np(posix_spawnattr_t *);
265*a1e26a70SApple OSS Distributions static int posix_spawn_destroyconclave_id_np(posix_spawnattr_t *);
266*a1e26a70SApple OSS Distributions 
267*a1e26a70SApple OSS Distributions int
posix_spawnattr_destroy(posix_spawnattr_t * attr)268*a1e26a70SApple OSS Distributions posix_spawnattr_destroy(posix_spawnattr_t *attr)
269*a1e26a70SApple OSS Distributions {
270*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
271*a1e26a70SApple OSS Distributions 
272*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
273*a1e26a70SApple OSS Distributions 		return EINVAL;
274*a1e26a70SApple OSS Distributions 	}
275*a1e26a70SApple OSS Distributions 
276*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
277*a1e26a70SApple OSS Distributions 	posix_spawn_destroyportactions_np(attr);
278*a1e26a70SApple OSS Distributions 	posix_spawn_destroycoalition_info_np(attr);
279*a1e26a70SApple OSS Distributions 	posix_spawn_destroypersona_info_np(attr);
280*a1e26a70SApple OSS Distributions 	posix_spawn_destroyposix_cred_info_np(attr);
281*a1e26a70SApple OSS Distributions 	posix_spawn_destroymacpolicy_info_np(attr);
282*a1e26a70SApple OSS Distributions 	posix_spawn_destroysubsystem_root_path_np(attr);
283*a1e26a70SApple OSS Distributions 	posix_spawn_destroyconclave_id_np(attr);
284*a1e26a70SApple OSS Distributions 
285*a1e26a70SApple OSS Distributions 	free(psattr);
286*a1e26a70SApple OSS Distributions 	*attr = NULL;
287*a1e26a70SApple OSS Distributions 
288*a1e26a70SApple OSS Distributions 	return 0;
289*a1e26a70SApple OSS Distributions }
290*a1e26a70SApple OSS Distributions 
291*a1e26a70SApple OSS Distributions 
292*a1e26a70SApple OSS Distributions /*
293*a1e26a70SApple OSS Distributions  * posix_spawnattr_setflags
294*a1e26a70SApple OSS Distributions  *
295*a1e26a70SApple OSS Distributions  * Description:	Set the spawn flags attribute for the spawn attribute object
296*a1e26a70SApple OSS Distributions  *		referred to by 'attr'.
297*a1e26a70SApple OSS Distributions  *
298*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose flags
299*a1e26a70SApple OSS Distributions  *					are to be set
300*a1e26a70SApple OSS Distributions  *		flags			The flags value to set
301*a1e26a70SApple OSS Distributions  *
302*a1e26a70SApple OSS Distributions  * Returns:	0			Success
303*a1e26a70SApple OSS Distributions  *
304*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
305*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by attr is invalid.
306*a1e26a70SApple OSS Distributions  *		EINVAL	The value of the attribute being set is not valid.
307*a1e26a70SApple OSS Distributions  */
308*a1e26a70SApple OSS Distributions int
posix_spawnattr_setflags(posix_spawnattr_t * attr,short flags)309*a1e26a70SApple OSS Distributions posix_spawnattr_setflags(posix_spawnattr_t *attr, short flags)
310*a1e26a70SApple OSS Distributions {
311*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
312*a1e26a70SApple OSS Distributions 
313*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
314*a1e26a70SApple OSS Distributions 		return EINVAL;
315*a1e26a70SApple OSS Distributions 	}
316*a1e26a70SApple OSS Distributions 
317*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
318*a1e26a70SApple OSS Distributions 	psattr->psa_flags = flags;
319*a1e26a70SApple OSS Distributions 
320*a1e26a70SApple OSS Distributions 	return 0;
321*a1e26a70SApple OSS Distributions }
322*a1e26a70SApple OSS Distributions 
323*a1e26a70SApple OSS Distributions 
324*a1e26a70SApple OSS Distributions /*
325*a1e26a70SApple OSS Distributions  * posix_spawnattr_getflags
326*a1e26a70SApple OSS Distributions  *
327*a1e26a70SApple OSS Distributions  * Description:	Retrieve the spawn attributes flag for the spawn attributes
328*a1e26a70SApple OSS Distributions  *		object referenced by 'attr' and place them in the memory
329*a1e26a70SApple OSS Distributions  *		location referenced by 'flagsp'
330*a1e26a70SApple OSS Distributions  *
331*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose flags
332*a1e26a70SApple OSS Distributions  *					are to be retrieved
333*a1e26a70SApple OSS Distributions  *		flagsp			A pointer to a short value to receive
334*a1e26a70SApple OSS Distributions  *					the flags
335*a1e26a70SApple OSS Distributions  *
336*a1e26a70SApple OSS Distributions  * Returns:	0			Success
337*a1e26a70SApple OSS Distributions  *
338*a1e26a70SApple OSS Distributions  * Implicit Returns:
339*a1e26a70SApple OSS Distributions  *		*flagps (modified)	The flags value from the spawn
340*a1e26a70SApple OSS Distributions  *					attributes object
341*a1e26a70SApple OSS Distributions  *
342*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
343*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by attr is invalid.
344*a1e26a70SApple OSS Distributions  *		EINVAL	The value of the attribute being set is not valid.
345*a1e26a70SApple OSS Distributions  */
346*a1e26a70SApple OSS Distributions int
posix_spawnattr_getflags(const posix_spawnattr_t * __restrict attr,short * __restrict flagsp)347*a1e26a70SApple OSS Distributions posix_spawnattr_getflags(const posix_spawnattr_t * __restrict attr,
348*a1e26a70SApple OSS Distributions     short * __restrict flagsp)
349*a1e26a70SApple OSS Distributions {
350*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
351*a1e26a70SApple OSS Distributions 
352*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
353*a1e26a70SApple OSS Distributions 		return EINVAL;
354*a1e26a70SApple OSS Distributions 	}
355*a1e26a70SApple OSS Distributions 
356*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
357*a1e26a70SApple OSS Distributions 	*flagsp = psattr->psa_flags;
358*a1e26a70SApple OSS Distributions 
359*a1e26a70SApple OSS Distributions 	return 0;
360*a1e26a70SApple OSS Distributions }
361*a1e26a70SApple OSS Distributions 
362*a1e26a70SApple OSS Distributions 
363*a1e26a70SApple OSS Distributions /*
364*a1e26a70SApple OSS Distributions  * posix_spawnattr_getsigdefault
365*a1e26a70SApple OSS Distributions  *
366*a1e26a70SApple OSS Distributions  * Description:	Retrieve the set of signals to be set to default according to
367*a1e26a70SApple OSS Distributions  *		the spawn attribute value referenced by 'attr' and place the
368*a1e26a70SApple OSS Distributions  *		result into the memory containing the sigset_t referenced by
369*a1e26a70SApple OSS Distributions  *		'sigdefault'
370*a1e26a70SApple OSS Distributions  *
371*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
372*a1e26a70SApple OSS Distributions  *					signal set for default signals is to
373*a1e26a70SApple OSS Distributions  *					be retrieved
374*a1e26a70SApple OSS Distributions  *		sigdefault		A pointer to the sigset_t to receive
375*a1e26a70SApple OSS Distributions  *					the signal set
376*a1e26a70SApple OSS Distributions  *
377*a1e26a70SApple OSS Distributions  * Returns:	0			Success
378*a1e26a70SApple OSS Distributions  *
379*a1e26a70SApple OSS Distributions  * Implicit Returns:
380*a1e26a70SApple OSS Distributions  *		*sigdefault (modified)	The signal set of signals to default
381*a1e26a70SApple OSS Distributions  *					from the spawn attributes object
382*a1e26a70SApple OSS Distributions  */
383*a1e26a70SApple OSS Distributions int
posix_spawnattr_getsigdefault(const posix_spawnattr_t * __restrict attr,sigset_t * __restrict sigdefault)384*a1e26a70SApple OSS Distributions posix_spawnattr_getsigdefault(const posix_spawnattr_t * __restrict attr,
385*a1e26a70SApple OSS Distributions     sigset_t * __restrict sigdefault)
386*a1e26a70SApple OSS Distributions {
387*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
388*a1e26a70SApple OSS Distributions 
389*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
390*a1e26a70SApple OSS Distributions 		return EINVAL;
391*a1e26a70SApple OSS Distributions 	}
392*a1e26a70SApple OSS Distributions 
393*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
394*a1e26a70SApple OSS Distributions 	*sigdefault = psattr->psa_sigdefault;
395*a1e26a70SApple OSS Distributions 
396*a1e26a70SApple OSS Distributions 	return 0;
397*a1e26a70SApple OSS Distributions }
398*a1e26a70SApple OSS Distributions 
399*a1e26a70SApple OSS Distributions 
400*a1e26a70SApple OSS Distributions /*
401*a1e26a70SApple OSS Distributions  * posix_spawnattr_getpgroup
402*a1e26a70SApple OSS Distributions  *
403*a1e26a70SApple OSS Distributions  * Description:	Obtain the value of the spawn process group attribute from the
404*a1e26a70SApple OSS Distributions  *		spawn attributes object referenced by 'attr' and place the
405*a1e26a70SApple OSS Distributions  *		results in the memory location referenced by 'pgroup'
406*a1e26a70SApple OSS Distributions  *
407*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
408*a1e26a70SApple OSS Distributions  *					process group information is to be
409*a1e26a70SApple OSS Distributions  *					retrieved
410*a1e26a70SApple OSS Distributions  *		pgroup			A pointer to the pid_t to receive the
411*a1e26a70SApple OSS Distributions  *					process group
412*a1e26a70SApple OSS Distributions  *
413*a1e26a70SApple OSS Distributions  * Returns:	0			Success
414*a1e26a70SApple OSS Distributions  *
415*a1e26a70SApple OSS Distributions  * Implicit Returns:
416*a1e26a70SApple OSS Distributions  *		*pgroup (modified)	The process group information from the
417*a1e26a70SApple OSS Distributions  *					spawn attributes object
418*a1e26a70SApple OSS Distributions  */
419*a1e26a70SApple OSS Distributions int
posix_spawnattr_getpgroup(const posix_spawnattr_t * __restrict attr,pid_t * __restrict pgroup)420*a1e26a70SApple OSS Distributions posix_spawnattr_getpgroup(const posix_spawnattr_t * __restrict attr,
421*a1e26a70SApple OSS Distributions     pid_t * __restrict pgroup)
422*a1e26a70SApple OSS Distributions {
423*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
424*a1e26a70SApple OSS Distributions 
425*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
426*a1e26a70SApple OSS Distributions 		return EINVAL;
427*a1e26a70SApple OSS Distributions 	}
428*a1e26a70SApple OSS Distributions 
429*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
430*a1e26a70SApple OSS Distributions 	*pgroup = psattr->psa_pgroup;
431*a1e26a70SApple OSS Distributions 
432*a1e26a70SApple OSS Distributions 	return 0;
433*a1e26a70SApple OSS Distributions }
434*a1e26a70SApple OSS Distributions 
435*a1e26a70SApple OSS Distributions 
436*a1e26a70SApple OSS Distributions /*
437*a1e26a70SApple OSS Distributions  * posix_spawnattr_getsigmask
438*a1e26a70SApple OSS Distributions  *
439*a1e26a70SApple OSS Distributions  * Description:	Obtain the value of the spawn signal mask attribute from the
440*a1e26a70SApple OSS Distributions  *		spawn attributes object referenced by 'attr' and place the
441*a1e26a70SApple OSS Distributions  *		result into the memory containing the sigset_t referenced by
442*a1e26a70SApple OSS Distributions  *		'sigmask'
443*a1e26a70SApple OSS Distributions  *
444*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
445*a1e26a70SApple OSS Distributions  *					signal set for masked signals is to
446*a1e26a70SApple OSS Distributions  *					be retrieved
447*a1e26a70SApple OSS Distributions  *		sigmask		A pointer to the sigset_t to receive
448*a1e26a70SApple OSS Distributions  *					the signal set
449*a1e26a70SApple OSS Distributions  *
450*a1e26a70SApple OSS Distributions  * Returns:	0			Success
451*a1e26a70SApple OSS Distributions  *
452*a1e26a70SApple OSS Distributions  * Implicit Returns:
453*a1e26a70SApple OSS Distributions  *		*sigmask (modified)	The signal set of signals to mask
454*a1e26a70SApple OSS Distributions  *					from the spawn attributes object
455*a1e26a70SApple OSS Distributions  */
456*a1e26a70SApple OSS Distributions int
posix_spawnattr_getsigmask(const posix_spawnattr_t * __restrict attr,sigset_t * __restrict sigmask)457*a1e26a70SApple OSS Distributions posix_spawnattr_getsigmask(const posix_spawnattr_t * __restrict attr,
458*a1e26a70SApple OSS Distributions     sigset_t * __restrict sigmask)
459*a1e26a70SApple OSS Distributions {
460*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
461*a1e26a70SApple OSS Distributions 
462*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
463*a1e26a70SApple OSS Distributions 		return EINVAL;
464*a1e26a70SApple OSS Distributions 	}
465*a1e26a70SApple OSS Distributions 
466*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
467*a1e26a70SApple OSS Distributions 	*sigmask = psattr->psa_sigmask;
468*a1e26a70SApple OSS Distributions 
469*a1e26a70SApple OSS Distributions 	return 0;
470*a1e26a70SApple OSS Distributions }
471*a1e26a70SApple OSS Distributions 
472*a1e26a70SApple OSS Distributions /*
473*a1e26a70SApple OSS Distributions  * posix_spawnattr_getbinpref_np
474*a1e26a70SApple OSS Distributions  *
475*a1e26a70SApple OSS Distributions  * Description:	Obtain the value of the spawn binary preferences attribute from
476*a1e26a70SApple OSS Distributions  *              the spawn attributes object referenced by 'attr' and place the
477*a1e26a70SApple OSS Distributions  *		result into the memory referenced by 'pref'.
478*a1e26a70SApple OSS Distributions  *
479*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
480*a1e26a70SApple OSS Distributions  *					binary preferences are to be retrieved
481*a1e26a70SApple OSS Distributions  *		count			The size of the cpu_type_t array
482*a1e26a70SApple OSS Distributions  *		pref			An array of cpu types
483*a1e26a70SApple OSS Distributions  *		ocount			The actual number copied
484*a1e26a70SApple OSS Distributions  *
485*a1e26a70SApple OSS Distributions  * Returns:	0			No binary preferences found
486*a1e26a70SApple OSS Distributions  *              > 0			The number of cpu types (less than
487*a1e26a70SApple OSS Distributions  *                                      count) copied over from 'attr'.
488*a1e26a70SApple OSS Distributions  *
489*a1e26a70SApple OSS Distributions  * Implicit Returns:
490*a1e26a70SApple OSS Distributions  *		*pref (modified)	The binary preferences array
491*a1e26a70SApple OSS Distributions  *					from the spawn attributes object
492*a1e26a70SApple OSS Distributions  */
493*a1e26a70SApple OSS Distributions int
posix_spawnattr_getbinpref_np(const posix_spawnattr_t * __restrict attr,size_t count,cpu_type_t * pref,size_t * __restrict ocount)494*a1e26a70SApple OSS Distributions posix_spawnattr_getbinpref_np(const posix_spawnattr_t * __restrict attr,
495*a1e26a70SApple OSS Distributions     size_t count, cpu_type_t *pref, size_t * __restrict ocount)
496*a1e26a70SApple OSS Distributions {
497*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
498*a1e26a70SApple OSS Distributions 	int i = 0;
499*a1e26a70SApple OSS Distributions 
500*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL || pref == NULL) {
501*a1e26a70SApple OSS Distributions 		return EINVAL;
502*a1e26a70SApple OSS Distributions 	}
503*a1e26a70SApple OSS Distributions 
504*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
505*a1e26a70SApple OSS Distributions 	for (i = 0; i < count && i < NBINPREFS; i++) {
506*a1e26a70SApple OSS Distributions 		pref[i] = psattr->psa_binprefs[i];
507*a1e26a70SApple OSS Distributions 	}
508*a1e26a70SApple OSS Distributions 
509*a1e26a70SApple OSS Distributions 	if (ocount) {
510*a1e26a70SApple OSS Distributions 		*ocount = i;
511*a1e26a70SApple OSS Distributions 	}
512*a1e26a70SApple OSS Distributions 	return 0;
513*a1e26a70SApple OSS Distributions }
514*a1e26a70SApple OSS Distributions 
515*a1e26a70SApple OSS Distributions /*
516*a1e26a70SApple OSS Distributions  * posix_spawnattr_getarchpref_np
517*a1e26a70SApple OSS Distributions  *
518*a1e26a70SApple OSS Distributions  * Description:	Obtain the value of the spawn binary preferences attribute from
519*a1e26a70SApple OSS Distributions  *              the spawn attributes object referenced by 'attr' and place the
520*a1e26a70SApple OSS Distributions  *		result into the memory referenced by 'pref' and 'subpref'.
521*a1e26a70SApple OSS Distributions  *
522*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
523*a1e26a70SApple OSS Distributions  *					binary preferences are to be retrieved
524*a1e26a70SApple OSS Distributions  *		count			The size of the cpu_type_t array
525*a1e26a70SApple OSS Distributions  *		pref			An array of cpu types
526*a1e26a70SApple OSS Distributions  *		subpref			An array of subcpu types
527*a1e26a70SApple OSS Distributions  *		ocount			The actual number copied
528*a1e26a70SApple OSS Distributions  *
529*a1e26a70SApple OSS Distributions  * Returns:	0			No cpu/subcpu preferences found
530*a1e26a70SApple OSS Distributions  *              > 0			The number of types (less than
531*a1e26a70SApple OSS Distributions  *                                      count) copied over from 'attr'.
532*a1e26a70SApple OSS Distributions  *
533*a1e26a70SApple OSS Distributions  * Implicit Returns:
534*a1e26a70SApple OSS Distributions  *		*pref (modified)	The cpu preferences array
535*a1e26a70SApple OSS Distributions  *					from the spawn attributes object
536*a1e26a70SApple OSS Distributions  *		*subpref (modified)	The subcpu preferences array
537*a1e26a70SApple OSS Distributions  *					from the spawn attributes object
538*a1e26a70SApple OSS Distributions  */
539*a1e26a70SApple OSS Distributions int
posix_spawnattr_getarchpref_np(const posix_spawnattr_t * __restrict attr,size_t count,cpu_type_t * pref,cpu_subtype_t * subpref,size_t * __restrict ocount)540*a1e26a70SApple OSS Distributions posix_spawnattr_getarchpref_np(const posix_spawnattr_t * __restrict attr,
541*a1e26a70SApple OSS Distributions     size_t count, cpu_type_t *pref, cpu_subtype_t *subpref, size_t * __restrict ocount)
542*a1e26a70SApple OSS Distributions {
543*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
544*a1e26a70SApple OSS Distributions 	int i = 0;
545*a1e26a70SApple OSS Distributions 
546*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL || pref == NULL || subpref == NULL) {
547*a1e26a70SApple OSS Distributions 		return EINVAL;
548*a1e26a70SApple OSS Distributions 	}
549*a1e26a70SApple OSS Distributions 
550*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
551*a1e26a70SApple OSS Distributions 	for (i = 0; i < count && i < NBINPREFS; i++) {
552*a1e26a70SApple OSS Distributions 		pref[i] = psattr->psa_binprefs[i];
553*a1e26a70SApple OSS Distributions 		subpref[i] = psattr->psa_subcpuprefs[i];
554*a1e26a70SApple OSS Distributions 	}
555*a1e26a70SApple OSS Distributions 
556*a1e26a70SApple OSS Distributions 	if (ocount) {
557*a1e26a70SApple OSS Distributions 		*ocount = i;
558*a1e26a70SApple OSS Distributions 	}
559*a1e26a70SApple OSS Distributions 	return 0;
560*a1e26a70SApple OSS Distributions }
561*a1e26a70SApple OSS Distributions 
562*a1e26a70SApple OSS Distributions 
563*a1e26a70SApple OSS Distributions /*
564*a1e26a70SApple OSS Distributions  * posix_spawnattr_getpcontrol_np
565*a1e26a70SApple OSS Distributions  *
566*a1e26a70SApple OSS Distributions  * Description:	Retrieve the  process control property set default according to
567*a1e26a70SApple OSS Distributions  *		the spawn attribute value referenced by 'attr' and place the
568*a1e26a70SApple OSS Distributions  *		result into the memory containing the control  referenced by
569*a1e26a70SApple OSS Distributions  *		'pcontrol'
570*a1e26a70SApple OSS Distributions  *
571*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
572*a1e26a70SApple OSS Distributions  *					signal set for default signals is to
573*a1e26a70SApple OSS Distributions  *					be retrieved
574*a1e26a70SApple OSS Distributions  *		pcontrol		A pointer to an int  to receive
575*a1e26a70SApple OSS Distributions  *					the process control info
576*a1e26a70SApple OSS Distributions  *
577*a1e26a70SApple OSS Distributions  * Returns:	0			Success
578*a1e26a70SApple OSS Distributions  *
579*a1e26a70SApple OSS Distributions  * Implicit Returns:
580*a1e26a70SApple OSS Distributions  *		*pcontrol (modified)	The signal set of signals to default
581*a1e26a70SApple OSS Distributions  *					from the spawn attributes object
582*a1e26a70SApple OSS Distributions  */
583*a1e26a70SApple OSS Distributions int
posix_spawnattr_getpcontrol_np(const posix_spawnattr_t * __restrict attr,int * __restrict pcontrol)584*a1e26a70SApple OSS Distributions posix_spawnattr_getpcontrol_np(const posix_spawnattr_t * __restrict attr,
585*a1e26a70SApple OSS Distributions     int * __restrict pcontrol)
586*a1e26a70SApple OSS Distributions {
587*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
588*a1e26a70SApple OSS Distributions 
589*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
590*a1e26a70SApple OSS Distributions 		return EINVAL;
591*a1e26a70SApple OSS Distributions 	}
592*a1e26a70SApple OSS Distributions 
593*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
594*a1e26a70SApple OSS Distributions 	*pcontrol = psattr->psa_pcontrol;
595*a1e26a70SApple OSS Distributions 
596*a1e26a70SApple OSS Distributions 	return 0;
597*a1e26a70SApple OSS Distributions }
598*a1e26a70SApple OSS Distributions 
599*a1e26a70SApple OSS Distributions /*
600*a1e26a70SApple OSS Distributions  * posix_spawnattr_getprocesstype_np
601*a1e26a70SApple OSS Distributions  *
602*a1e26a70SApple OSS Distributions  * Description:	Retrieve the  process specific behaviors and app launch types
603*a1e26a70SApple OSS Distributions  *		spawn attribute value referenced by 'attr' and place the
604*a1e26a70SApple OSS Distributions  *		result into the memory containing the control  referenced by
605*a1e26a70SApple OSS Distributions  *		'proctype'
606*a1e26a70SApple OSS Distributions  *
607*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
608*a1e26a70SApple OSS Distributions  *					signal set for default signals is to
609*a1e26a70SApple OSS Distributions  *					be retrieved
610*a1e26a70SApple OSS Distributions  *		proctype		A pointer to an int  to receive
611*a1e26a70SApple OSS Distributions  *					the process type info
612*a1e26a70SApple OSS Distributions  *
613*a1e26a70SApple OSS Distributions  * Returns:	0			Success
614*a1e26a70SApple OSS Distributions  *
615*a1e26a70SApple OSS Distributions  * Implicit Returns:
616*a1e26a70SApple OSS Distributions  *		*proctype (modified)	The process type set to value
617*a1e26a70SApple OSS Distributions  *					from the spawn attributes object
618*a1e26a70SApple OSS Distributions  */
619*a1e26a70SApple OSS Distributions int
posix_spawnattr_getprocesstype_np(const posix_spawnattr_t * __restrict attr,int * __restrict proctype)620*a1e26a70SApple OSS Distributions posix_spawnattr_getprocesstype_np(const posix_spawnattr_t * __restrict attr,
621*a1e26a70SApple OSS Distributions     int * __restrict proctype)
622*a1e26a70SApple OSS Distributions {
623*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
624*a1e26a70SApple OSS Distributions 
625*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
626*a1e26a70SApple OSS Distributions 		return EINVAL;
627*a1e26a70SApple OSS Distributions 	}
628*a1e26a70SApple OSS Distributions 
629*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
630*a1e26a70SApple OSS Distributions 	*proctype = psattr->psa_apptype;
631*a1e26a70SApple OSS Distributions 
632*a1e26a70SApple OSS Distributions 	return 0;
633*a1e26a70SApple OSS Distributions }
634*a1e26a70SApple OSS Distributions /*
635*a1e26a70SApple OSS Distributions  * posix_spawnattr_setsigdefault
636*a1e26a70SApple OSS Distributions  *
637*a1e26a70SApple OSS Distributions  * Description:	Set the set of signals to be set to default for the spawn
638*a1e26a70SApple OSS Distributions  *		attribute value referenced by 'attr' from the memory
639*a1e26a70SApple OSS Distributions  *		containing the sigset_t referenced by 'sigdefault'
640*a1e26a70SApple OSS Distributions  *
641*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
642*a1e26a70SApple OSS Distributions  *					signal set for default signals is to
643*a1e26a70SApple OSS Distributions  *					be set
644*a1e26a70SApple OSS Distributions  *		sigdefault		A pointer to the sigset_t from which to
645*a1e26a70SApple OSS Distributions  *					obtain the signal set
646*a1e26a70SApple OSS Distributions  *
647*a1e26a70SApple OSS Distributions  * Returns:	0			Success
648*a1e26a70SApple OSS Distributions  */
649*a1e26a70SApple OSS Distributions int
posix_spawnattr_setsigdefault(posix_spawnattr_t * __restrict attr,const sigset_t * __restrict sigdefault)650*a1e26a70SApple OSS Distributions posix_spawnattr_setsigdefault(posix_spawnattr_t * __restrict attr,
651*a1e26a70SApple OSS Distributions     const sigset_t * __restrict sigdefault)
652*a1e26a70SApple OSS Distributions {
653*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
654*a1e26a70SApple OSS Distributions 
655*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
656*a1e26a70SApple OSS Distributions 		return EINVAL;
657*a1e26a70SApple OSS Distributions 	}
658*a1e26a70SApple OSS Distributions 
659*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
660*a1e26a70SApple OSS Distributions 	psattr->psa_sigdefault = *sigdefault;
661*a1e26a70SApple OSS Distributions 
662*a1e26a70SApple OSS Distributions 	return 0;
663*a1e26a70SApple OSS Distributions }
664*a1e26a70SApple OSS Distributions 
665*a1e26a70SApple OSS Distributions 
666*a1e26a70SApple OSS Distributions /*
667*a1e26a70SApple OSS Distributions  * posix_spawnattr_setpgroup
668*a1e26a70SApple OSS Distributions  *
669*a1e26a70SApple OSS Distributions  * Description:	Set the value of the spawn process group attribute for the
670*a1e26a70SApple OSS Distributions  *		spawn attributes object referenced by 'attr' from the value
671*a1e26a70SApple OSS Distributions  *		of 'pgroup'
672*a1e26a70SApple OSS Distributions  *
673*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object for which
674*a1e26a70SApple OSS Distributions  *					the process group information is to be
675*a1e26a70SApple OSS Distributions  *					set
676*a1e26a70SApple OSS Distributions  *		pgroup			The process group to set
677*a1e26a70SApple OSS Distributions  *
678*a1e26a70SApple OSS Distributions  * Returns:	0			Success
679*a1e26a70SApple OSS Distributions  */
680*a1e26a70SApple OSS Distributions int
posix_spawnattr_setpgroup(posix_spawnattr_t * attr,pid_t pgroup)681*a1e26a70SApple OSS Distributions posix_spawnattr_setpgroup(posix_spawnattr_t * attr, pid_t pgroup)
682*a1e26a70SApple OSS Distributions {
683*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
684*a1e26a70SApple OSS Distributions 
685*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
686*a1e26a70SApple OSS Distributions 		return EINVAL;
687*a1e26a70SApple OSS Distributions 	}
688*a1e26a70SApple OSS Distributions 
689*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
690*a1e26a70SApple OSS Distributions 	psattr->psa_pgroup = pgroup;
691*a1e26a70SApple OSS Distributions 
692*a1e26a70SApple OSS Distributions 	return 0;
693*a1e26a70SApple OSS Distributions }
694*a1e26a70SApple OSS Distributions 
695*a1e26a70SApple OSS Distributions 
696*a1e26a70SApple OSS Distributions /*
697*a1e26a70SApple OSS Distributions  * posix_spawnattr_setsigmask
698*a1e26a70SApple OSS Distributions  *
699*a1e26a70SApple OSS Distributions  * Description:	Set the set of signals to be masked for the spawn attribute
700*a1e26a70SApple OSS Distributions  *		value referenced by 'attr' from the memory containing the
701*a1e26a70SApple OSS Distributions  *		sigset_t referenced by 'sigmask'
702*a1e26a70SApple OSS Distributions  *
703*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
704*a1e26a70SApple OSS Distributions  *					signal set for masked signals is to
705*a1e26a70SApple OSS Distributions  *					be set
706*a1e26a70SApple OSS Distributions  *		sigmask		A pointer to the sigset_t from which to
707*a1e26a70SApple OSS Distributions  *					obtain the signal set
708*a1e26a70SApple OSS Distributions  *
709*a1e26a70SApple OSS Distributions  * Returns:	0			Success
710*a1e26a70SApple OSS Distributions  */
711*a1e26a70SApple OSS Distributions int
posix_spawnattr_setsigmask(posix_spawnattr_t * __restrict attr,const sigset_t * __restrict sigmask)712*a1e26a70SApple OSS Distributions posix_spawnattr_setsigmask(posix_spawnattr_t * __restrict attr,
713*a1e26a70SApple OSS Distributions     const sigset_t * __restrict sigmask)
714*a1e26a70SApple OSS Distributions {
715*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
716*a1e26a70SApple OSS Distributions 
717*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
718*a1e26a70SApple OSS Distributions 		return EINVAL;
719*a1e26a70SApple OSS Distributions 	}
720*a1e26a70SApple OSS Distributions 
721*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
722*a1e26a70SApple OSS Distributions 	psattr->psa_sigmask = *sigmask;
723*a1e26a70SApple OSS Distributions 
724*a1e26a70SApple OSS Distributions 	return 0;
725*a1e26a70SApple OSS Distributions }
726*a1e26a70SApple OSS Distributions 
727*a1e26a70SApple OSS Distributions 
728*a1e26a70SApple OSS Distributions /*
729*a1e26a70SApple OSS Distributions  * posix_spawnattr_setbinpref_np
730*a1e26a70SApple OSS Distributions  *
731*a1e26a70SApple OSS Distributions  * Description:	Set the universal binary preferences for the spawn attribute
732*a1e26a70SApple OSS Distributions  *		value referenced by 'attr' from the memory containing the
733*a1e26a70SApple OSS Distributions  *		cpu_type_t array referenced by 'pref', size of 'count'
734*a1e26a70SApple OSS Distributions  *
735*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
736*a1e26a70SApple OSS Distributions  *                                      binary preferences are to be set
737*a1e26a70SApple OSS Distributions  *              count			Size of the array pointed to by 'pref'
738*a1e26a70SApple OSS Distributions  *              pref			cpu_type_t array of binary preferences
739*a1e26a70SApple OSS Distributions  *		ocount			The actual number copied
740*a1e26a70SApple OSS Distributions  *
741*a1e26a70SApple OSS Distributions  * Returns:	0			No preferences copied
742*a1e26a70SApple OSS Distributions  *              > 0			Number of preferences copied
743*a1e26a70SApple OSS Distributions  *
744*a1e26a70SApple OSS Distributions  * Note:	The posix_spawnattr_t currently only holds four cpu_type_t's.
745*a1e26a70SApple OSS Distributions  *              If the caller provides more preferences than this limit, they
746*a1e26a70SApple OSS Distributions  *              will be ignored, as reflected in the return value.
747*a1e26a70SApple OSS Distributions  */
748*a1e26a70SApple OSS Distributions int
posix_spawnattr_setbinpref_np(posix_spawnattr_t * __restrict attr,size_t count,cpu_type_t * pref,size_t * __restrict ocount)749*a1e26a70SApple OSS Distributions posix_spawnattr_setbinpref_np(posix_spawnattr_t * __restrict attr,
750*a1e26a70SApple OSS Distributions     size_t count, cpu_type_t *pref, size_t * __restrict ocount)
751*a1e26a70SApple OSS Distributions {
752*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
753*a1e26a70SApple OSS Distributions 	int i = 0;
754*a1e26a70SApple OSS Distributions 
755*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL || pref == NULL) {
756*a1e26a70SApple OSS Distributions 		return EINVAL;
757*a1e26a70SApple OSS Distributions 	}
758*a1e26a70SApple OSS Distributions 
759*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
760*a1e26a70SApple OSS Distributions 	for (i = 0; i < count && i < NBINPREFS; i++) {
761*a1e26a70SApple OSS Distributions 		psattr->psa_binprefs[i] = pref[i];
762*a1e26a70SApple OSS Distributions 		psattr->psa_subcpuprefs[i] = CPU_SUBTYPE_ANY;
763*a1e26a70SApple OSS Distributions 	}
764*a1e26a70SApple OSS Distributions 
765*a1e26a70SApple OSS Distributions 	/* return number of binprefs copied over */
766*a1e26a70SApple OSS Distributions 	if (ocount) {
767*a1e26a70SApple OSS Distributions 		*ocount = i;
768*a1e26a70SApple OSS Distributions 	}
769*a1e26a70SApple OSS Distributions 
770*a1e26a70SApple OSS Distributions 	for (; i < NBINPREFS; i++) {
771*a1e26a70SApple OSS Distributions 		psattr->psa_binprefs[i] = 0;
772*a1e26a70SApple OSS Distributions 		psattr->psa_subcpuprefs[i] = CPU_SUBTYPE_ANY;
773*a1e26a70SApple OSS Distributions 	}
774*a1e26a70SApple OSS Distributions 
775*a1e26a70SApple OSS Distributions 	return 0;
776*a1e26a70SApple OSS Distributions }
777*a1e26a70SApple OSS Distributions 
778*a1e26a70SApple OSS Distributions /*
779*a1e26a70SApple OSS Distributions  * posix_spawnattr_setarchpref_np
780*a1e26a70SApple OSS Distributions  *
781*a1e26a70SApple OSS Distributions  * Description:	Set the universal binary preferences for the spawn attribute
782*a1e26a70SApple OSS Distributions  *		value referenced by 'attr' from the memory containing the
783*a1e26a70SApple OSS Distributions  *		cpu_type_t array referenced by 'pref', the cpu_subtype_t array
784*a1e26a70SApple OSS Distributions  *		referenced by 'subpref' and size of 'count'
785*a1e26a70SApple OSS Distributions  *
786*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
787*a1e26a70SApple OSS Distributions  *                                      binary preferences are to be set
788*a1e26a70SApple OSS Distributions  *              count			Size of the array pointed to by 'pref'
789*a1e26a70SApple OSS Distributions  *              pref			cpu_type_t array of cpu binary preferences
790*a1e26a70SApple OSS Distributions  *              subpref			cpu_subtype_t array of subcpu binary preferences
791*a1e26a70SApple OSS Distributions  *		ocount			The actual number copied
792*a1e26a70SApple OSS Distributions  *
793*a1e26a70SApple OSS Distributions  * Returns:	0			No preferences copied
794*a1e26a70SApple OSS Distributions  *              > 0			Number of preferences copied
795*a1e26a70SApple OSS Distributions  *
796*a1e26a70SApple OSS Distributions  * Note:	The posix_spawnattr_t currently only holds four
797*a1e26a70SApple OSS Distributions  *              cpu_type_t/cpu_subtype_t pairs.
798*a1e26a70SApple OSS Distributions  *              If the caller provides more preferences than this limit, they
799*a1e26a70SApple OSS Distributions  *              will be ignored, as reflected in the return value.
800*a1e26a70SApple OSS Distributions  */
801*a1e26a70SApple OSS Distributions int
posix_spawnattr_setarchpref_np(posix_spawnattr_t * __restrict attr,size_t count,cpu_type_t * pref,cpu_subtype_t * subpref,size_t * __restrict ocount)802*a1e26a70SApple OSS Distributions posix_spawnattr_setarchpref_np(posix_spawnattr_t * __restrict attr,
803*a1e26a70SApple OSS Distributions     size_t count, cpu_type_t *pref, cpu_subtype_t *subpref,
804*a1e26a70SApple OSS Distributions     size_t * __restrict ocount)
805*a1e26a70SApple OSS Distributions {
806*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
807*a1e26a70SApple OSS Distributions 	int i = 0;
808*a1e26a70SApple OSS Distributions 
809*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL || pref == NULL || subpref == NULL) {
810*a1e26a70SApple OSS Distributions 		return EINVAL;
811*a1e26a70SApple OSS Distributions 	}
812*a1e26a70SApple OSS Distributions 
813*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
814*a1e26a70SApple OSS Distributions 	for (i = 0; i < count && i < NBINPREFS; i++) {
815*a1e26a70SApple OSS Distributions 		psattr->psa_binprefs[i] = pref[i];
816*a1e26a70SApple OSS Distributions 		psattr->psa_subcpuprefs[i] = subpref[i];
817*a1e26a70SApple OSS Distributions 	}
818*a1e26a70SApple OSS Distributions 
819*a1e26a70SApple OSS Distributions 	/* return number of binprefs copied over */
820*a1e26a70SApple OSS Distributions 	if (ocount) {
821*a1e26a70SApple OSS Distributions 		*ocount = i;
822*a1e26a70SApple OSS Distributions 	}
823*a1e26a70SApple OSS Distributions 
824*a1e26a70SApple OSS Distributions 	for (; i < NBINPREFS; i++) {
825*a1e26a70SApple OSS Distributions 		psattr->psa_binprefs[i] = 0;
826*a1e26a70SApple OSS Distributions 		psattr->psa_subcpuprefs[i] = CPU_SUBTYPE_ANY;
827*a1e26a70SApple OSS Distributions 	}
828*a1e26a70SApple OSS Distributions 
829*a1e26a70SApple OSS Distributions 	return 0;
830*a1e26a70SApple OSS Distributions }
831*a1e26a70SApple OSS Distributions 
832*a1e26a70SApple OSS Distributions /*
833*a1e26a70SApple OSS Distributions  * posix_spawnattr_setpcontrol_np
834*a1e26a70SApple OSS Distributions  *
835*a1e26a70SApple OSS Distributions  * Description:	Set the process control property according to
836*a1e26a70SApple OSS Distributions  *		attribute value referenced by 'attr' from the memory
837*a1e26a70SApple OSS Distributions  *		containing the int value 'pcontrol'
838*a1e26a70SApple OSS Distributions  *
839*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
840*a1e26a70SApple OSS Distributions  *					signal set for default signals is to
841*a1e26a70SApple OSS Distributions  *					be set
842*a1e26a70SApple OSS Distributions  *		pcontrol		An int value of the process control info
843*a1e26a70SApple OSS Distributions  *
844*a1e26a70SApple OSS Distributions  * Returns:	0			Success
845*a1e26a70SApple OSS Distributions  */
846*a1e26a70SApple OSS Distributions int
posix_spawnattr_setpcontrol_np(posix_spawnattr_t * __restrict attr,const int pcontrol)847*a1e26a70SApple OSS Distributions posix_spawnattr_setpcontrol_np(posix_spawnattr_t * __restrict attr,
848*a1e26a70SApple OSS Distributions     const int pcontrol)
849*a1e26a70SApple OSS Distributions {
850*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
851*a1e26a70SApple OSS Distributions 
852*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
853*a1e26a70SApple OSS Distributions 		return EINVAL;
854*a1e26a70SApple OSS Distributions 	}
855*a1e26a70SApple OSS Distributions 
856*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
857*a1e26a70SApple OSS Distributions 	psattr->psa_pcontrol = pcontrol;
858*a1e26a70SApple OSS Distributions 
859*a1e26a70SApple OSS Distributions 	return 0;
860*a1e26a70SApple OSS Distributions }
861*a1e26a70SApple OSS Distributions 
862*a1e26a70SApple OSS Distributions 
863*a1e26a70SApple OSS Distributions /*
864*a1e26a70SApple OSS Distributions  * posix_spawnattr_setprocesstype_np
865*a1e26a70SApple OSS Distributions  *
866*a1e26a70SApple OSS Distributions  * Description:	Set the process specific behaviors and app launch type
867*a1e26a70SApple OSS Distributions  *		attribute value referenced by 'attr' from the memory
868*a1e26a70SApple OSS Distributions  *		containing the int value 'proctype'
869*a1e26a70SApple OSS Distributions  *
870*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
871*a1e26a70SApple OSS Distributions  *					signal set for default signals is to
872*a1e26a70SApple OSS Distributions  *					be set
873*a1e26a70SApple OSS Distributions  *		proctype		An int value of the process type info
874*a1e26a70SApple OSS Distributions  *
875*a1e26a70SApple OSS Distributions  * Returns:	0			Success
876*a1e26a70SApple OSS Distributions  */
877*a1e26a70SApple OSS Distributions int
posix_spawnattr_setprocesstype_np(posix_spawnattr_t * __restrict attr,const int proctype)878*a1e26a70SApple OSS Distributions posix_spawnattr_setprocesstype_np(posix_spawnattr_t * __restrict attr,
879*a1e26a70SApple OSS Distributions     const int proctype)
880*a1e26a70SApple OSS Distributions {
881*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
882*a1e26a70SApple OSS Distributions 
883*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
884*a1e26a70SApple OSS Distributions 		return EINVAL;
885*a1e26a70SApple OSS Distributions 	}
886*a1e26a70SApple OSS Distributions 
887*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
888*a1e26a70SApple OSS Distributions 	psattr->psa_apptype = proctype;
889*a1e26a70SApple OSS Distributions 
890*a1e26a70SApple OSS Distributions 	return 0;
891*a1e26a70SApple OSS Distributions }
892*a1e26a70SApple OSS Distributions 
893*a1e26a70SApple OSS Distributions 
894*a1e26a70SApple OSS Distributions /*
895*a1e26a70SApple OSS Distributions  * posix_spawnattr_setdataless_iopolicy_np
896*a1e26a70SApple OSS Distributions  *
897*a1e26a70SApple OSS Distributions  * Description:	Set the process iopolicy to materialize dataless files
898*a1e26a70SApple OSS Distributions  *
899*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object whose
900*a1e26a70SApple OSS Distributions  *					iopolicy to materialize dataless files
901*a1e26a70SApple OSS Distributions  *					is to be set
902*a1e26a70SApple OSS Distributions  *		policy			io policy for dataless files
903*a1e26a70SApple OSS Distributions  *
904*a1e26a70SApple OSS Distributions  * Returns:	0			Success
905*a1e26a70SApple OSS Distributions  *		EINVAL			Invalid Input
906*a1e26a70SApple OSS Distributions  */
907*a1e26a70SApple OSS Distributions int
posix_spawnattr_setdataless_iopolicy_np(posix_spawnattr_t * __restrict attr,const int policy)908*a1e26a70SApple OSS Distributions posix_spawnattr_setdataless_iopolicy_np(posix_spawnattr_t * __restrict attr,
909*a1e26a70SApple OSS Distributions     const int policy)
910*a1e26a70SApple OSS Distributions {
911*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
912*a1e26a70SApple OSS Distributions 
913*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
914*a1e26a70SApple OSS Distributions 		return EINVAL;
915*a1e26a70SApple OSS Distributions 	}
916*a1e26a70SApple OSS Distributions 
917*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
918*a1e26a70SApple OSS Distributions 	psattr->psa_options |= PSA_OPTION_DATALESS_IOPOLICY;
919*a1e26a70SApple OSS Distributions 	psattr->psa_dataless_iopolicy = policy;
920*a1e26a70SApple OSS Distributions 
921*a1e26a70SApple OSS Distributions 	return 0;
922*a1e26a70SApple OSS Distributions }
923*a1e26a70SApple OSS Distributions 
924*a1e26a70SApple OSS Distributions /*
925*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_use_sec_transition_shims_np
926*a1e26a70SApple OSS Distributions  * Description: Set flag to enable security shims on the spawned process.
927*a1e26a70SApple OSS Distributions  */
928*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_use_sec_transition_shims_np(posix_spawnattr_t * attr,uint32_t flags)929*a1e26a70SApple OSS Distributions posix_spawnattr_set_use_sec_transition_shims_np(posix_spawnattr_t *attr, uint32_t flags)
930*a1e26a70SApple OSS Distributions {
931*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
932*a1e26a70SApple OSS Distributions 	posix_spawn_secflag_options sec_flags;
933*a1e26a70SApple OSS Distributions 
934*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
935*a1e26a70SApple OSS Distributions 		return EINVAL;
936*a1e26a70SApple OSS Distributions 	}
937*a1e26a70SApple OSS Distributions 
938*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
939*a1e26a70SApple OSS Distributions 	sec_flags = (posix_spawn_secflag_options)(flags);
940*a1e26a70SApple OSS Distributions 
941*a1e26a70SApple OSS Distributions 	if (!(sec_flags & POSIX_SPAWN_SECFLAG_EXPLICIT_DISABLE) &&
942*a1e26a70SApple OSS Distributions 	    !(sec_flags & POSIX_SPAWN_SECFLAG_EXPLICIT_REQUIRE_ENABLE)) {
943*a1e26a70SApple OSS Distributions 		/*
944*a1e26a70SApple OSS Distributions 		 * For a long time we've had this unconditional setting
945*a1e26a70SApple OSS Distributions 		 * of POSIX_SPAWN_SECFLAG_EXPLICIT_ENABLE whenever this
946*a1e26a70SApple OSS Distributions 		 * function is called. This setting makes little sense
947*a1e26a70SApple OSS Distributions 		 * in face of a request to explicitly disable (in fact, that's
948*a1e26a70SApple OSS Distributions 		 * a combo that is explicitly refused by the kernel) and
949*a1e26a70SApple OSS Distributions 		 * completely defeats the purpose of EXPLICIT_REQUIRE_ENABLE.
950*a1e26a70SApple OSS Distributions 		 * To not risk breaking test environments that may incorrectly
951*a1e26a70SApple OSS Distributions 		 * rely on this behavior, we single out the DISABLE and EXPLICIT_REQUIRE cases
952*a1e26a70SApple OSS Distributions 		 * and proceed otherwise setting the flag.
953*a1e26a70SApple OSS Distributions 		 */
954*a1e26a70SApple OSS Distributions 		sec_flags |= POSIX_SPAWN_SECFLAG_EXPLICIT_ENABLE;
955*a1e26a70SApple OSS Distributions 	}
956*a1e26a70SApple OSS Distributions 
957*a1e26a70SApple OSS Distributions 	/*
958*a1e26a70SApple OSS Distributions 	 * Inheritance used to be the internal default, so we maintain legacy
959*a1e26a70SApple OSS Distributions 	 * behavior in this API, as Xcode and internal tests expect.
960*a1e26a70SApple OSS Distributions 	 */
961*a1e26a70SApple OSS Distributions 	if (!(sec_flags & POSIX_SPAWN_SECFLAG_EXPLICIT_DISABLE_INHERIT)) {
962*a1e26a70SApple OSS Distributions 		sec_flags |= POSIX_SPAWN_SECFLAG_EXPLICIT_ENABLE_INHERIT;
963*a1e26a70SApple OSS Distributions 	}
964*a1e26a70SApple OSS Distributions 
965*a1e26a70SApple OSS Distributions 	psattr->psa_sec_flags = (uint16_t)sec_flags;
966*a1e26a70SApple OSS Distributions 
967*a1e26a70SApple OSS Distributions 	return 0;
968*a1e26a70SApple OSS Distributions }
969*a1e26a70SApple OSS Distributions 
970*a1e26a70SApple OSS Distributions 
971*a1e26a70SApple OSS Distributions /*
972*a1e26a70SApple OSS Distributions  * posix_spawn_createportactions_np
973*a1e26a70SApple OSS Distributions  * Description: create a new posix_spawn_port_actions struct and link
974*a1e26a70SApple OSS Distributions  *      it into the posix_spawnattr.
975*a1e26a70SApple OSS Distributions  */
976*a1e26a70SApple OSS Distributions static int
posix_spawn_createportactions_np(posix_spawnattr_t * attr)977*a1e26a70SApple OSS Distributions posix_spawn_createportactions_np(posix_spawnattr_t *attr)
978*a1e26a70SApple OSS Distributions {
979*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
980*a1e26a70SApple OSS Distributions 	_posix_spawn_port_actions_t acts;
981*a1e26a70SApple OSS Distributions 
982*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
983*a1e26a70SApple OSS Distributions 		return EINVAL;
984*a1e26a70SApple OSS Distributions 	}
985*a1e26a70SApple OSS Distributions 
986*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
987*a1e26a70SApple OSS Distributions 	acts = (_posix_spawn_port_actions_t)malloc(PS_PORT_ACTIONS_SIZE(2));
988*a1e26a70SApple OSS Distributions 	if (acts == NULL) {
989*a1e26a70SApple OSS Distributions 		return ENOMEM;
990*a1e26a70SApple OSS Distributions 	}
991*a1e26a70SApple OSS Distributions 
992*a1e26a70SApple OSS Distributions 	acts->pspa_alloc = 2;
993*a1e26a70SApple OSS Distributions 	acts->pspa_count = 0;
994*a1e26a70SApple OSS Distributions 
995*a1e26a70SApple OSS Distributions 	psattr->psa_ports = acts;
996*a1e26a70SApple OSS Distributions 	return 0;
997*a1e26a70SApple OSS Distributions }
998*a1e26a70SApple OSS Distributions 
999*a1e26a70SApple OSS Distributions /*
1000*a1e26a70SApple OSS Distributions  * posix_spawn_growportactions_np
1001*a1e26a70SApple OSS Distributions  * Description: Enlarge the size of portactions if necessary
1002*a1e26a70SApple OSS Distributions  */
1003*a1e26a70SApple OSS Distributions static int
posix_spawn_growportactions_np(posix_spawnattr_t * attr)1004*a1e26a70SApple OSS Distributions posix_spawn_growportactions_np(posix_spawnattr_t *attr)
1005*a1e26a70SApple OSS Distributions {
1006*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1007*a1e26a70SApple OSS Distributions 	_posix_spawn_port_actions_t acts;
1008*a1e26a70SApple OSS Distributions 
1009*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1010*a1e26a70SApple OSS Distributions 		return EINVAL;
1011*a1e26a70SApple OSS Distributions 	}
1012*a1e26a70SApple OSS Distributions 
1013*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1014*a1e26a70SApple OSS Distributions 	acts = psattr->psa_ports;
1015*a1e26a70SApple OSS Distributions 	if (acts == NULL) {
1016*a1e26a70SApple OSS Distributions 		return EINVAL;
1017*a1e26a70SApple OSS Distributions 	}
1018*a1e26a70SApple OSS Distributions 
1019*a1e26a70SApple OSS Distributions 	/* Double number of port actions allocated for */
1020*a1e26a70SApple OSS Distributions 	int newnum = 0;
1021*a1e26a70SApple OSS Distributions 	if (os_mul_overflow(acts->pspa_alloc, 2, &newnum)) {
1022*a1e26a70SApple OSS Distributions 		return ENOMEM;
1023*a1e26a70SApple OSS Distributions 	}
1024*a1e26a70SApple OSS Distributions 	size_t newsize = PS_PORT_ACTIONS_SIZE(newnum);
1025*a1e26a70SApple OSS Distributions 	if (newsize == 0) {
1026*a1e26a70SApple OSS Distributions 		return ENOMEM;
1027*a1e26a70SApple OSS Distributions 	}
1028*a1e26a70SApple OSS Distributions 
1029*a1e26a70SApple OSS Distributions 	acts = realloc(acts, newsize);
1030*a1e26a70SApple OSS Distributions 	if (acts == NULL) {
1031*a1e26a70SApple OSS Distributions 		return ENOMEM;
1032*a1e26a70SApple OSS Distributions 	}
1033*a1e26a70SApple OSS Distributions 
1034*a1e26a70SApple OSS Distributions 	acts->pspa_alloc = newnum;
1035*a1e26a70SApple OSS Distributions 	psattr->psa_ports = acts;
1036*a1e26a70SApple OSS Distributions 	return 0;
1037*a1e26a70SApple OSS Distributions }
1038*a1e26a70SApple OSS Distributions 
1039*a1e26a70SApple OSS Distributions /*
1040*a1e26a70SApple OSS Distributions  * posix_spawn_destroyportactions_np
1041*a1e26a70SApple OSS Distributions  * Description: clean up portactions struct in posix_spawnattr_t attr
1042*a1e26a70SApple OSS Distributions  */
1043*a1e26a70SApple OSS Distributions static int
posix_spawn_destroyportactions_np(posix_spawnattr_t * attr)1044*a1e26a70SApple OSS Distributions posix_spawn_destroyportactions_np(posix_spawnattr_t *attr)
1045*a1e26a70SApple OSS Distributions {
1046*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1047*a1e26a70SApple OSS Distributions 	_posix_spawn_port_actions_t acts;
1048*a1e26a70SApple OSS Distributions 
1049*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1050*a1e26a70SApple OSS Distributions 		return EINVAL;
1051*a1e26a70SApple OSS Distributions 	}
1052*a1e26a70SApple OSS Distributions 
1053*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1054*a1e26a70SApple OSS Distributions 	acts = psattr->psa_ports;
1055*a1e26a70SApple OSS Distributions 	if (acts == NULL) {
1056*a1e26a70SApple OSS Distributions 		return EINVAL;
1057*a1e26a70SApple OSS Distributions 	}
1058*a1e26a70SApple OSS Distributions 
1059*a1e26a70SApple OSS Distributions 	free(acts);
1060*a1e26a70SApple OSS Distributions 	return 0;
1061*a1e26a70SApple OSS Distributions }
1062*a1e26a70SApple OSS Distributions 
1063*a1e26a70SApple OSS Distributions /*
1064*a1e26a70SApple OSS Distributions  * posix_spawn_destroycoalition_info_np
1065*a1e26a70SApple OSS Distributions  * Description: clean up coalition_info struct in posix_spawnattr_t attr
1066*a1e26a70SApple OSS Distributions  */
1067*a1e26a70SApple OSS Distributions static int
posix_spawn_destroycoalition_info_np(posix_spawnattr_t * attr)1068*a1e26a70SApple OSS Distributions posix_spawn_destroycoalition_info_np(posix_spawnattr_t *attr)
1069*a1e26a70SApple OSS Distributions {
1070*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1071*a1e26a70SApple OSS Distributions 	struct _posix_spawn_coalition_info *coal_info;
1072*a1e26a70SApple OSS Distributions 
1073*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1074*a1e26a70SApple OSS Distributions 		return EINVAL;
1075*a1e26a70SApple OSS Distributions 	}
1076*a1e26a70SApple OSS Distributions 
1077*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1078*a1e26a70SApple OSS Distributions 	coal_info = psattr->psa_coalition_info;
1079*a1e26a70SApple OSS Distributions 	if (coal_info == NULL) {
1080*a1e26a70SApple OSS Distributions 		return EINVAL;
1081*a1e26a70SApple OSS Distributions 	}
1082*a1e26a70SApple OSS Distributions 
1083*a1e26a70SApple OSS Distributions 	psattr->psa_coalition_info = NULL;
1084*a1e26a70SApple OSS Distributions 	free(coal_info);
1085*a1e26a70SApple OSS Distributions 	return 0;
1086*a1e26a70SApple OSS Distributions }
1087*a1e26a70SApple OSS Distributions 
1088*a1e26a70SApple OSS Distributions /*
1089*a1e26a70SApple OSS Distributions  * posix_spawn_destroypersona_info_np
1090*a1e26a70SApple OSS Distributions  * Description: clean up persona_info struct in posix_spawnattr_t attr
1091*a1e26a70SApple OSS Distributions  */
1092*a1e26a70SApple OSS Distributions static int
posix_spawn_destroypersona_info_np(posix_spawnattr_t * attr)1093*a1e26a70SApple OSS Distributions posix_spawn_destroypersona_info_np(posix_spawnattr_t *attr)
1094*a1e26a70SApple OSS Distributions {
1095*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1096*a1e26a70SApple OSS Distributions 	struct _posix_spawn_persona_info *persona;
1097*a1e26a70SApple OSS Distributions 
1098*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1099*a1e26a70SApple OSS Distributions 		return EINVAL;
1100*a1e26a70SApple OSS Distributions 	}
1101*a1e26a70SApple OSS Distributions 
1102*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1103*a1e26a70SApple OSS Distributions 	persona = psattr->psa_persona_info;
1104*a1e26a70SApple OSS Distributions 	if (persona == NULL) {
1105*a1e26a70SApple OSS Distributions 		return EINVAL;
1106*a1e26a70SApple OSS Distributions 	}
1107*a1e26a70SApple OSS Distributions 
1108*a1e26a70SApple OSS Distributions 	psattr->psa_persona_info = NULL;
1109*a1e26a70SApple OSS Distributions 	free(persona);
1110*a1e26a70SApple OSS Distributions 	return 0;
1111*a1e26a70SApple OSS Distributions }
1112*a1e26a70SApple OSS Distributions 
1113*a1e26a70SApple OSS Distributions /*
1114*a1e26a70SApple OSS Distributions  * posix_spawn_destroyposix_cred_info_np
1115*a1e26a70SApple OSS Distributions  * Description: clean up posix_cred_info struct in posix_spawnattr_t attr
1116*a1e26a70SApple OSS Distributions  */
1117*a1e26a70SApple OSS Distributions static int
posix_spawn_destroyposix_cred_info_np(posix_spawnattr_t * attr)1118*a1e26a70SApple OSS Distributions posix_spawn_destroyposix_cred_info_np(posix_spawnattr_t *attr)
1119*a1e26a70SApple OSS Distributions {
1120*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1121*a1e26a70SApple OSS Distributions 	struct _posix_spawn_posix_cred_info *pspci;
1122*a1e26a70SApple OSS Distributions 
1123*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1124*a1e26a70SApple OSS Distributions 		return EINVAL;
1125*a1e26a70SApple OSS Distributions 	}
1126*a1e26a70SApple OSS Distributions 
1127*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1128*a1e26a70SApple OSS Distributions 	pspci = psattr->psa_posix_cred_info;
1129*a1e26a70SApple OSS Distributions 	if (pspci == NULL) {
1130*a1e26a70SApple OSS Distributions 		return EINVAL;
1131*a1e26a70SApple OSS Distributions 	}
1132*a1e26a70SApple OSS Distributions 
1133*a1e26a70SApple OSS Distributions 	psattr->psa_posix_cred_info = NULL;
1134*a1e26a70SApple OSS Distributions 	free(pspci);
1135*a1e26a70SApple OSS Distributions 	return 0;
1136*a1e26a70SApple OSS Distributions }
1137*a1e26a70SApple OSS Distributions 
1138*a1e26a70SApple OSS Distributions /*
1139*a1e26a70SApple OSS Distributions  * posix_spawn_set_subsystem_root_path
1140*a1e26a70SApple OSS Distributions  * Description: Set path as the subsystem root path for attr; clears if NULL
1141*a1e26a70SApple OSS Distributions  */
1142*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_subsystem_root_path_np(posix_spawnattr_t * attr,char * path)1143*a1e26a70SApple OSS Distributions posix_spawnattr_set_subsystem_root_path_np(posix_spawnattr_t *attr, char *path)
1144*a1e26a70SApple OSS Distributions {
1145*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1146*a1e26a70SApple OSS Distributions 	char * buf = NULL;
1147*a1e26a70SApple OSS Distributions 	char * old_buf;
1148*a1e26a70SApple OSS Distributions 	size_t bytes;
1149*a1e26a70SApple OSS Distributions 
1150*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1151*a1e26a70SApple OSS Distributions 		return EINVAL;
1152*a1e26a70SApple OSS Distributions 	}
1153*a1e26a70SApple OSS Distributions 
1154*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1155*a1e26a70SApple OSS Distributions 
1156*a1e26a70SApple OSS Distributions 	if (path) {
1157*a1e26a70SApple OSS Distributions 		buf = malloc(MAXPATHLEN);
1158*a1e26a70SApple OSS Distributions 
1159*a1e26a70SApple OSS Distributions 		if (buf == NULL) {
1160*a1e26a70SApple OSS Distributions 			return ENOMEM;
1161*a1e26a70SApple OSS Distributions 		}
1162*a1e26a70SApple OSS Distributions 
1163*a1e26a70SApple OSS Distributions 		bytes = strlcpy(buf, path, MAXPATHLEN);
1164*a1e26a70SApple OSS Distributions 
1165*a1e26a70SApple OSS Distributions 		if (bytes >= MAXPATHLEN) {
1166*a1e26a70SApple OSS Distributions 			free(buf);
1167*a1e26a70SApple OSS Distributions 			return ENAMETOOLONG;
1168*a1e26a70SApple OSS Distributions 		}
1169*a1e26a70SApple OSS Distributions 	}
1170*a1e26a70SApple OSS Distributions 
1171*a1e26a70SApple OSS Distributions 	old_buf = psattr->psa_subsystem_root_path;
1172*a1e26a70SApple OSS Distributions 	psattr->psa_subsystem_root_path = buf;
1173*a1e26a70SApple OSS Distributions 
1174*a1e26a70SApple OSS Distributions 	free(old_buf);
1175*a1e26a70SApple OSS Distributions 
1176*a1e26a70SApple OSS Distributions 	return 0;
1177*a1e26a70SApple OSS Distributions }
1178*a1e26a70SApple OSS Distributions 
1179*a1e26a70SApple OSS Distributions /*
1180*a1e26a70SApple OSS Distributions  * posix_spawn_destroy_subsystem_root_path_np
1181*a1e26a70SApple OSS Distributions  * Description: clean up subsystem_root_path string in posix_spawnattr_t attr
1182*a1e26a70SApple OSS Distributions  */
1183*a1e26a70SApple OSS Distributions static int
posix_spawn_destroysubsystem_root_path_np(posix_spawnattr_t * attr)1184*a1e26a70SApple OSS Distributions posix_spawn_destroysubsystem_root_path_np(posix_spawnattr_t *attr)
1185*a1e26a70SApple OSS Distributions {
1186*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1187*a1e26a70SApple OSS Distributions 	char * subsystem_root_path;
1188*a1e26a70SApple OSS Distributions 
1189*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1190*a1e26a70SApple OSS Distributions 		return EINVAL;
1191*a1e26a70SApple OSS Distributions 	}
1192*a1e26a70SApple OSS Distributions 
1193*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1194*a1e26a70SApple OSS Distributions 	subsystem_root_path = psattr->psa_subsystem_root_path;
1195*a1e26a70SApple OSS Distributions 
1196*a1e26a70SApple OSS Distributions 	if (subsystem_root_path == NULL) {
1197*a1e26a70SApple OSS Distributions 		return EINVAL;
1198*a1e26a70SApple OSS Distributions 	}
1199*a1e26a70SApple OSS Distributions 
1200*a1e26a70SApple OSS Distributions 	psattr->psa_subsystem_root_path = NULL;
1201*a1e26a70SApple OSS Distributions 	free(subsystem_root_path);
1202*a1e26a70SApple OSS Distributions 	return 0;
1203*a1e26a70SApple OSS Distributions }
1204*a1e26a70SApple OSS Distributions 
1205*a1e26a70SApple OSS Distributions /*
1206*a1e26a70SApple OSS Distributions  * posix_spawn_destroyconclave_id_np
1207*a1e26a70SApple OSS Distributions  * Description: clean up conclave_id string in posix_spawnattr_t attr
1208*a1e26a70SApple OSS Distributions  */
1209*a1e26a70SApple OSS Distributions static int
posix_spawn_destroyconclave_id_np(posix_spawnattr_t * attr)1210*a1e26a70SApple OSS Distributions posix_spawn_destroyconclave_id_np(posix_spawnattr_t *attr)
1211*a1e26a70SApple OSS Distributions {
1212*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1213*a1e26a70SApple OSS Distributions 	char *conclave_id;
1214*a1e26a70SApple OSS Distributions 
1215*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1216*a1e26a70SApple OSS Distributions 		return EINVAL;
1217*a1e26a70SApple OSS Distributions 	}
1218*a1e26a70SApple OSS Distributions 
1219*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1220*a1e26a70SApple OSS Distributions 	conclave_id = psattr->psa_conclave_id;
1221*a1e26a70SApple OSS Distributions 
1222*a1e26a70SApple OSS Distributions 	if (conclave_id == NULL) {
1223*a1e26a70SApple OSS Distributions 		return EINVAL;
1224*a1e26a70SApple OSS Distributions 	}
1225*a1e26a70SApple OSS Distributions 
1226*a1e26a70SApple OSS Distributions 	psattr->psa_conclave_id = NULL;
1227*a1e26a70SApple OSS Distributions 	free(conclave_id);
1228*a1e26a70SApple OSS Distributions 	return 0;
1229*a1e26a70SApple OSS Distributions }
1230*a1e26a70SApple OSS Distributions 
1231*a1e26a70SApple OSS Distributions /*
1232*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_platform_np
1233*a1e26a70SApple OSS Distributions  * Description: sets the platform in posix_spawnattr_t attr
1234*a1e26a70SApple OSS Distributions  *
1235*a1e26a70SApple OSS Distributions  * To be implemented.
1236*a1e26a70SApple OSS Distributions  */
1237*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_platform_np(posix_spawnattr_t * attr,int platform,uint32_t flags)1238*a1e26a70SApple OSS Distributions posix_spawnattr_set_platform_np(posix_spawnattr_t *attr, int platform, uint32_t flags)
1239*a1e26a70SApple OSS Distributions {
1240*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1241*a1e26a70SApple OSS Distributions 
1242*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1243*a1e26a70SApple OSS Distributions 		return EINVAL;
1244*a1e26a70SApple OSS Distributions 	}
1245*a1e26a70SApple OSS Distributions 
1246*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1247*a1e26a70SApple OSS Distributions 	psattr->psa_platform = platform;
1248*a1e26a70SApple OSS Distributions 
1249*a1e26a70SApple OSS Distributions 	(void)flags;
1250*a1e26a70SApple OSS Distributions 	return 0;
1251*a1e26a70SApple OSS Distributions }
1252*a1e26a70SApple OSS Distributions 
1253*a1e26a70SApple OSS Distributions /*
1254*a1e26a70SApple OSS Distributions  * posix_spawnattr_disable_ptr_auth_a_keys_np
1255*a1e26a70SApple OSS Distributions  * Description: Set flag to disable A keys for Ptr Auth
1256*a1e26a70SApple OSS Distributions  */
1257*a1e26a70SApple OSS Distributions int
posix_spawnattr_disable_ptr_auth_a_keys_np(posix_spawnattr_t * attr,uint32_t flags)1258*a1e26a70SApple OSS Distributions posix_spawnattr_disable_ptr_auth_a_keys_np(posix_spawnattr_t *attr, uint32_t flags)
1259*a1e26a70SApple OSS Distributions {
1260*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1261*a1e26a70SApple OSS Distributions 
1262*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1263*a1e26a70SApple OSS Distributions 		return EINVAL;
1264*a1e26a70SApple OSS Distributions 	}
1265*a1e26a70SApple OSS Distributions 
1266*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1267*a1e26a70SApple OSS Distributions 
1268*a1e26a70SApple OSS Distributions 	psattr->psa_options |= PSA_OPTION_PLUGIN_HOST_DISABLE_A_KEYS;
1269*a1e26a70SApple OSS Distributions 	(void)flags;
1270*a1e26a70SApple OSS Distributions 	return 0;
1271*a1e26a70SApple OSS Distributions }
1272*a1e26a70SApple OSS Distributions 
1273*a1e26a70SApple OSS Distributions /*
1274*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_alt_rosetta_np
1275*a1e26a70SApple OSS Distributions  * Description: Set flag to use alternative Rosetta runtime
1276*a1e26a70SApple OSS Distributions  */
1277*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_alt_rosetta_np(posix_spawnattr_t * attr,uint32_t flags)1278*a1e26a70SApple OSS Distributions posix_spawnattr_set_alt_rosetta_np(posix_spawnattr_t *attr, uint32_t flags)
1279*a1e26a70SApple OSS Distributions {
1280*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1281*a1e26a70SApple OSS Distributions 
1282*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1283*a1e26a70SApple OSS Distributions 		return EINVAL;
1284*a1e26a70SApple OSS Distributions 	}
1285*a1e26a70SApple OSS Distributions 
1286*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1287*a1e26a70SApple OSS Distributions 
1288*a1e26a70SApple OSS Distributions 	psattr->psa_options |= PSA_OPTION_ALT_ROSETTA;
1289*a1e26a70SApple OSS Distributions 	(void)flags;
1290*a1e26a70SApple OSS Distributions 	return 0;
1291*a1e26a70SApple OSS Distributions }
1292*a1e26a70SApple OSS Distributions 
1293*a1e26a70SApple OSS Distributions /*
1294*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_crash_behavior_np
1295*a1e26a70SApple OSS Distributions  * Description: Set flags to control behavior of the process on crash
1296*a1e26a70SApple OSS Distributions  */
1297*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_crash_behavior_np(posix_spawnattr_t * attr,uint32_t flags)1298*a1e26a70SApple OSS Distributions posix_spawnattr_set_crash_behavior_np(posix_spawnattr_t *attr, uint32_t flags)
1299*a1e26a70SApple OSS Distributions {
1300*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1301*a1e26a70SApple OSS Distributions 
1302*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1303*a1e26a70SApple OSS Distributions 		return EINVAL;
1304*a1e26a70SApple OSS Distributions 	}
1305*a1e26a70SApple OSS Distributions 
1306*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1307*a1e26a70SApple OSS Distributions 
1308*a1e26a70SApple OSS Distributions 	psattr->psa_crash_behavior = flags;
1309*a1e26a70SApple OSS Distributions 	return 0;
1310*a1e26a70SApple OSS Distributions }
1311*a1e26a70SApple OSS Distributions 
1312*a1e26a70SApple OSS Distributions /*
1313*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_crash_behavior_deadline_np
1314*a1e26a70SApple OSS Distributions  * Description: Set mach_continuous_time deadline for crash_behavior to panic
1315*a1e26a70SApple OSS Distributions  *   A deadline of 0 indicates no deadline
1316*a1e26a70SApple OSS Distributions  *   A non-zero deadline indicates that the crash behavior mode will be valid
1317*a1e26a70SApple OSS Distributions  *   until the deadline. After the deadline the crash behavior field will
1318*a1e26a70SApple OSS Distributions  *   be ignored.
1319*a1e26a70SApple OSS Distributions  */
1320*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_crash_behavior_deadline_np(posix_spawnattr_t * attr,uint64_t deadline,uint32_t flags)1321*a1e26a70SApple OSS Distributions posix_spawnattr_set_crash_behavior_deadline_np(posix_spawnattr_t *attr, uint64_t deadline, uint32_t flags)
1322*a1e26a70SApple OSS Distributions {
1323*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1324*a1e26a70SApple OSS Distributions 
1325*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1326*a1e26a70SApple OSS Distributions 		return EINVAL;
1327*a1e26a70SApple OSS Distributions 	}
1328*a1e26a70SApple OSS Distributions 
1329*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1330*a1e26a70SApple OSS Distributions 
1331*a1e26a70SApple OSS Distributions 	psattr->psa_crash_behavior_deadline = deadline;
1332*a1e26a70SApple OSS Distributions 	(void)flags;
1333*a1e26a70SApple OSS Distributions 	return 0;
1334*a1e26a70SApple OSS Distributions }
1335*a1e26a70SApple OSS Distributions 
1336*a1e26a70SApple OSS Distributions /*
1337*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_crash_count_np
1338*a1e26a70SApple OSS Distributions  *
1339*a1e26a70SApple OSS Distributions  * Description:	Set the process crash count and throttle timeout for
1340*a1e26a70SApple OSS Distributions  * exponential backoff.
1341*a1e26a70SApple OSS Distributions  *
1342*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object for the
1343*a1e26a70SApple OSS Distributions  *                              new process
1344*a1e26a70SApple OSS Distributions  *		        crash_count	    Consecutive crash count
1345*a1e26a70SApple OSS Distributions  *              timeout         Exponential throttling timeout
1346*a1e26a70SApple OSS Distributions  *
1347*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1348*a1e26a70SApple OSS Distributions  *		EINVAL			Invalid Input
1349*a1e26a70SApple OSS Distributions  */
1350*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_crash_count_np(posix_spawnattr_t * __restrict attr,uint32_t crash_count,uint32_t timeout)1351*a1e26a70SApple OSS Distributions posix_spawnattr_set_crash_count_np(posix_spawnattr_t * __restrict attr,
1352*a1e26a70SApple OSS Distributions     uint32_t crash_count, uint32_t timeout)
1353*a1e26a70SApple OSS Distributions {
1354*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1355*a1e26a70SApple OSS Distributions 
1356*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
1357*a1e26a70SApple OSS Distributions 		return EINVAL;
1358*a1e26a70SApple OSS Distributions 	}
1359*a1e26a70SApple OSS Distributions 
1360*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1361*a1e26a70SApple OSS Distributions 	psattr->psa_crash_count = crash_count;
1362*a1e26a70SApple OSS Distributions 	psattr->psa_throttle_timeout = timeout;
1363*a1e26a70SApple OSS Distributions 
1364*a1e26a70SApple OSS Distributions 	return 0;
1365*a1e26a70SApple OSS Distributions }
1366*a1e26a70SApple OSS Distributions 
1367*a1e26a70SApple OSS Distributions /*
1368*a1e26a70SApple OSS Distributions  * posix_spawn_appendportaction_np
1369*a1e26a70SApple OSS Distributions  * Description: append a port action, grow the array if necessary
1370*a1e26a70SApple OSS Distributions  */
1371*a1e26a70SApple OSS Distributions static int
posix_spawn_appendportaction_np(posix_spawnattr_t * attr,_ps_port_action_t * act)1372*a1e26a70SApple OSS Distributions posix_spawn_appendportaction_np(posix_spawnattr_t *attr, _ps_port_action_t *act)
1373*a1e26a70SApple OSS Distributions {
1374*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
1375*a1e26a70SApple OSS Distributions 	_posix_spawn_port_actions_t acts;
1376*a1e26a70SApple OSS Distributions 
1377*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL || act == NULL) {
1378*a1e26a70SApple OSS Distributions 		return EINVAL;
1379*a1e26a70SApple OSS Distributions 	}
1380*a1e26a70SApple OSS Distributions 
1381*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
1382*a1e26a70SApple OSS Distributions 	acts = psattr->psa_ports;
1383*a1e26a70SApple OSS Distributions 
1384*a1e26a70SApple OSS Distributions 	// Have any port actions been created yet?
1385*a1e26a70SApple OSS Distributions 	if (acts == NULL) {
1386*a1e26a70SApple OSS Distributions 		int err = posix_spawn_createportactions_np(attr);
1387*a1e26a70SApple OSS Distributions 		if (err) {
1388*a1e26a70SApple OSS Distributions 			return err;
1389*a1e26a70SApple OSS Distributions 		}
1390*a1e26a70SApple OSS Distributions 		acts = psattr->psa_ports;
1391*a1e26a70SApple OSS Distributions 	}
1392*a1e26a70SApple OSS Distributions 
1393*a1e26a70SApple OSS Distributions 	// Is there enough room?
1394*a1e26a70SApple OSS Distributions 	if (acts->pspa_alloc == acts->pspa_count) {
1395*a1e26a70SApple OSS Distributions 		int err = posix_spawn_growportactions_np(attr);
1396*a1e26a70SApple OSS Distributions 		if (err) {
1397*a1e26a70SApple OSS Distributions 			return err;
1398*a1e26a70SApple OSS Distributions 		}
1399*a1e26a70SApple OSS Distributions 		acts = psattr->psa_ports;
1400*a1e26a70SApple OSS Distributions 	}
1401*a1e26a70SApple OSS Distributions 
1402*a1e26a70SApple OSS Distributions 	// Add this action to next spot in array
1403*a1e26a70SApple OSS Distributions 	acts->pspa_actions[acts->pspa_count] = *act;
1404*a1e26a70SApple OSS Distributions 	acts->pspa_count++;
1405*a1e26a70SApple OSS Distributions 
1406*a1e26a70SApple OSS Distributions 	return 0;
1407*a1e26a70SApple OSS Distributions }
1408*a1e26a70SApple OSS Distributions 
1409*a1e26a70SApple OSS Distributions /*
1410*a1e26a70SApple OSS Distributions  * posix_spawnattr_setspecialport_np
1411*a1e26a70SApple OSS Distributions  *
1412*a1e26a70SApple OSS Distributions  * Description:	Set a new value for a mach special port in the spawned task.
1413*a1e26a70SApple OSS Distributions  *
1414*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object for the
1415*a1e26a70SApple OSS Distributions  *                                      new process
1416*a1e26a70SApple OSS Distributions  *              new_port		The new value for the special port
1417*a1e26a70SApple OSS Distributions  *              which			The particular port to be set
1418*a1e26a70SApple OSS Distributions  *                                      (see task_set_special_port for details)
1419*a1e26a70SApple OSS Distributions  *
1420*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1421*a1e26a70SApple OSS Distributions  *              ENOMEM			Couldn't allocate memory
1422*a1e26a70SApple OSS Distributions  */
1423*a1e26a70SApple OSS Distributions int
posix_spawnattr_setspecialport_np(posix_spawnattr_t * attr,mach_port_t new_port,int which)1424*a1e26a70SApple OSS Distributions posix_spawnattr_setspecialport_np(
1425*a1e26a70SApple OSS Distributions 	posix_spawnattr_t *attr,
1426*a1e26a70SApple OSS Distributions 	mach_port_t      new_port,
1427*a1e26a70SApple OSS Distributions 	int             which)
1428*a1e26a70SApple OSS Distributions {
1429*a1e26a70SApple OSS Distributions 	_ps_port_action_t action = {
1430*a1e26a70SApple OSS Distributions 		.port_type = PSPA_SPECIAL,
1431*a1e26a70SApple OSS Distributions 		.new_port = new_port,
1432*a1e26a70SApple OSS Distributions 		.which = which,
1433*a1e26a70SApple OSS Distributions 	};
1434*a1e26a70SApple OSS Distributions 	return posix_spawn_appendportaction_np(attr, &action);
1435*a1e26a70SApple OSS Distributions }
1436*a1e26a70SApple OSS Distributions 
1437*a1e26a70SApple OSS Distributions /*
1438*a1e26a70SApple OSS Distributions  * posix_spawnattr_setexceptionports_np
1439*a1e26a70SApple OSS Distributions  *
1440*a1e26a70SApple OSS Distributions  * Description:	Set a new port for a set of exception ports in the spawned task.
1441*a1e26a70SApple OSS Distributions  *
1442*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object for the
1443*a1e26a70SApple OSS Distributions  *                                      new process
1444*a1e26a70SApple OSS Distributions  *              mask			A bitfield indicating which exceptions
1445*a1e26a70SApple OSS Distributions  *                                      to associate the port with
1446*a1e26a70SApple OSS Distributions  *              new_port		The new value for the exception port
1447*a1e26a70SApple OSS Distributions  *              behavior		The default behavior for the port
1448*a1e26a70SApple OSS Distributions  *              flavor			The default flavor for the port
1449*a1e26a70SApple OSS Distributions  *                                      (see task_set_exception_ports)
1450*a1e26a70SApple OSS Distributions  *
1451*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1452*a1e26a70SApple OSS Distributions  */
1453*a1e26a70SApple OSS Distributions int
posix_spawnattr_setexceptionports_np(posix_spawnattr_t * attr,exception_mask_t mask,mach_port_t new_port,exception_behavior_t behavior,thread_state_flavor_t flavor)1454*a1e26a70SApple OSS Distributions posix_spawnattr_setexceptionports_np(
1455*a1e26a70SApple OSS Distributions 	posix_spawnattr_t       *attr,
1456*a1e26a70SApple OSS Distributions 	exception_mask_t        mask,
1457*a1e26a70SApple OSS Distributions 	mach_port_t              new_port,
1458*a1e26a70SApple OSS Distributions 	exception_behavior_t    behavior,
1459*a1e26a70SApple OSS Distributions 	thread_state_flavor_t   flavor)
1460*a1e26a70SApple OSS Distributions {
1461*a1e26a70SApple OSS Distributions 	_ps_port_action_t action = {
1462*a1e26a70SApple OSS Distributions 		.port_type = PSPA_EXCEPTION,
1463*a1e26a70SApple OSS Distributions 		.mask = mask,
1464*a1e26a70SApple OSS Distributions 		.new_port = new_port,
1465*a1e26a70SApple OSS Distributions 		.behavior = behavior,
1466*a1e26a70SApple OSS Distributions 		.flavor = flavor,
1467*a1e26a70SApple OSS Distributions 	};
1468*a1e26a70SApple OSS Distributions 	return posix_spawn_appendportaction_np(attr, &action);
1469*a1e26a70SApple OSS Distributions }
1470*a1e26a70SApple OSS Distributions 
1471*a1e26a70SApple OSS Distributions /*
1472*a1e26a70SApple OSS Distributions  * posix_spawnattr_setauditsessionport_np
1473*a1e26a70SApple OSS Distributions  *
1474*a1e26a70SApple OSS Distributions  * Description:	Set the audit session port rights attribute in the spawned task.
1475*a1e26a70SApple OSS Distributions  *		This is used to securely set the audit session information for
1476*a1e26a70SApple OSS Distributions  *		the new task.
1477*a1e26a70SApple OSS Distributions  *
1478*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn attributes object for the
1479*a1e26a70SApple OSS Distributions  *                                      new process
1480*a1e26a70SApple OSS Distributions  *              au_sessionport		The audit session send port right
1481*a1e26a70SApple OSS Distributions  *
1482*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1483*a1e26a70SApple OSS Distributions  */
1484*a1e26a70SApple OSS Distributions int
posix_spawnattr_setauditsessionport_np(posix_spawnattr_t * attr,mach_port_t au_sessionport)1485*a1e26a70SApple OSS Distributions posix_spawnattr_setauditsessionport_np(
1486*a1e26a70SApple OSS Distributions 	posix_spawnattr_t       *attr,
1487*a1e26a70SApple OSS Distributions 	mach_port_t              au_sessionport)
1488*a1e26a70SApple OSS Distributions {
1489*a1e26a70SApple OSS Distributions 	_ps_port_action_t action = {
1490*a1e26a70SApple OSS Distributions 		.port_type = PSPA_AU_SESSION,
1491*a1e26a70SApple OSS Distributions 		.new_port = au_sessionport,
1492*a1e26a70SApple OSS Distributions 	};
1493*a1e26a70SApple OSS Distributions 	return posix_spawn_appendportaction_np(attr, &action);
1494*a1e26a70SApple OSS Distributions }
1495*a1e26a70SApple OSS Distributions 
1496*a1e26a70SApple OSS Distributions 
1497*a1e26a70SApple OSS Distributions /*
1498*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_init
1499*a1e26a70SApple OSS Distributions  *
1500*a1e26a70SApple OSS Distributions  * Description:	Initialize a spawn file actions object attr with default values
1501*a1e26a70SApple OSS Distributions  *
1502*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		The spawn file actions object to be
1503*a1e26a70SApple OSS Distributions  *					initialized
1504*a1e26a70SApple OSS Distributions  *
1505*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1506*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to
1507*a1e26a70SApple OSS Distributions  *					initialize the spawn file actions
1508*a1e26a70SApple OSS Distributions  *					object.
1509*a1e26a70SApple OSS Distributions  *
1510*a1e26a70SApple OSS Distributions  * Note:	As an implementation detail, the externally visibily type
1511*a1e26a70SApple OSS Distributions  *		posix_spawn_file_actions_t is defined to be a void *, and
1512*a1e26a70SApple OSS Distributions  *		initialization involves allocation of a memory object.
1513*a1e26a70SApple OSS Distributions  *		Subsequent changes to the spawn file actions may result in
1514*a1e26a70SApple OSS Distributions  *		reallocation under the covers.
1515*a1e26a70SApple OSS Distributions  *
1516*a1e26a70SApple OSS Distributions  *		Reinitialization of an already initialized spawn file actions
1517*a1e26a70SApple OSS Distributions  *		object will result in memory being leaked.  Because spawn
1518*a1e26a70SApple OSS Distributions  *		file actions are not required to be used in conjunction with a
1519*a1e26a70SApple OSS Distributions  *		static initializer, there is no way to distinguish a spawn
1520*a1e26a70SApple OSS Distributions  *		file actions with stack garbage from one that's been
1521*a1e26a70SApple OSS Distributions  *		initialized.  This is arguably an API design error.
1522*a1e26a70SApple OSS Distributions  */
1523*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_init(posix_spawn_file_actions_t * file_actions)1524*a1e26a70SApple OSS Distributions posix_spawn_file_actions_init(posix_spawn_file_actions_t *file_actions)
1525*a1e26a70SApple OSS Distributions {
1526*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp = (_posix_spawn_file_actions_t *)file_actions;
1527*a1e26a70SApple OSS Distributions 	int     err = 0;
1528*a1e26a70SApple OSS Distributions 
1529*a1e26a70SApple OSS Distributions 	if ((*psactsp = (_posix_spawn_file_actions_t)malloc(PSF_ACTIONS_SIZE(PSF_ACTIONS_INIT_COUNT))) == NULL) {
1530*a1e26a70SApple OSS Distributions 		err = ENOMEM;
1531*a1e26a70SApple OSS Distributions 	} else {
1532*a1e26a70SApple OSS Distributions 		(*psactsp)->psfa_act_alloc = PSF_ACTIONS_INIT_COUNT;
1533*a1e26a70SApple OSS Distributions 		(*psactsp)->psfa_act_count = 0;
1534*a1e26a70SApple OSS Distributions 	}
1535*a1e26a70SApple OSS Distributions 
1536*a1e26a70SApple OSS Distributions 	return err;
1537*a1e26a70SApple OSS Distributions }
1538*a1e26a70SApple OSS Distributions 
1539*a1e26a70SApple OSS Distributions 
1540*a1e26a70SApple OSS Distributions /*
1541*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_destroy
1542*a1e26a70SApple OSS Distributions  *
1543*a1e26a70SApple OSS Distributions  * Description:	Destroy a spawn file actions object that was previously
1544*a1e26a70SApple OSS Distributions  *		initialized via posix_spawn_file_actions_init() by freeing any
1545*a1e26a70SApple OSS Distributions  *		memory associated with it and setting it to an invalid value.
1546*a1e26a70SApple OSS Distributions  *
1547*a1e26a70SApple OSS Distributions  * Parameters:	attr			The spawn file actions object to be
1548*a1e26a70SApple OSS Distributions  *					destroyed.
1549*a1e26a70SApple OSS Distributions  *
1550*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1551*a1e26a70SApple OSS Distributions  *
1552*a1e26a70SApple OSS Distributions  * Notes:	The destroyed spawn file actions results in the void * pointer
1553*a1e26a70SApple OSS Distributions  *		being set to NULL; subsequent use without reinitialization
1554*a1e26a70SApple OSS Distributions  *		will result in explicit program failure (rather than merely
1555*a1e26a70SApple OSS Distributions  *		"undefined behaviour").
1556*a1e26a70SApple OSS Distributions  *
1557*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
1558*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
1559*a1e26a70SApple OSS Distributions  */
1560*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_destroy(posix_spawn_file_actions_t * file_actions)1561*a1e26a70SApple OSS Distributions posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *file_actions)
1562*a1e26a70SApple OSS Distributions {
1563*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t psacts;
1564*a1e26a70SApple OSS Distributions 
1565*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
1566*a1e26a70SApple OSS Distributions 		return EINVAL;
1567*a1e26a70SApple OSS Distributions 	}
1568*a1e26a70SApple OSS Distributions 
1569*a1e26a70SApple OSS Distributions 	psacts = *(_posix_spawn_file_actions_t *)file_actions;
1570*a1e26a70SApple OSS Distributions 	free(psacts);
1571*a1e26a70SApple OSS Distributions 	*file_actions = NULL;
1572*a1e26a70SApple OSS Distributions 
1573*a1e26a70SApple OSS Distributions 	return 0;
1574*a1e26a70SApple OSS Distributions }
1575*a1e26a70SApple OSS Distributions 
1576*a1e26a70SApple OSS Distributions 
1577*a1e26a70SApple OSS Distributions /*
1578*a1e26a70SApple OSS Distributions  * _posix_spawn_file_actions_grow
1579*a1e26a70SApple OSS Distributions  *
1580*a1e26a70SApple OSS Distributions  * Description:	Grow the available list of file actions associated with the
1581*a1e26a70SApple OSS Distributions  *		pointer to the structure provided; replace the contents of the
1582*a1e26a70SApple OSS Distributions  *		pointer as a side effect.
1583*a1e26a70SApple OSS Distributions  *
1584*a1e26a70SApple OSS Distributions  * Parameters:	psactsp			Pointer to _posix_spawn_file_actions_t
1585*a1e26a70SApple OSS Distributions  *					to grow
1586*a1e26a70SApple OSS Distributions  *
1587*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1588*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory for operation
1589*a1e26a70SApple OSS Distributions  *
1590*a1e26a70SApple OSS Distributions  * Notes:	This code is common to all posix_spawn_file_actions_*()
1591*a1e26a70SApple OSS Distributions  *		functions, since we use a naieve data structure implementation
1592*a1e26a70SApple OSS Distributions  *		at present.  Future optimization will likely change this.
1593*a1e26a70SApple OSS Distributions  */
1594*a1e26a70SApple OSS Distributions static int
_posix_spawn_file_actions_grow(_posix_spawn_file_actions_t * psactsp)1595*a1e26a70SApple OSS Distributions _posix_spawn_file_actions_grow(_posix_spawn_file_actions_t *psactsp)
1596*a1e26a70SApple OSS Distributions {
1597*a1e26a70SApple OSS Distributions 	int newnum = 0;
1598*a1e26a70SApple OSS Distributions 	if (os_mul_overflow((*psactsp)->psfa_act_alloc, 2, &newnum)) {
1599*a1e26a70SApple OSS Distributions 		return ENOMEM;
1600*a1e26a70SApple OSS Distributions 	}
1601*a1e26a70SApple OSS Distributions 
1602*a1e26a70SApple OSS Distributions 	size_t newsize = PSF_ACTIONS_SIZE(newnum);
1603*a1e26a70SApple OSS Distributions 	if (newsize == 0) {
1604*a1e26a70SApple OSS Distributions 		return ENOMEM;
1605*a1e26a70SApple OSS Distributions 	}
1606*a1e26a70SApple OSS Distributions 
1607*a1e26a70SApple OSS Distributions 	/*
1608*a1e26a70SApple OSS Distributions 	 * XXX may want to impose an administrative limit here; POSIX does
1609*a1e26a70SApple OSS Distributions 	 * XXX not provide for an administrative error return in this case,
1610*a1e26a70SApple OSS Distributions 	 * XXX so it's probably acceptable to just fail catastrophically
1611*a1e26a70SApple OSS Distributions 	 * XXX instead of implementing one.
1612*a1e26a70SApple OSS Distributions 	 */
1613*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t new_psacts;
1614*a1e26a70SApple OSS Distributions 	if ((new_psacts = (_posix_spawn_file_actions_t)realloc((*psactsp), newsize)) == NULL) {
1615*a1e26a70SApple OSS Distributions 		return ENOMEM;
1616*a1e26a70SApple OSS Distributions 	}
1617*a1e26a70SApple OSS Distributions 	new_psacts->psfa_act_alloc = newnum;
1618*a1e26a70SApple OSS Distributions 	*psactsp = new_psacts;
1619*a1e26a70SApple OSS Distributions 
1620*a1e26a70SApple OSS Distributions 	return 0;
1621*a1e26a70SApple OSS Distributions }
1622*a1e26a70SApple OSS Distributions 
1623*a1e26a70SApple OSS Distributions 
1624*a1e26a70SApple OSS Distributions /*
1625*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_addopen
1626*a1e26a70SApple OSS Distributions  *
1627*a1e26a70SApple OSS Distributions  * Description:	Add an open action to the object referenced by 'file_actions'
1628*a1e26a70SApple OSS Distributions  *		that will cause the file named by 'path' to be attempted to be
1629*a1e26a70SApple OSS Distributions  *		opened with flags 'oflag' and mode 'mode', and, if successful,
1630*a1e26a70SApple OSS Distributions  *		return as descriptor 'filedes' to the spawned process.
1631*a1e26a70SApple OSS Distributions  *
1632*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		File action object to augment
1633*a1e26a70SApple OSS Distributions  *		filedes			fd that open is to use
1634*a1e26a70SApple OSS Distributions  *		path			path to file to open
1635*a1e26a70SApple OSS Distributions  *		oflag			open file flags
1636*a1e26a70SApple OSS Distributions  *		mode			open file mode
1637*a1e26a70SApple OSS Distributions  *
1638*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1639*a1e26a70SApple OSS Distributions  *		EBADF			The value specified by fildes is
1640*a1e26a70SApple OSS Distributions  *					negative or greater than or equal to
1641*a1e26a70SApple OSS Distributions  *					{OPEN_MAX}.
1642*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to add to
1643*a1e26a70SApple OSS Distributions  *					the spawn file actions object.
1644*a1e26a70SApple OSS Distributions  *
1645*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
1646*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
1647*a1e26a70SApple OSS Distributions  */
1648*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_addopen(posix_spawn_file_actions_t * __restrict file_actions,int filedes,const char * __restrict path,int oflag,mode_t mode)1649*a1e26a70SApple OSS Distributions posix_spawn_file_actions_addopen(
1650*a1e26a70SApple OSS Distributions 	posix_spawn_file_actions_t * __restrict file_actions,
1651*a1e26a70SApple OSS Distributions 	int filedes, const char * __restrict path, int oflag,
1652*a1e26a70SApple OSS Distributions 	mode_t mode)
1653*a1e26a70SApple OSS Distributions {
1654*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp;
1655*a1e26a70SApple OSS Distributions 	_psfa_action_t *psfileact;
1656*a1e26a70SApple OSS Distributions 
1657*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
1658*a1e26a70SApple OSS Distributions 		return EINVAL;
1659*a1e26a70SApple OSS Distributions 	}
1660*a1e26a70SApple OSS Distributions 
1661*a1e26a70SApple OSS Distributions 	psactsp = (_posix_spawn_file_actions_t *)file_actions;
1662*a1e26a70SApple OSS Distributions 	/* Range check; required by POSIX */
1663*a1e26a70SApple OSS Distributions 	if (filedes < 0 || filedes >= OPEN_MAX) {
1664*a1e26a70SApple OSS Distributions 		return EBADF;
1665*a1e26a70SApple OSS Distributions 	}
1666*a1e26a70SApple OSS Distributions 
1667*a1e26a70SApple OSS Distributions 	/* If we do not have enough slots, grow the structure */
1668*a1e26a70SApple OSS Distributions 	if ((*psactsp)->psfa_act_count == (*psactsp)->psfa_act_alloc) {
1669*a1e26a70SApple OSS Distributions 		/* need to grow file actions structure */
1670*a1e26a70SApple OSS Distributions 		if (_posix_spawn_file_actions_grow(psactsp)) {
1671*a1e26a70SApple OSS Distributions 			return ENOMEM;
1672*a1e26a70SApple OSS Distributions 		}
1673*a1e26a70SApple OSS Distributions 	}
1674*a1e26a70SApple OSS Distributions 
1675*a1e26a70SApple OSS Distributions 	/*
1676*a1e26a70SApple OSS Distributions 	 * Allocate next available slot and fill it out
1677*a1e26a70SApple OSS Distributions 	 */
1678*a1e26a70SApple OSS Distributions 	psfileact = &(*psactsp)->psfa_act_acts[(*psactsp)->psfa_act_count++];
1679*a1e26a70SApple OSS Distributions 
1680*a1e26a70SApple OSS Distributions 	psfileact->psfaa_type = PSFA_OPEN;
1681*a1e26a70SApple OSS Distributions 	psfileact->psfaa_filedes = filedes;
1682*a1e26a70SApple OSS Distributions 	psfileact->psfaa_openargs.psfao_oflag = oflag;
1683*a1e26a70SApple OSS Distributions 	psfileact->psfaa_openargs.psfao_mode = mode;
1684*a1e26a70SApple OSS Distributions 	strlcpy(psfileact->psfaa_openargs.psfao_path, path, PATH_MAX);
1685*a1e26a70SApple OSS Distributions 
1686*a1e26a70SApple OSS Distributions 	return 0;
1687*a1e26a70SApple OSS Distributions }
1688*a1e26a70SApple OSS Distributions 
1689*a1e26a70SApple OSS Distributions 
1690*a1e26a70SApple OSS Distributions /*
1691*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_addclose
1692*a1e26a70SApple OSS Distributions  *
1693*a1e26a70SApple OSS Distributions  * Description:	Add a close action to the object referenced by 'file_actions'
1694*a1e26a70SApple OSS Distributions  *		that will cause the file referenced by 'filedes' to be
1695*a1e26a70SApple OSS Distributions  *		attempted to be closed in the spawned process.
1696*a1e26a70SApple OSS Distributions  *
1697*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		File action object to augment
1698*a1e26a70SApple OSS Distributions  *		filedes			fd to close
1699*a1e26a70SApple OSS Distributions  *
1700*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1701*a1e26a70SApple OSS Distributions  *		EBADF			The value specified by fildes is
1702*a1e26a70SApple OSS Distributions  *					negative or greater than or equal to
1703*a1e26a70SApple OSS Distributions  *					{OPEN_MAX}.
1704*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to add to
1705*a1e26a70SApple OSS Distributions  *					the spawn file actions object.
1706*a1e26a70SApple OSS Distributions  *
1707*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
1708*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
1709*a1e26a70SApple OSS Distributions  */
1710*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_addclose(posix_spawn_file_actions_t * file_actions,int filedes)1711*a1e26a70SApple OSS Distributions posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *file_actions,
1712*a1e26a70SApple OSS Distributions     int filedes)
1713*a1e26a70SApple OSS Distributions {
1714*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp;
1715*a1e26a70SApple OSS Distributions 	_psfa_action_t *psfileact;
1716*a1e26a70SApple OSS Distributions 
1717*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
1718*a1e26a70SApple OSS Distributions 		return EINVAL;
1719*a1e26a70SApple OSS Distributions 	}
1720*a1e26a70SApple OSS Distributions 
1721*a1e26a70SApple OSS Distributions 	psactsp = (_posix_spawn_file_actions_t *)file_actions;
1722*a1e26a70SApple OSS Distributions 	/* Range check; required by POSIX */
1723*a1e26a70SApple OSS Distributions 	if (filedes < 0 || filedes >= OPEN_MAX) {
1724*a1e26a70SApple OSS Distributions 		return EBADF;
1725*a1e26a70SApple OSS Distributions 	}
1726*a1e26a70SApple OSS Distributions 
1727*a1e26a70SApple OSS Distributions 	/* If we do not have enough slots, grow the structure */
1728*a1e26a70SApple OSS Distributions 	if ((*psactsp)->psfa_act_count == (*psactsp)->psfa_act_alloc) {
1729*a1e26a70SApple OSS Distributions 		/* need to grow file actions structure */
1730*a1e26a70SApple OSS Distributions 		if (_posix_spawn_file_actions_grow(psactsp)) {
1731*a1e26a70SApple OSS Distributions 			return ENOMEM;
1732*a1e26a70SApple OSS Distributions 		}
1733*a1e26a70SApple OSS Distributions 	}
1734*a1e26a70SApple OSS Distributions 
1735*a1e26a70SApple OSS Distributions 	/*
1736*a1e26a70SApple OSS Distributions 	 * Allocate next available slot and fill it out
1737*a1e26a70SApple OSS Distributions 	 */
1738*a1e26a70SApple OSS Distributions 	psfileact = &(*psactsp)->psfa_act_acts[(*psactsp)->psfa_act_count++];
1739*a1e26a70SApple OSS Distributions 
1740*a1e26a70SApple OSS Distributions 	psfileact->psfaa_type = PSFA_CLOSE;
1741*a1e26a70SApple OSS Distributions 	psfileact->psfaa_filedes = filedes;
1742*a1e26a70SApple OSS Distributions 
1743*a1e26a70SApple OSS Distributions 	return 0;
1744*a1e26a70SApple OSS Distributions }
1745*a1e26a70SApple OSS Distributions 
1746*a1e26a70SApple OSS Distributions 
1747*a1e26a70SApple OSS Distributions /*
1748*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_adddup2
1749*a1e26a70SApple OSS Distributions  *
1750*a1e26a70SApple OSS Distributions  * Description:	Add a dup2 action to the object referenced by 'file_actions'
1751*a1e26a70SApple OSS Distributions  *		that will cause the file referenced by 'filedes' to be
1752*a1e26a70SApple OSS Distributions  *		attempted to be dup2'ed to the descriptor 'newfiledes' in the
1753*a1e26a70SApple OSS Distributions  *		spawned process.
1754*a1e26a70SApple OSS Distributions  *
1755*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		File action object to augment
1756*a1e26a70SApple OSS Distributions  *		filedes			fd to dup2
1757*a1e26a70SApple OSS Distributions  *		newfiledes		fd to dup2 it to
1758*a1e26a70SApple OSS Distributions  *
1759*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1760*a1e26a70SApple OSS Distributions  *		EBADF			The value specified by either fildes
1761*a1e26a70SApple OSS Distributions  *					or by newfiledes is negative or greater
1762*a1e26a70SApple OSS Distributions  *					than or equal to {OPEN_MAX}.
1763*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to add to
1764*a1e26a70SApple OSS Distributions  *					the spawn file actions object.
1765*a1e26a70SApple OSS Distributions  *
1766*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
1767*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
1768*a1e26a70SApple OSS Distributions  */
1769*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t * file_actions,int filedes,int newfiledes)1770*a1e26a70SApple OSS Distributions posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *file_actions,
1771*a1e26a70SApple OSS Distributions     int filedes, int newfiledes)
1772*a1e26a70SApple OSS Distributions {
1773*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp;
1774*a1e26a70SApple OSS Distributions 	_psfa_action_t *psfileact;
1775*a1e26a70SApple OSS Distributions 
1776*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
1777*a1e26a70SApple OSS Distributions 		return EINVAL;
1778*a1e26a70SApple OSS Distributions 	}
1779*a1e26a70SApple OSS Distributions 
1780*a1e26a70SApple OSS Distributions 	psactsp = (_posix_spawn_file_actions_t *)file_actions;
1781*a1e26a70SApple OSS Distributions 	/* Range check; required by POSIX */
1782*a1e26a70SApple OSS Distributions 	if (filedes < 0 || filedes >= OPEN_MAX ||
1783*a1e26a70SApple OSS Distributions 	    newfiledes < 0 || newfiledes >= OPEN_MAX) {
1784*a1e26a70SApple OSS Distributions 		return EBADF;
1785*a1e26a70SApple OSS Distributions 	}
1786*a1e26a70SApple OSS Distributions 
1787*a1e26a70SApple OSS Distributions 	/* If we do not have enough slots, grow the structure */
1788*a1e26a70SApple OSS Distributions 	if ((*psactsp)->psfa_act_count == (*psactsp)->psfa_act_alloc) {
1789*a1e26a70SApple OSS Distributions 		/* need to grow file actions structure */
1790*a1e26a70SApple OSS Distributions 		if (_posix_spawn_file_actions_grow(psactsp)) {
1791*a1e26a70SApple OSS Distributions 			return ENOMEM;
1792*a1e26a70SApple OSS Distributions 		}
1793*a1e26a70SApple OSS Distributions 	}
1794*a1e26a70SApple OSS Distributions 
1795*a1e26a70SApple OSS Distributions 	/*
1796*a1e26a70SApple OSS Distributions 	 * Allocate next available slot and fill it out
1797*a1e26a70SApple OSS Distributions 	 */
1798*a1e26a70SApple OSS Distributions 	psfileact = &(*psactsp)->psfa_act_acts[(*psactsp)->psfa_act_count++];
1799*a1e26a70SApple OSS Distributions 
1800*a1e26a70SApple OSS Distributions 	psfileact->psfaa_type = PSFA_DUP2;
1801*a1e26a70SApple OSS Distributions 	psfileact->psfaa_filedes = filedes;
1802*a1e26a70SApple OSS Distributions 	psfileact->psfaa_dup2args.psfad_newfiledes = newfiledes;
1803*a1e26a70SApple OSS Distributions 
1804*a1e26a70SApple OSS Distributions 	return 0;
1805*a1e26a70SApple OSS Distributions }
1806*a1e26a70SApple OSS Distributions 
1807*a1e26a70SApple OSS Distributions /*
1808*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_add_fileportdup2_np
1809*a1e26a70SApple OSS Distributions  *
1810*a1e26a70SApple OSS Distributions  * Description:	Add a dup2 action to the object referenced by 'file_actions'
1811*a1e26a70SApple OSS Distributions  *		that will cause the file referenced by 'fileport' to be
1812*a1e26a70SApple OSS Distributions  *		attempted to be dup2'ed to the descriptor 'newfiledes' in the
1813*a1e26a70SApple OSS Distributions  *		spawned process.
1814*a1e26a70SApple OSS Distributions  *
1815*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		File action object to augment
1816*a1e26a70SApple OSS Distributions  *		filedes			fileport to dup2
1817*a1e26a70SApple OSS Distributions  *		newfiledes		fd to dup2 it to
1818*a1e26a70SApple OSS Distributions  *
1819*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1820*a1e26a70SApple OSS Distributions  *		EBADF			fileport isn't a valid port, or the
1821*a1e26a70SApple OSS Distributions  *					value specified by newfiledes is
1822*a1e26a70SApple OSS Distributions  *					negative or greater than or equal to
1823*a1e26a70SApple OSS Distributions  *					{OPEN_MAX}.
1824*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to add to
1825*a1e26a70SApple OSS Distributions  *					the spawn file actions object.
1826*a1e26a70SApple OSS Distributions  *
1827*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
1828*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
1829*a1e26a70SApple OSS Distributions  */
1830*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_add_fileportdup2_np(posix_spawn_file_actions_t * file_actions,mach_port_t fileport,int newfiledes)1831*a1e26a70SApple OSS Distributions posix_spawn_file_actions_add_fileportdup2_np(
1832*a1e26a70SApple OSS Distributions 	posix_spawn_file_actions_t *file_actions,
1833*a1e26a70SApple OSS Distributions 	mach_port_t fileport, int newfiledes)
1834*a1e26a70SApple OSS Distributions {
1835*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp;
1836*a1e26a70SApple OSS Distributions 	_psfa_action_t *psfileact;
1837*a1e26a70SApple OSS Distributions 
1838*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
1839*a1e26a70SApple OSS Distributions 		return EINVAL;
1840*a1e26a70SApple OSS Distributions 	}
1841*a1e26a70SApple OSS Distributions 
1842*a1e26a70SApple OSS Distributions 	psactsp = (_posix_spawn_file_actions_t *)file_actions;
1843*a1e26a70SApple OSS Distributions 	/* Range check; required by POSIX */
1844*a1e26a70SApple OSS Distributions 	if (!MACH_PORT_VALID(fileport) ||
1845*a1e26a70SApple OSS Distributions 	    newfiledes < 0 || newfiledes >= OPEN_MAX) {
1846*a1e26a70SApple OSS Distributions 		return EBADF;
1847*a1e26a70SApple OSS Distributions 	}
1848*a1e26a70SApple OSS Distributions 
1849*a1e26a70SApple OSS Distributions 	/* If we do not have enough slots, grow the structure */
1850*a1e26a70SApple OSS Distributions 	if ((*psactsp)->psfa_act_count == (*psactsp)->psfa_act_alloc) {
1851*a1e26a70SApple OSS Distributions 		/* need to grow file actions structure */
1852*a1e26a70SApple OSS Distributions 		if (_posix_spawn_file_actions_grow(psactsp)) {
1853*a1e26a70SApple OSS Distributions 			return ENOMEM;
1854*a1e26a70SApple OSS Distributions 		}
1855*a1e26a70SApple OSS Distributions 	}
1856*a1e26a70SApple OSS Distributions 
1857*a1e26a70SApple OSS Distributions 	/*
1858*a1e26a70SApple OSS Distributions 	 * Allocate next available slot and fill it out
1859*a1e26a70SApple OSS Distributions 	 */
1860*a1e26a70SApple OSS Distributions 	psfileact = &(*psactsp)->psfa_act_acts[(*psactsp)->psfa_act_count++];
1861*a1e26a70SApple OSS Distributions 
1862*a1e26a70SApple OSS Distributions 	psfileact->psfaa_type = PSFA_FILEPORT_DUP2;
1863*a1e26a70SApple OSS Distributions 	psfileact->psfaa_fileport = fileport;
1864*a1e26a70SApple OSS Distributions 	psfileact->psfaa_dup2args.psfad_newfiledes = newfiledes;
1865*a1e26a70SApple OSS Distributions 
1866*a1e26a70SApple OSS Distributions 	return 0;
1867*a1e26a70SApple OSS Distributions }
1868*a1e26a70SApple OSS Distributions 
1869*a1e26a70SApple OSS Distributions /*
1870*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_addinherit_np
1871*a1e26a70SApple OSS Distributions  *
1872*a1e26a70SApple OSS Distributions  * Description:	Add the "inherit" action to the object referenced by
1873*a1e26a70SApple OSS Distributions  *		'file_actions' that will cause the file referenced by
1874*a1e26a70SApple OSS Distributions  *		'filedes' to continue to be available in the spawned
1875*a1e26a70SApple OSS Distributions  *		process via the same descriptor.
1876*a1e26a70SApple OSS Distributions  *
1877*a1e26a70SApple OSS Distributions  *		Inheritance is the normal default behaviour for
1878*a1e26a70SApple OSS Distributions  *		file descriptors across exec and spawn; but if the
1879*a1e26a70SApple OSS Distributions  *		POSIX_SPAWN_CLOEXEC_DEFAULT flag is set, the usual
1880*a1e26a70SApple OSS Distributions  *		default is reversed for the purposes of the spawn
1881*a1e26a70SApple OSS Distributions  *		invocation.  Any pre-existing descriptors that
1882*a1e26a70SApple OSS Distributions  *		need to be made available to the spawned process can
1883*a1e26a70SApple OSS Distributions  *		be marked explicitly as 'inherit' via this interface.
1884*a1e26a70SApple OSS Distributions  *		Otherwise they will be automatically closed.
1885*a1e26a70SApple OSS Distributions  *
1886*a1e26a70SApple OSS Distributions  *		Note that any descriptors created via the other file
1887*a1e26a70SApple OSS Distributions  *		actions interfaces are automatically marked as 'inherit'.
1888*a1e26a70SApple OSS Distributions  *
1889*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		File action object to augment
1890*a1e26a70SApple OSS Distributions  *		filedes			fd to inherit.
1891*a1e26a70SApple OSS Distributions  *
1892*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1893*a1e26a70SApple OSS Distributions  *		EBADF			The value specified by fildes is
1894*a1e26a70SApple OSS Distributions  *					negative or greater than or equal to
1895*a1e26a70SApple OSS Distributions  *					{OPEN_MAX}.
1896*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to add to
1897*a1e26a70SApple OSS Distributions  *					the spawn file actions object.
1898*a1e26a70SApple OSS Distributions  *
1899*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
1900*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
1901*a1e26a70SApple OSS Distributions  */
1902*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_addinherit_np(posix_spawn_file_actions_t * file_actions,int filedes)1903*a1e26a70SApple OSS Distributions posix_spawn_file_actions_addinherit_np(posix_spawn_file_actions_t *file_actions,
1904*a1e26a70SApple OSS Distributions     int filedes)
1905*a1e26a70SApple OSS Distributions {
1906*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp;
1907*a1e26a70SApple OSS Distributions 	_psfa_action_t *psfileact;
1908*a1e26a70SApple OSS Distributions 
1909*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
1910*a1e26a70SApple OSS Distributions 		return EINVAL;
1911*a1e26a70SApple OSS Distributions 	}
1912*a1e26a70SApple OSS Distributions 
1913*a1e26a70SApple OSS Distributions 	psactsp = (_posix_spawn_file_actions_t *)file_actions;
1914*a1e26a70SApple OSS Distributions 	/* Range check; required by POSIX */
1915*a1e26a70SApple OSS Distributions 	if (filedes < 0 || filedes >= OPEN_MAX) {
1916*a1e26a70SApple OSS Distributions 		return EBADF;
1917*a1e26a70SApple OSS Distributions 	}
1918*a1e26a70SApple OSS Distributions 
1919*a1e26a70SApple OSS Distributions #if defined(POSIX_SPAWN_CLOEXEC_DEFAULT)        // TODO: delete this check
1920*a1e26a70SApple OSS Distributions 	/* If we do not have enough slots, grow the structure */
1921*a1e26a70SApple OSS Distributions 	if ((*psactsp)->psfa_act_count == (*psactsp)->psfa_act_alloc) {
1922*a1e26a70SApple OSS Distributions 		/* need to grow file actions structure */
1923*a1e26a70SApple OSS Distributions 		if (_posix_spawn_file_actions_grow(psactsp)) {
1924*a1e26a70SApple OSS Distributions 			return ENOMEM;
1925*a1e26a70SApple OSS Distributions 		}
1926*a1e26a70SApple OSS Distributions 	}
1927*a1e26a70SApple OSS Distributions 
1928*a1e26a70SApple OSS Distributions 	/*
1929*a1e26a70SApple OSS Distributions 	 * Allocate next available slot and fill it out
1930*a1e26a70SApple OSS Distributions 	 */
1931*a1e26a70SApple OSS Distributions 	psfileact = &(*psactsp)->psfa_act_acts[(*psactsp)->psfa_act_count++];
1932*a1e26a70SApple OSS Distributions 
1933*a1e26a70SApple OSS Distributions 	psfileact->psfaa_type = PSFA_INHERIT;
1934*a1e26a70SApple OSS Distributions 	psfileact->psfaa_filedes = filedes;
1935*a1e26a70SApple OSS Distributions #endif
1936*a1e26a70SApple OSS Distributions 	return 0;
1937*a1e26a70SApple OSS Distributions }
1938*a1e26a70SApple OSS Distributions 
1939*a1e26a70SApple OSS Distributions 
1940*a1e26a70SApple OSS Distributions /*
1941*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_addchdir_np
1942*a1e26a70SApple OSS Distributions  *
1943*a1e26a70SApple OSS Distributions  * Description:	Add a chdir action to the object referenced by 'file_actions'
1944*a1e26a70SApple OSS Distributions  *		that will cause the current working directory to attempt to be changed
1945*a1e26a70SApple OSS Distributions  *      to that referenced by 'path' in the spawned process.
1946*a1e26a70SApple OSS Distributions  *
1947*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		File action object to augment
1948*a1e26a70SApple OSS Distributions  *		path			path of the desired working directory
1949*a1e26a70SApple OSS Distributions  *
1950*a1e26a70SApple OSS Distributions  * Returns:	0			Success
1951*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to add to
1952*a1e26a70SApple OSS Distributions  *					the spawn file actions object.
1953*a1e26a70SApple OSS Distributions  *		ENAMETOOLONG	The supplied path exceeded PATH_MAX.
1954*a1e26a70SApple OSS Distributions  *
1955*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
1956*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
1957*a1e26a70SApple OSS Distributions  */
1958*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t * __restrict file_actions,const char * __restrict path)1959*a1e26a70SApple OSS Distributions posix_spawn_file_actions_addchdir_np(
1960*a1e26a70SApple OSS Distributions 	posix_spawn_file_actions_t * __restrict file_actions,
1961*a1e26a70SApple OSS Distributions 	const char * __restrict path)
1962*a1e26a70SApple OSS Distributions {
1963*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp;
1964*a1e26a70SApple OSS Distributions 	_psfa_action_t *psfileact;
1965*a1e26a70SApple OSS Distributions 
1966*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
1967*a1e26a70SApple OSS Distributions 		return EINVAL;
1968*a1e26a70SApple OSS Distributions 	}
1969*a1e26a70SApple OSS Distributions 
1970*a1e26a70SApple OSS Distributions 	psactsp = (_posix_spawn_file_actions_t *)file_actions;
1971*a1e26a70SApple OSS Distributions 
1972*a1e26a70SApple OSS Distributions 	/* If we do not have enough slots, grow the structure */
1973*a1e26a70SApple OSS Distributions 	if ((*psactsp)->psfa_act_count == (*psactsp)->psfa_act_alloc) {
1974*a1e26a70SApple OSS Distributions 		/* need to grow file actions structure */
1975*a1e26a70SApple OSS Distributions 		if (_posix_spawn_file_actions_grow(psactsp)) {
1976*a1e26a70SApple OSS Distributions 			return ENOMEM;
1977*a1e26a70SApple OSS Distributions 		}
1978*a1e26a70SApple OSS Distributions 	}
1979*a1e26a70SApple OSS Distributions 
1980*a1e26a70SApple OSS Distributions 	/*
1981*a1e26a70SApple OSS Distributions 	 * Allocate next available slot and fill it out
1982*a1e26a70SApple OSS Distributions 	 */
1983*a1e26a70SApple OSS Distributions 	psfileact = &(*psactsp)->psfa_act_acts[(*psactsp)->psfa_act_count++];
1984*a1e26a70SApple OSS Distributions 
1985*a1e26a70SApple OSS Distributions 	psfileact->psfaa_type = PSFA_CHDIR;
1986*a1e26a70SApple OSS Distributions 	if (strlcpy(psfileact->psfaa_chdirargs.psfac_path, path, PATH_MAX) >= PATH_MAX) {
1987*a1e26a70SApple OSS Distributions 		(*psactsp)->psfa_act_count--;
1988*a1e26a70SApple OSS Distributions 		return ENAMETOOLONG;
1989*a1e26a70SApple OSS Distributions 	}
1990*a1e26a70SApple OSS Distributions 
1991*a1e26a70SApple OSS Distributions 	return 0;
1992*a1e26a70SApple OSS Distributions }
1993*a1e26a70SApple OSS Distributions 
1994*a1e26a70SApple OSS Distributions 
1995*a1e26a70SApple OSS Distributions /*
1996*a1e26a70SApple OSS Distributions  * posix_spawn_file_actions_fchdir_np
1997*a1e26a70SApple OSS Distributions  *
1998*a1e26a70SApple OSS Distributions  * Description:	Add a fchdir action to the object referenced by 'file_actions'
1999*a1e26a70SApple OSS Distributions  *		that will cause the current working directory to attempt to be changed
2000*a1e26a70SApple OSS Distributions  *      to that referenced by the descriptor 'filedes' in the spawned process.
2001*a1e26a70SApple OSS Distributions  *
2002*a1e26a70SApple OSS Distributions  * Parameters:	file_actions		File action object to augment
2003*a1e26a70SApple OSS Distributions  *		filedes			fd to chdir to
2004*a1e26a70SApple OSS Distributions  *
2005*a1e26a70SApple OSS Distributions  * Returns:	0			Success
2006*a1e26a70SApple OSS Distributions  *		EBADF			The value specified by either fildes is negative or
2007*a1e26a70SApple OSS Distributions  *                              greater than or equal to {OPEN_MAX}.
2008*a1e26a70SApple OSS Distributions  *		ENOMEM			Insufficient memory exists to add to
2009*a1e26a70SApple OSS Distributions  *					the spawn file actions object.
2010*a1e26a70SApple OSS Distributions  *
2011*a1e26a70SApple OSS Distributions  * NOTIMP:	Allowed failures (checking NOT required):
2012*a1e26a70SApple OSS Distributions  *		EINVAL	The value specified by file_actions is invalid.
2013*a1e26a70SApple OSS Distributions  */
2014*a1e26a70SApple OSS Distributions int
posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t * file_actions,int filedes)2015*a1e26a70SApple OSS Distributions posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *file_actions,
2016*a1e26a70SApple OSS Distributions     int filedes)
2017*a1e26a70SApple OSS Distributions {
2018*a1e26a70SApple OSS Distributions 	_posix_spawn_file_actions_t *psactsp;
2019*a1e26a70SApple OSS Distributions 	_psfa_action_t *psfileact;
2020*a1e26a70SApple OSS Distributions 
2021*a1e26a70SApple OSS Distributions 	if (file_actions == NULL || *file_actions == NULL) {
2022*a1e26a70SApple OSS Distributions 		return EINVAL;
2023*a1e26a70SApple OSS Distributions 	}
2024*a1e26a70SApple OSS Distributions 
2025*a1e26a70SApple OSS Distributions 	psactsp = (_posix_spawn_file_actions_t *)file_actions;
2026*a1e26a70SApple OSS Distributions 	/* Range check; in spirit of POSIX */
2027*a1e26a70SApple OSS Distributions 	if (filedes < 0 || filedes >= OPEN_MAX) {
2028*a1e26a70SApple OSS Distributions 		return EBADF;
2029*a1e26a70SApple OSS Distributions 	}
2030*a1e26a70SApple OSS Distributions 
2031*a1e26a70SApple OSS Distributions 	/* If we do not have enough slots, grow the structure */
2032*a1e26a70SApple OSS Distributions 	if ((*psactsp)->psfa_act_count == (*psactsp)->psfa_act_alloc) {
2033*a1e26a70SApple OSS Distributions 		/* need to grow file actions structure */
2034*a1e26a70SApple OSS Distributions 		if (_posix_spawn_file_actions_grow(psactsp)) {
2035*a1e26a70SApple OSS Distributions 			return ENOMEM;
2036*a1e26a70SApple OSS Distributions 		}
2037*a1e26a70SApple OSS Distributions 	}
2038*a1e26a70SApple OSS Distributions 
2039*a1e26a70SApple OSS Distributions 	/*
2040*a1e26a70SApple OSS Distributions 	 * Allocate next available slot and fill it out
2041*a1e26a70SApple OSS Distributions 	 */
2042*a1e26a70SApple OSS Distributions 	psfileact = &(*psactsp)->psfa_act_acts[(*psactsp)->psfa_act_count++];
2043*a1e26a70SApple OSS Distributions 
2044*a1e26a70SApple OSS Distributions 	psfileact->psfaa_type = PSFA_FCHDIR;
2045*a1e26a70SApple OSS Distributions 	psfileact->psfaa_filedes = filedes;
2046*a1e26a70SApple OSS Distributions 
2047*a1e26a70SApple OSS Distributions 	return 0;
2048*a1e26a70SApple OSS Distributions }
2049*a1e26a70SApple OSS Distributions 
2050*a1e26a70SApple OSS Distributions int
posix_spawnattr_setcpumonitor_default(posix_spawnattr_t * __restrict attr)2051*a1e26a70SApple OSS Distributions posix_spawnattr_setcpumonitor_default(posix_spawnattr_t * __restrict attr)
2052*a1e26a70SApple OSS Distributions {
2053*a1e26a70SApple OSS Distributions 	return posix_spawnattr_setcpumonitor(attr, PROC_POLICY_CPUMON_DEFAULTS, 0);
2054*a1e26a70SApple OSS Distributions }
2055*a1e26a70SApple OSS Distributions 
2056*a1e26a70SApple OSS Distributions int
posix_spawnattr_setcpumonitor(posix_spawnattr_t * __restrict attr,uint64_t percent,uint64_t interval)2057*a1e26a70SApple OSS Distributions posix_spawnattr_setcpumonitor(posix_spawnattr_t * __restrict attr,
2058*a1e26a70SApple OSS Distributions     uint64_t percent, uint64_t interval)
2059*a1e26a70SApple OSS Distributions {
2060*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2061*a1e26a70SApple OSS Distributions 
2062*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2063*a1e26a70SApple OSS Distributions 		return EINVAL;
2064*a1e26a70SApple OSS Distributions 	}
2065*a1e26a70SApple OSS Distributions 
2066*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2067*a1e26a70SApple OSS Distributions 
2068*a1e26a70SApple OSS Distributions 	psattr->psa_cpumonitor_percent = percent;
2069*a1e26a70SApple OSS Distributions 	psattr->psa_cpumonitor_interval = interval;
2070*a1e26a70SApple OSS Distributions 
2071*a1e26a70SApple OSS Distributions 	return 0;
2072*a1e26a70SApple OSS Distributions }
2073*a1e26a70SApple OSS Distributions 
2074*a1e26a70SApple OSS Distributions int
posix_spawnattr_getcpumonitor(posix_spawnattr_t * __restrict attr,uint64_t * percent,uint64_t * interval)2075*a1e26a70SApple OSS Distributions posix_spawnattr_getcpumonitor(posix_spawnattr_t * __restrict attr,
2076*a1e26a70SApple OSS Distributions     uint64_t *percent, uint64_t *interval)
2077*a1e26a70SApple OSS Distributions {
2078*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2079*a1e26a70SApple OSS Distributions 
2080*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2081*a1e26a70SApple OSS Distributions 		return EINVAL;
2082*a1e26a70SApple OSS Distributions 	}
2083*a1e26a70SApple OSS Distributions 
2084*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2085*a1e26a70SApple OSS Distributions 
2086*a1e26a70SApple OSS Distributions 	*percent = psattr->psa_cpumonitor_percent;
2087*a1e26a70SApple OSS Distributions 	*interval = psattr->psa_cpumonitor_interval;
2088*a1e26a70SApple OSS Distributions 
2089*a1e26a70SApple OSS Distributions 	return 0;
2090*a1e26a70SApple OSS Distributions }
2091*a1e26a70SApple OSS Distributions 
2092*a1e26a70SApple OSS Distributions #if (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
2093*a1e26a70SApple OSS Distributions /*
2094*a1e26a70SApple OSS Distributions  * posix_spawnattr_setjetsam
2095*a1e26a70SApple OSS Distributions  *
2096*a1e26a70SApple OSS Distributions  * Description:	Set jetsam attributes for the spawn attribute object
2097*a1e26a70SApple OSS Distributions  *		referred to by 'attr'.
2098*a1e26a70SApple OSS Distributions  *
2099*a1e26a70SApple OSS Distributions  * Parameters:	flags			The flags value to set
2100*a1e26a70SApple OSS Distributions  *		priority		Relative jetsam priority
2101*a1e26a70SApple OSS Distributions  *		memlimit		Value in megabytes; a memory footprint
2102*a1e26a70SApple OSS Distributions  *					above this level may result in termination.
2103*a1e26a70SApple OSS Distributions  *					Implies both active and inactive limits.
2104*a1e26a70SApple OSS Distributions  *
2105*a1e26a70SApple OSS Distributions  * Returns:	0			Success
2106*a1e26a70SApple OSS Distributions  *
2107*a1e26a70SApple OSS Distributions  * Note: to be deprecated (not available on desktop)
2108*a1e26a70SApple OSS Distributions  *
2109*a1e26a70SApple OSS Distributions  */
2110*a1e26a70SApple OSS Distributions int
posix_spawnattr_setjetsam(posix_spawnattr_t * __restrict attr,short flags,int priority,int memlimit)2111*a1e26a70SApple OSS Distributions posix_spawnattr_setjetsam(posix_spawnattr_t * __restrict attr,
2112*a1e26a70SApple OSS Distributions     short flags, int priority, int memlimit)
2113*a1e26a70SApple OSS Distributions {
2114*a1e26a70SApple OSS Distributions 	short flags_ext = flags;
2115*a1e26a70SApple OSS Distributions 
2116*a1e26a70SApple OSS Distributions 	if (flags & POSIX_SPAWN_JETSAM_MEMLIMIT_FATAL) {
2117*a1e26a70SApple OSS Distributions 		flags_ext |= POSIX_SPAWN_JETSAM_MEMLIMIT_ACTIVE_FATAL;
2118*a1e26a70SApple OSS Distributions 		flags_ext |= POSIX_SPAWN_JETSAM_MEMLIMIT_INACTIVE_FATAL;
2119*a1e26a70SApple OSS Distributions 	} else {
2120*a1e26a70SApple OSS Distributions 		flags_ext &= ~POSIX_SPAWN_JETSAM_MEMLIMIT_ACTIVE_FATAL;
2121*a1e26a70SApple OSS Distributions 		flags_ext &= ~POSIX_SPAWN_JETSAM_MEMLIMIT_INACTIVE_FATAL;
2122*a1e26a70SApple OSS Distributions 	}
2123*a1e26a70SApple OSS Distributions 
2124*a1e26a70SApple OSS Distributions 	return posix_spawnattr_setjetsam_ext(attr, flags_ext, priority, memlimit, memlimit);
2125*a1e26a70SApple OSS Distributions }
2126*a1e26a70SApple OSS Distributions #endif /* (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR) */
2127*a1e26a70SApple OSS Distributions 
2128*a1e26a70SApple OSS Distributions /*
2129*a1e26a70SApple OSS Distributions  * posix_spawnattr_setjetsam_ext
2130*a1e26a70SApple OSS Distributions  *
2131*a1e26a70SApple OSS Distributions  * Description:	Set jetsam attributes for the spawn attribute object
2132*a1e26a70SApple OSS Distributions  *		referred to by 'attr'.
2133*a1e26a70SApple OSS Distributions  *
2134*a1e26a70SApple OSS Distributions  * Parameters:	flags			The flags value to set
2135*a1e26a70SApple OSS Distributions  *		priority		Relative jetsam priority
2136*a1e26a70SApple OSS Distributions  *		memlimit_active		Value in megabytes; memory footprint
2137*a1e26a70SApple OSS Distributions  *					above this level while process is
2138*a1e26a70SApple OSS Distributions  *					active may result in termination.
2139*a1e26a70SApple OSS Distributions  *		memlimit_inactive	Value in megabytes; memory footprint
2140*a1e26a70SApple OSS Distributions  *					above this level while process is
2141*a1e26a70SApple OSS Distributions  *					inactive may result in termination.
2142*a1e26a70SApple OSS Distributions  *
2143*a1e26a70SApple OSS Distributions  * Returns:	0			Success
2144*a1e26a70SApple OSS Distributions  */
2145*a1e26a70SApple OSS Distributions int
posix_spawnattr_setjetsam_ext(posix_spawnattr_t * __restrict attr,short flags,int priority,int memlimit_active,int memlimit_inactive)2146*a1e26a70SApple OSS Distributions posix_spawnattr_setjetsam_ext(posix_spawnattr_t * __restrict attr,
2147*a1e26a70SApple OSS Distributions     short flags, int priority, int memlimit_active, int memlimit_inactive)
2148*a1e26a70SApple OSS Distributions {
2149*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2150*a1e26a70SApple OSS Distributions 
2151*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2152*a1e26a70SApple OSS Distributions 		return EINVAL;
2153*a1e26a70SApple OSS Distributions 	}
2154*a1e26a70SApple OSS Distributions 
2155*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2156*a1e26a70SApple OSS Distributions 
2157*a1e26a70SApple OSS Distributions 	psattr->psa_jetsam_flags = flags;
2158*a1e26a70SApple OSS Distributions 	psattr->psa_jetsam_flags |= POSIX_SPAWN_JETSAM_SET;
2159*a1e26a70SApple OSS Distributions 	psattr->psa_priority = priority;
2160*a1e26a70SApple OSS Distributions 	psattr->psa_memlimit_active = memlimit_active;
2161*a1e26a70SApple OSS Distributions 	psattr->psa_memlimit_inactive = memlimit_inactive;
2162*a1e26a70SApple OSS Distributions 
2163*a1e26a70SApple OSS Distributions 	return 0;
2164*a1e26a70SApple OSS Distributions }
2165*a1e26a70SApple OSS Distributions 
2166*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_threadlimit_ext(posix_spawnattr_t * __restrict attr,int thread_limit)2167*a1e26a70SApple OSS Distributions posix_spawnattr_set_threadlimit_ext(posix_spawnattr_t * __restrict attr,
2168*a1e26a70SApple OSS Distributions     int thread_limit)
2169*a1e26a70SApple OSS Distributions {
2170*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2171*a1e26a70SApple OSS Distributions 
2172*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2173*a1e26a70SApple OSS Distributions 		return EINVAL;
2174*a1e26a70SApple OSS Distributions 	}
2175*a1e26a70SApple OSS Distributions 
2176*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2177*a1e26a70SApple OSS Distributions 
2178*a1e26a70SApple OSS Distributions 	psattr->psa_thread_limit = thread_limit;
2179*a1e26a70SApple OSS Distributions 
2180*a1e26a70SApple OSS Distributions 	return 0;
2181*a1e26a70SApple OSS Distributions }
2182*a1e26a70SApple OSS Distributions 
2183*a1e26a70SApple OSS Distributions 
2184*a1e26a70SApple OSS Distributions /*
2185*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_importancewatch_port_np
2186*a1e26a70SApple OSS Distributions  *
2187*a1e26a70SApple OSS Distributions  * Description:	Mark ports referred to by these rights
2188*a1e26a70SApple OSS Distributions  *              to boost the new task instead of their current task
2189*a1e26a70SApple OSS Distributions  *              for the spawn attribute object referred to by 'attr'.
2190*a1e26a70SApple OSS Distributions  *              Ports must be valid at posix_spawn time.  They will NOT be
2191*a1e26a70SApple OSS Distributions  *              consumed by the kernel, so they must be deallocated after the spawn returns.
2192*a1e26a70SApple OSS Distributions  *              (If you are SETEXEC-ing, they are cleaned up by the exec operation).
2193*a1e26a70SApple OSS Distributions  *
2194*a1e26a70SApple OSS Distributions  *              The maximum number of watch ports allowed is defined by POSIX_SPAWN_IMPORTANCE_PORT_COUNT.
2195*a1e26a70SApple OSS Distributions  *
2196*a1e26a70SApple OSS Distributions  * Parameters:	count           Number of ports in portarray
2197*a1e26a70SApple OSS Distributions  *              portarray       Array of rights
2198*a1e26a70SApple OSS Distributions  *
2199*a1e26a70SApple OSS Distributions  * Returns:     0       Success
2200*a1e26a70SApple OSS Distributions  *              EINVAL  Bad port count
2201*a1e26a70SApple OSS Distributions  *              ENOMEM  Insufficient memory exists to add to
2202*a1e26a70SApple OSS Distributions  *                      the spawn port actions object.
2203*a1e26a70SApple OSS Distributions  */
2204*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_importancewatch_port_np(posix_spawnattr_t * __restrict attr,int count,mach_port_t portarray[])2205*a1e26a70SApple OSS Distributions posix_spawnattr_set_importancewatch_port_np(posix_spawnattr_t * __restrict attr,
2206*a1e26a70SApple OSS Distributions     int count, mach_port_t portarray[])
2207*a1e26a70SApple OSS Distributions {
2208*a1e26a70SApple OSS Distributions 	int err = 0, i;
2209*a1e26a70SApple OSS Distributions 
2210*a1e26a70SApple OSS Distributions 	if (count < 0 || count > POSIX_SPAWN_IMPORTANCE_PORT_COUNT) {
2211*a1e26a70SApple OSS Distributions 		return EINVAL;
2212*a1e26a70SApple OSS Distributions 	}
2213*a1e26a70SApple OSS Distributions 
2214*a1e26a70SApple OSS Distributions 	for (i = 0; i < count; i++) {
2215*a1e26a70SApple OSS Distributions 		_ps_port_action_t action = {
2216*a1e26a70SApple OSS Distributions 			.port_type = PSPA_IMP_WATCHPORTS,
2217*a1e26a70SApple OSS Distributions 			.new_port = portarray[i],
2218*a1e26a70SApple OSS Distributions 		};
2219*a1e26a70SApple OSS Distributions 		err = posix_spawn_appendportaction_np(attr, &action);
2220*a1e26a70SApple OSS Distributions 		if (err) {
2221*a1e26a70SApple OSS Distributions 			break;
2222*a1e26a70SApple OSS Distributions 		}
2223*a1e26a70SApple OSS Distributions 	}
2224*a1e26a70SApple OSS Distributions 	return err;
2225*a1e26a70SApple OSS Distributions }
2226*a1e26a70SApple OSS Distributions 
2227*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_registered_ports_np(posix_spawnattr_t * __restrict attr,mach_port_t portarray[],uint32_t count)2228*a1e26a70SApple OSS Distributions posix_spawnattr_set_registered_ports_np(posix_spawnattr_t * __restrict attr,
2229*a1e26a70SApple OSS Distributions     mach_port_t portarray[], uint32_t count)
2230*a1e26a70SApple OSS Distributions {
2231*a1e26a70SApple OSS Distributions 	int err = 0;
2232*a1e26a70SApple OSS Distributions 
2233*a1e26a70SApple OSS Distributions 	if (count > TASK_PORT_REGISTER_MAX) {
2234*a1e26a70SApple OSS Distributions 		return EINVAL;
2235*a1e26a70SApple OSS Distributions 	}
2236*a1e26a70SApple OSS Distributions 
2237*a1e26a70SApple OSS Distributions 	for (uint32_t i = 0; i < count; i++) {
2238*a1e26a70SApple OSS Distributions 		_ps_port_action_t action = {
2239*a1e26a70SApple OSS Distributions 			.port_type = PSPA_REGISTERED_PORTS,
2240*a1e26a70SApple OSS Distributions 			.new_port = portarray[i],
2241*a1e26a70SApple OSS Distributions 		};
2242*a1e26a70SApple OSS Distributions 		err = posix_spawn_appendportaction_np(attr, &action);
2243*a1e26a70SApple OSS Distributions 		if (err) {
2244*a1e26a70SApple OSS Distributions 			break;
2245*a1e26a70SApple OSS Distributions 		}
2246*a1e26a70SApple OSS Distributions 	}
2247*a1e26a70SApple OSS Distributions 	return err;
2248*a1e26a70SApple OSS Distributions }
2249*a1e26a70SApple OSS Distributions 
2250*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_ptrauth_task_port_np(posix_spawnattr_t * __restrict attr,mach_port_t port)2251*a1e26a70SApple OSS Distributions posix_spawnattr_set_ptrauth_task_port_np(posix_spawnattr_t * __restrict attr,
2252*a1e26a70SApple OSS Distributions     mach_port_t port)
2253*a1e26a70SApple OSS Distributions {
2254*a1e26a70SApple OSS Distributions 	int err = 0;
2255*a1e26a70SApple OSS Distributions 
2256*a1e26a70SApple OSS Distributions 	_ps_port_action_t action = {
2257*a1e26a70SApple OSS Distributions 		.port_type = PSPA_PTRAUTH_TASK_PORT,
2258*a1e26a70SApple OSS Distributions 		.new_port = port,
2259*a1e26a70SApple OSS Distributions 	};
2260*a1e26a70SApple OSS Distributions 
2261*a1e26a70SApple OSS Distributions 	err = posix_spawn_appendportaction_np(attr, &action);
2262*a1e26a70SApple OSS Distributions 	return err;
2263*a1e26a70SApple OSS Distributions }
2264*a1e26a70SApple OSS Distributions 
2265*a1e26a70SApple OSS Distributions static
2266*a1e26a70SApple OSS Distributions _ps_mac_policy_extension_t *
posix_spawnattr_macpolicyinfo_lookup(_posix_spawn_mac_policy_extensions_t psmx,const char * policyname)2267*a1e26a70SApple OSS Distributions posix_spawnattr_macpolicyinfo_lookup(_posix_spawn_mac_policy_extensions_t psmx, const char *policyname)
2268*a1e26a70SApple OSS Distributions {
2269*a1e26a70SApple OSS Distributions 	int i;
2270*a1e26a70SApple OSS Distributions 
2271*a1e26a70SApple OSS Distributions 	if (psmx == NULL) {
2272*a1e26a70SApple OSS Distributions 		return NULL;
2273*a1e26a70SApple OSS Distributions 	}
2274*a1e26a70SApple OSS Distributions 
2275*a1e26a70SApple OSS Distributions 	for (i = 0; i < psmx->psmx_count; i++) {
2276*a1e26a70SApple OSS Distributions 		_ps_mac_policy_extension_t *extension = &psmx->psmx_extensions[i];
2277*a1e26a70SApple OSS Distributions 		if (strcmp(extension->policyname, policyname) == 0) {
2278*a1e26a70SApple OSS Distributions 			return extension;
2279*a1e26a70SApple OSS Distributions 		}
2280*a1e26a70SApple OSS Distributions 	}
2281*a1e26a70SApple OSS Distributions 	return NULL;
2282*a1e26a70SApple OSS Distributions }
2283*a1e26a70SApple OSS Distributions 
2284*a1e26a70SApple OSS Distributions int
posix_spawnattr_getmacpolicyinfo_np(const posix_spawnattr_t * __restrict attr,const char * policyname,void ** datap,size_t * datalenp)2285*a1e26a70SApple OSS Distributions posix_spawnattr_getmacpolicyinfo_np(const posix_spawnattr_t * __restrict attr,
2286*a1e26a70SApple OSS Distributions     const char *policyname, void **datap, size_t *datalenp)
2287*a1e26a70SApple OSS Distributions {
2288*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2289*a1e26a70SApple OSS Distributions 	_ps_mac_policy_extension_t *extension;
2290*a1e26a70SApple OSS Distributions 
2291*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL || policyname == NULL || datap == NULL) {
2292*a1e26a70SApple OSS Distributions 		return EINVAL;
2293*a1e26a70SApple OSS Distributions 	}
2294*a1e26a70SApple OSS Distributions 
2295*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2296*a1e26a70SApple OSS Distributions 	extension = posix_spawnattr_macpolicyinfo_lookup(psattr->psa_mac_extensions, policyname);
2297*a1e26a70SApple OSS Distributions 	if (extension == NULL) {
2298*a1e26a70SApple OSS Distributions 		return ESRCH;
2299*a1e26a70SApple OSS Distributions 	}
2300*a1e26a70SApple OSS Distributions 	*datap = (void *)(uintptr_t)extension->data;
2301*a1e26a70SApple OSS Distributions 	if (datalenp != NULL) {
2302*a1e26a70SApple OSS Distributions 		*datalenp = (size_t)extension->datalen;
2303*a1e26a70SApple OSS Distributions 	}
2304*a1e26a70SApple OSS Distributions 	return 0;
2305*a1e26a70SApple OSS Distributions }
2306*a1e26a70SApple OSS Distributions 
2307*a1e26a70SApple OSS Distributions int
posix_spawnattr_setmacpolicyinfo_np(posix_spawnattr_t * __restrict attr,const char * policyname,void * data,size_t datalen)2308*a1e26a70SApple OSS Distributions posix_spawnattr_setmacpolicyinfo_np(posix_spawnattr_t * __restrict attr,
2309*a1e26a70SApple OSS Distributions     const char *policyname, void *data, size_t datalen)
2310*a1e26a70SApple OSS Distributions {
2311*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2312*a1e26a70SApple OSS Distributions 	_posix_spawn_mac_policy_extensions_t psmx;
2313*a1e26a70SApple OSS Distributions 	_ps_mac_policy_extension_t *extension;
2314*a1e26a70SApple OSS Distributions 
2315*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL || policyname == NULL) {
2316*a1e26a70SApple OSS Distributions 		return EINVAL;
2317*a1e26a70SApple OSS Distributions 	}
2318*a1e26a70SApple OSS Distributions 
2319*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2320*a1e26a70SApple OSS Distributions 	psmx = psattr->psa_mac_extensions;
2321*a1e26a70SApple OSS Distributions 	extension = posix_spawnattr_macpolicyinfo_lookup(psattr->psa_mac_extensions, policyname);
2322*a1e26a70SApple OSS Distributions 	if (extension != NULL) {
2323*a1e26a70SApple OSS Distributions 		extension->data = (uintptr_t)data;
2324*a1e26a70SApple OSS Distributions 		extension->datalen = datalen;
2325*a1e26a70SApple OSS Distributions 		return 0;
2326*a1e26a70SApple OSS Distributions 	} else if (psmx == NULL) {
2327*a1e26a70SApple OSS Distributions 		psmx = psattr->psa_mac_extensions = malloc(PS_MAC_EXTENSIONS_SIZE(PS_MAC_EXTENSIONS_INIT_COUNT));
2328*a1e26a70SApple OSS Distributions 		if (psmx == NULL) {
2329*a1e26a70SApple OSS Distributions 			return ENOMEM;
2330*a1e26a70SApple OSS Distributions 		}
2331*a1e26a70SApple OSS Distributions 		psmx->psmx_alloc = PS_MAC_EXTENSIONS_INIT_COUNT;
2332*a1e26a70SApple OSS Distributions 		psmx->psmx_count = 0;
2333*a1e26a70SApple OSS Distributions 	} else if (psmx->psmx_count == psmx->psmx_alloc) {
2334*a1e26a70SApple OSS Distributions 		int newnum = 0;
2335*a1e26a70SApple OSS Distributions 		if (os_mul_overflow(psmx->psmx_alloc, 2, &newnum)) {
2336*a1e26a70SApple OSS Distributions 			return ENOMEM;
2337*a1e26a70SApple OSS Distributions 		}
2338*a1e26a70SApple OSS Distributions 		size_t extsize = PS_MAC_EXTENSIONS_SIZE(newnum);
2339*a1e26a70SApple OSS Distributions 		if (extsize == 0) {
2340*a1e26a70SApple OSS Distributions 			return ENOMEM;
2341*a1e26a70SApple OSS Distributions 		}
2342*a1e26a70SApple OSS Distributions 		psmx = psattr->psa_mac_extensions = reallocf(psmx, extsize);
2343*a1e26a70SApple OSS Distributions 		if (psmx == NULL) {
2344*a1e26a70SApple OSS Distributions 			return ENOMEM;
2345*a1e26a70SApple OSS Distributions 		}
2346*a1e26a70SApple OSS Distributions 		psmx->psmx_alloc = newnum;
2347*a1e26a70SApple OSS Distributions 	}
2348*a1e26a70SApple OSS Distributions 	extension = &psmx->psmx_extensions[psmx->psmx_count];
2349*a1e26a70SApple OSS Distributions 	strlcpy(extension->policyname, policyname, sizeof(extension->policyname));
2350*a1e26a70SApple OSS Distributions 	extension->data = (uintptr_t)data;
2351*a1e26a70SApple OSS Distributions 	extension->datalen = datalen;
2352*a1e26a70SApple OSS Distributions 	psmx->psmx_count += 1;
2353*a1e26a70SApple OSS Distributions 	return 0;
2354*a1e26a70SApple OSS Distributions }
2355*a1e26a70SApple OSS Distributions 
2356*a1e26a70SApple OSS Distributions /*
2357*a1e26a70SApple OSS Distributions  * posix_spawn_destroymacpolicy_info_np
2358*a1e26a70SApple OSS Distributions  * Description: cleanup the macpolicy struct in posix_spawnattr_t attr
2359*a1e26a70SApple OSS Distributions  */
2360*a1e26a70SApple OSS Distributions static int
posix_spawn_destroymacpolicy_info_np(posix_spawnattr_t * attr)2361*a1e26a70SApple OSS Distributions posix_spawn_destroymacpolicy_info_np(posix_spawnattr_t *attr)
2362*a1e26a70SApple OSS Distributions {
2363*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2364*a1e26a70SApple OSS Distributions 	_posix_spawn_mac_policy_extensions_t psmx;
2365*a1e26a70SApple OSS Distributions 
2366*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2367*a1e26a70SApple OSS Distributions 		return EINVAL;
2368*a1e26a70SApple OSS Distributions 	}
2369*a1e26a70SApple OSS Distributions 
2370*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2371*a1e26a70SApple OSS Distributions 	psmx = psattr->psa_mac_extensions;
2372*a1e26a70SApple OSS Distributions 	if (psmx == NULL) {
2373*a1e26a70SApple OSS Distributions 		return EINVAL;
2374*a1e26a70SApple OSS Distributions 	}
2375*a1e26a70SApple OSS Distributions 
2376*a1e26a70SApple OSS Distributions 	psattr->psa_mac_extensions = NULL;
2377*a1e26a70SApple OSS Distributions 	free(psmx);
2378*a1e26a70SApple OSS Distributions 	return 0;
2379*a1e26a70SApple OSS Distributions }
2380*a1e26a70SApple OSS Distributions 
2381*a1e26a70SApple OSS Distributions int
posix_spawnattr_setcoalition_np(const posix_spawnattr_t * __restrict attr,uint64_t coalitionid,int type,int role)2382*a1e26a70SApple OSS Distributions posix_spawnattr_setcoalition_np(const posix_spawnattr_t * __restrict attr,
2383*a1e26a70SApple OSS Distributions     uint64_t coalitionid, int type, int role)
2384*a1e26a70SApple OSS Distributions {
2385*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2386*a1e26a70SApple OSS Distributions 	struct _posix_spawn_coalition_info *coal_info;
2387*a1e26a70SApple OSS Distributions 
2388*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2389*a1e26a70SApple OSS Distributions 		return EINVAL;
2390*a1e26a70SApple OSS Distributions 	}
2391*a1e26a70SApple OSS Distributions 	if (type < 0 || type > COALITION_TYPE_MAX) {
2392*a1e26a70SApple OSS Distributions 		return EINVAL;
2393*a1e26a70SApple OSS Distributions 	}
2394*a1e26a70SApple OSS Distributions 
2395*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2396*a1e26a70SApple OSS Distributions 
2397*a1e26a70SApple OSS Distributions 	coal_info = psattr->psa_coalition_info;
2398*a1e26a70SApple OSS Distributions 	if (!coal_info) {
2399*a1e26a70SApple OSS Distributions 		coal_info = (struct _posix_spawn_coalition_info *)malloc(sizeof(*coal_info));
2400*a1e26a70SApple OSS Distributions 		if (!coal_info) {
2401*a1e26a70SApple OSS Distributions 			return ENOMEM;
2402*a1e26a70SApple OSS Distributions 		}
2403*a1e26a70SApple OSS Distributions 		memset(coal_info, 0, sizeof(*coal_info));
2404*a1e26a70SApple OSS Distributions 		psattr->psa_coalition_info = coal_info;
2405*a1e26a70SApple OSS Distributions 	}
2406*a1e26a70SApple OSS Distributions 
2407*a1e26a70SApple OSS Distributions 	coal_info->psci_info[type].psci_id   = coalitionid;
2408*a1e26a70SApple OSS Distributions 	coal_info->psci_info[type].psci_role = role;
2409*a1e26a70SApple OSS Distributions 
2410*a1e26a70SApple OSS Distributions 	return 0;
2411*a1e26a70SApple OSS Distributions }
2412*a1e26a70SApple OSS Distributions 
2413*a1e26a70SApple OSS Distributions 
2414*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_qos_clamp_np(const posix_spawnattr_t * __restrict attr,uint64_t qos_clamp)2415*a1e26a70SApple OSS Distributions posix_spawnattr_set_qos_clamp_np(const posix_spawnattr_t * __restrict attr, uint64_t qos_clamp)
2416*a1e26a70SApple OSS Distributions {
2417*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2418*a1e26a70SApple OSS Distributions 
2419*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2420*a1e26a70SApple OSS Distributions 		return EINVAL;
2421*a1e26a70SApple OSS Distributions 	}
2422*a1e26a70SApple OSS Distributions 
2423*a1e26a70SApple OSS Distributions 	if (qos_clamp >= POSIX_SPAWN_PROC_CLAMP_LAST) {
2424*a1e26a70SApple OSS Distributions 		return EINVAL;
2425*a1e26a70SApple OSS Distributions 	}
2426*a1e26a70SApple OSS Distributions 
2427*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2428*a1e26a70SApple OSS Distributions 	psattr->psa_qos_clamp = qos_clamp;
2429*a1e26a70SApple OSS Distributions 
2430*a1e26a70SApple OSS Distributions 	return 0;
2431*a1e26a70SApple OSS Distributions }
2432*a1e26a70SApple OSS Distributions 
2433*a1e26a70SApple OSS Distributions int
posix_spawnattr_get_qos_clamp_np(const posix_spawnattr_t * __restrict attr,uint64_t * __restrict qos_clampp)2434*a1e26a70SApple OSS Distributions posix_spawnattr_get_qos_clamp_np(const posix_spawnattr_t * __restrict attr, uint64_t * __restrict qos_clampp)
2435*a1e26a70SApple OSS Distributions {
2436*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2437*a1e26a70SApple OSS Distributions 
2438*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2439*a1e26a70SApple OSS Distributions 		return EINVAL;
2440*a1e26a70SApple OSS Distributions 	}
2441*a1e26a70SApple OSS Distributions 
2442*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2443*a1e26a70SApple OSS Distributions 	*qos_clampp = psattr->psa_qos_clamp;
2444*a1e26a70SApple OSS Distributions 
2445*a1e26a70SApple OSS Distributions 	return 0;
2446*a1e26a70SApple OSS Distributions }
2447*a1e26a70SApple OSS Distributions 
2448*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_darwin_role_np(const posix_spawnattr_t * __restrict attr,uint64_t darwin_role)2449*a1e26a70SApple OSS Distributions posix_spawnattr_set_darwin_role_np(const posix_spawnattr_t * __restrict attr, uint64_t darwin_role)
2450*a1e26a70SApple OSS Distributions {
2451*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2452*a1e26a70SApple OSS Distributions 
2453*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2454*a1e26a70SApple OSS Distributions 		return EINVAL;
2455*a1e26a70SApple OSS Distributions 	}
2456*a1e26a70SApple OSS Distributions 
2457*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2458*a1e26a70SApple OSS Distributions 	psattr->psa_darwin_role = darwin_role;
2459*a1e26a70SApple OSS Distributions 
2460*a1e26a70SApple OSS Distributions 	return 0;
2461*a1e26a70SApple OSS Distributions }
2462*a1e26a70SApple OSS Distributions 
2463*a1e26a70SApple OSS Distributions int
posix_spawnattr_get_darwin_role_np(const posix_spawnattr_t * __restrict attr,uint64_t * __restrict darwin_rolep)2464*a1e26a70SApple OSS Distributions posix_spawnattr_get_darwin_role_np(const posix_spawnattr_t * __restrict attr, uint64_t * __restrict darwin_rolep)
2465*a1e26a70SApple OSS Distributions {
2466*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2467*a1e26a70SApple OSS Distributions 
2468*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2469*a1e26a70SApple OSS Distributions 		return EINVAL;
2470*a1e26a70SApple OSS Distributions 	}
2471*a1e26a70SApple OSS Distributions 
2472*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2473*a1e26a70SApple OSS Distributions 	*darwin_rolep = psattr->psa_darwin_role;
2474*a1e26a70SApple OSS Distributions 
2475*a1e26a70SApple OSS Distributions 	return 0;
2476*a1e26a70SApple OSS Distributions }
2477*a1e26a70SApple OSS Distributions 
2478*a1e26a70SApple OSS Distributions 
2479*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_persona_np(const posix_spawnattr_t * __restrict attr,uid_t persona_id,uint32_t flags)2480*a1e26a70SApple OSS Distributions posix_spawnattr_set_persona_np(const posix_spawnattr_t * __restrict attr, uid_t persona_id, uint32_t flags)
2481*a1e26a70SApple OSS Distributions {
2482*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2483*a1e26a70SApple OSS Distributions 	struct _posix_spawn_persona_info *persona;
2484*a1e26a70SApple OSS Distributions 
2485*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2486*a1e26a70SApple OSS Distributions 		return EINVAL;
2487*a1e26a70SApple OSS Distributions 	}
2488*a1e26a70SApple OSS Distributions 
2489*a1e26a70SApple OSS Distributions 	if (flags & ~POSIX_SPAWN_PERSONA_ALL_FLAGS) {
2490*a1e26a70SApple OSS Distributions 		return EINVAL;
2491*a1e26a70SApple OSS Distributions 	}
2492*a1e26a70SApple OSS Distributions 
2493*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2494*a1e26a70SApple OSS Distributions 
2495*a1e26a70SApple OSS Distributions 	persona = psattr->psa_persona_info;
2496*a1e26a70SApple OSS Distributions 	if (!persona) {
2497*a1e26a70SApple OSS Distributions 		persona = (struct _posix_spawn_persona_info *)malloc(sizeof(*persona));
2498*a1e26a70SApple OSS Distributions 		if (!persona) {
2499*a1e26a70SApple OSS Distributions 			return ENOMEM;
2500*a1e26a70SApple OSS Distributions 		}
2501*a1e26a70SApple OSS Distributions 		persona->pspi_uid = 0;
2502*a1e26a70SApple OSS Distributions 		persona->pspi_gid = 0;
2503*a1e26a70SApple OSS Distributions 		persona->pspi_ngroups = 0;
2504*a1e26a70SApple OSS Distributions 		persona->pspi_groups[0] = 0;
2505*a1e26a70SApple OSS Distributions 		persona->pspi_gmuid = 0;
2506*a1e26a70SApple OSS Distributions 
2507*a1e26a70SApple OSS Distributions 		psattr->psa_persona_info = persona;
2508*a1e26a70SApple OSS Distributions 	}
2509*a1e26a70SApple OSS Distributions 
2510*a1e26a70SApple OSS Distributions 	persona->pspi_id = persona_id;
2511*a1e26a70SApple OSS Distributions 	persona->pspi_flags = flags;
2512*a1e26a70SApple OSS Distributions 
2513*a1e26a70SApple OSS Distributions 	return 0;
2514*a1e26a70SApple OSS Distributions }
2515*a1e26a70SApple OSS Distributions 
2516*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_persona_uid_np(const posix_spawnattr_t * __restrict attr,uid_t uid)2517*a1e26a70SApple OSS Distributions posix_spawnattr_set_persona_uid_np(const posix_spawnattr_t * __restrict attr, uid_t uid)
2518*a1e26a70SApple OSS Distributions {
2519*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2520*a1e26a70SApple OSS Distributions 	struct _posix_spawn_persona_info *persona;
2521*a1e26a70SApple OSS Distributions 
2522*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2523*a1e26a70SApple OSS Distributions 		return EINVAL;
2524*a1e26a70SApple OSS Distributions 	}
2525*a1e26a70SApple OSS Distributions 
2526*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2527*a1e26a70SApple OSS Distributions 	persona = psattr->psa_persona_info;
2528*a1e26a70SApple OSS Distributions 	if (!persona) {
2529*a1e26a70SApple OSS Distributions 		return EINVAL;
2530*a1e26a70SApple OSS Distributions 	}
2531*a1e26a70SApple OSS Distributions 
2532*a1e26a70SApple OSS Distributions 	persona->pspi_uid = uid;
2533*a1e26a70SApple OSS Distributions 
2534*a1e26a70SApple OSS Distributions 	persona->pspi_flags |= POSIX_SPAWN_PERSONA_UID;
2535*a1e26a70SApple OSS Distributions 
2536*a1e26a70SApple OSS Distributions 	return 0;
2537*a1e26a70SApple OSS Distributions }
2538*a1e26a70SApple OSS Distributions 
2539*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_persona_gid_np(const posix_spawnattr_t * __restrict attr,gid_t gid)2540*a1e26a70SApple OSS Distributions posix_spawnattr_set_persona_gid_np(const posix_spawnattr_t * __restrict attr, gid_t gid)
2541*a1e26a70SApple OSS Distributions {
2542*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2543*a1e26a70SApple OSS Distributions 	struct _posix_spawn_persona_info *persona;
2544*a1e26a70SApple OSS Distributions 
2545*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2546*a1e26a70SApple OSS Distributions 		return EINVAL;
2547*a1e26a70SApple OSS Distributions 	}
2548*a1e26a70SApple OSS Distributions 
2549*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2550*a1e26a70SApple OSS Distributions 	persona = psattr->psa_persona_info;
2551*a1e26a70SApple OSS Distributions 	if (!persona) {
2552*a1e26a70SApple OSS Distributions 		return EINVAL;
2553*a1e26a70SApple OSS Distributions 	}
2554*a1e26a70SApple OSS Distributions 
2555*a1e26a70SApple OSS Distributions 	persona->pspi_gid = gid;
2556*a1e26a70SApple OSS Distributions 
2557*a1e26a70SApple OSS Distributions 	persona->pspi_flags |= POSIX_SPAWN_PERSONA_GID;
2558*a1e26a70SApple OSS Distributions 
2559*a1e26a70SApple OSS Distributions 	return 0;
2560*a1e26a70SApple OSS Distributions }
2561*a1e26a70SApple OSS Distributions 
2562*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_persona_groups_np(const posix_spawnattr_t * __restrict attr,int ngroups,gid_t * gidarray,uid_t gmuid)2563*a1e26a70SApple OSS Distributions posix_spawnattr_set_persona_groups_np(const posix_spawnattr_t * __restrict attr, int ngroups, gid_t *gidarray, uid_t gmuid)
2564*a1e26a70SApple OSS Distributions {
2565*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2566*a1e26a70SApple OSS Distributions 	struct _posix_spawn_persona_info *persona;
2567*a1e26a70SApple OSS Distributions 
2568*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2569*a1e26a70SApple OSS Distributions 		return EINVAL;
2570*a1e26a70SApple OSS Distributions 	}
2571*a1e26a70SApple OSS Distributions 
2572*a1e26a70SApple OSS Distributions 	if (gidarray == NULL) {
2573*a1e26a70SApple OSS Distributions 		return EINVAL;
2574*a1e26a70SApple OSS Distributions 	}
2575*a1e26a70SApple OSS Distributions 
2576*a1e26a70SApple OSS Distributions 	if (ngroups > NGROUPS || ngroups < 0) {
2577*a1e26a70SApple OSS Distributions 		return EINVAL;
2578*a1e26a70SApple OSS Distributions 	}
2579*a1e26a70SApple OSS Distributions 
2580*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2581*a1e26a70SApple OSS Distributions 	persona = psattr->psa_persona_info;
2582*a1e26a70SApple OSS Distributions 	if (!persona) {
2583*a1e26a70SApple OSS Distributions 		return EINVAL;
2584*a1e26a70SApple OSS Distributions 	}
2585*a1e26a70SApple OSS Distributions 
2586*a1e26a70SApple OSS Distributions 	persona->pspi_ngroups = ngroups;
2587*a1e26a70SApple OSS Distributions 	for (int i = 0; i < ngroups; i++) {
2588*a1e26a70SApple OSS Distributions 		persona->pspi_groups[i] = gidarray[i];
2589*a1e26a70SApple OSS Distributions 	}
2590*a1e26a70SApple OSS Distributions 
2591*a1e26a70SApple OSS Distributions 	persona->pspi_gmuid = gmuid;
2592*a1e26a70SApple OSS Distributions 
2593*a1e26a70SApple OSS Distributions 	persona->pspi_flags |= POSIX_SPAWN_PERSONA_GROUPS;
2594*a1e26a70SApple OSS Distributions 
2595*a1e26a70SApple OSS Distributions 	return 0;
2596*a1e26a70SApple OSS Distributions }
2597*a1e26a70SApple OSS Distributions 
2598*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_max_addr_np(const posix_spawnattr_t * __restrict attr,uint64_t max_addr)2599*a1e26a70SApple OSS Distributions posix_spawnattr_set_max_addr_np(const posix_spawnattr_t * __restrict attr, uint64_t max_addr)
2600*a1e26a70SApple OSS Distributions {
2601*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2602*a1e26a70SApple OSS Distributions 
2603*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2604*a1e26a70SApple OSS Distributions 		return EINVAL;
2605*a1e26a70SApple OSS Distributions 	}
2606*a1e26a70SApple OSS Distributions 
2607*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2608*a1e26a70SApple OSS Distributions 	psattr->psa_max_addr = max_addr;
2609*a1e26a70SApple OSS Distributions 
2610*a1e26a70SApple OSS Distributions 	return 0;
2611*a1e26a70SApple OSS Distributions }
2612*a1e26a70SApple OSS Distributions 
2613*a1e26a70SApple OSS Distributions int
posix_spawnattr_setnosmt_np(const posix_spawnattr_t * __restrict attr)2614*a1e26a70SApple OSS Distributions posix_spawnattr_setnosmt_np(const posix_spawnattr_t * __restrict attr)
2615*a1e26a70SApple OSS Distributions {
2616*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2617*a1e26a70SApple OSS Distributions 
2618*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2619*a1e26a70SApple OSS Distributions 		return EINVAL;
2620*a1e26a70SApple OSS Distributions 	}
2621*a1e26a70SApple OSS Distributions 
2622*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2623*a1e26a70SApple OSS Distributions 	psattr->psa_no_smt = true;
2624*a1e26a70SApple OSS Distributions 
2625*a1e26a70SApple OSS Distributions 	return 0;
2626*a1e26a70SApple OSS Distributions }
2627*a1e26a70SApple OSS Distributions 
2628*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_csm_np(const posix_spawnattr_t * __restrict attr,uint32_t flags)2629*a1e26a70SApple OSS Distributions posix_spawnattr_set_csm_np(const posix_spawnattr_t * __restrict attr, uint32_t flags)
2630*a1e26a70SApple OSS Distributions {
2631*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2632*a1e26a70SApple OSS Distributions 
2633*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2634*a1e26a70SApple OSS Distributions 		return EINVAL;
2635*a1e26a70SApple OSS Distributions 	}
2636*a1e26a70SApple OSS Distributions 
2637*a1e26a70SApple OSS Distributions 	const uint32_t mask = POSIX_SPAWN_NP_CSM_ALL | POSIX_SPAWN_NP_CSM_TECS | POSIX_SPAWN_NP_CSM_NOSMT;
2638*a1e26a70SApple OSS Distributions 	if ((flags & ~mask) != 0) {
2639*a1e26a70SApple OSS Distributions 		return EINVAL;
2640*a1e26a70SApple OSS Distributions 	}
2641*a1e26a70SApple OSS Distributions 
2642*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2643*a1e26a70SApple OSS Distributions 
2644*a1e26a70SApple OSS Distributions 	if (flags & (POSIX_SPAWN_NP_CSM_TECS | POSIX_SPAWN_NP_CSM_ALL)) {
2645*a1e26a70SApple OSS Distributions 		psattr->psa_tecs = true;
2646*a1e26a70SApple OSS Distributions 	}
2647*a1e26a70SApple OSS Distributions 	if (flags & (POSIX_SPAWN_NP_CSM_NOSMT | POSIX_SPAWN_NP_CSM_ALL)) {
2648*a1e26a70SApple OSS Distributions 		psattr->psa_no_smt = true;
2649*a1e26a70SApple OSS Distributions 	}
2650*a1e26a70SApple OSS Distributions 
2651*a1e26a70SApple OSS Distributions 	return 0;
2652*a1e26a70SApple OSS Distributions }
2653*a1e26a70SApple OSS Distributions 
2654*a1e26a70SApple OSS Distributions static struct _posix_spawn_posix_cred_info *
_posix_spawnattr_get_posix_creds_info(_posix_spawnattr_t psattr)2655*a1e26a70SApple OSS Distributions _posix_spawnattr_get_posix_creds_info(_posix_spawnattr_t psattr)
2656*a1e26a70SApple OSS Distributions {
2657*a1e26a70SApple OSS Distributions 	struct _posix_spawn_posix_cred_info *pspci = psattr->psa_posix_cred_info;
2658*a1e26a70SApple OSS Distributions 
2659*a1e26a70SApple OSS Distributions 	if (pspci == NULL) {
2660*a1e26a70SApple OSS Distributions 		pspci = malloc(sizeof(struct _posix_spawn_posix_cred_info));
2661*a1e26a70SApple OSS Distributions 		if (pspci != NULL) {
2662*a1e26a70SApple OSS Distributions 			pspci->pspci_flags = 0;
2663*a1e26a70SApple OSS Distributions 			pspci->pspci_uid = 0;
2664*a1e26a70SApple OSS Distributions 			pspci->pspci_gid = 0;
2665*a1e26a70SApple OSS Distributions 			pspci->pspci_ngroups = 0;
2666*a1e26a70SApple OSS Distributions 			pspci->pspci_groups[0] = 0;
2667*a1e26a70SApple OSS Distributions 			pspci->pspci_gmuid = 0;
2668*a1e26a70SApple OSS Distributions 			pspci->pspci_login[0] = '\0';
2669*a1e26a70SApple OSS Distributions 			psattr->psa_posix_cred_info = pspci;
2670*a1e26a70SApple OSS Distributions 		}
2671*a1e26a70SApple OSS Distributions 	}
2672*a1e26a70SApple OSS Distributions 	return pspci;
2673*a1e26a70SApple OSS Distributions }
2674*a1e26a70SApple OSS Distributions 
2675*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_uid_np(const posix_spawnattr_t * attr,uid_t uid)2676*a1e26a70SApple OSS Distributions posix_spawnattr_set_uid_np(const posix_spawnattr_t *attr, uid_t uid)
2677*a1e26a70SApple OSS Distributions {
2678*a1e26a70SApple OSS Distributions 	struct _posix_spawn_posix_cred_info *pspci;
2679*a1e26a70SApple OSS Distributions 
2680*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2681*a1e26a70SApple OSS Distributions 		return EINVAL;
2682*a1e26a70SApple OSS Distributions 	}
2683*a1e26a70SApple OSS Distributions 
2684*a1e26a70SApple OSS Distributions 	pspci = _posix_spawnattr_get_posix_creds_info(*(_posix_spawnattr_t *)attr);
2685*a1e26a70SApple OSS Distributions 	if (pspci == NULL) {
2686*a1e26a70SApple OSS Distributions 		return ENOMEM;
2687*a1e26a70SApple OSS Distributions 	}
2688*a1e26a70SApple OSS Distributions 
2689*a1e26a70SApple OSS Distributions 	pspci->pspci_uid = uid;
2690*a1e26a70SApple OSS Distributions 
2691*a1e26a70SApple OSS Distributions 	pspci->pspci_flags |= POSIX_SPAWN_POSIX_CRED_UID;
2692*a1e26a70SApple OSS Distributions 
2693*a1e26a70SApple OSS Distributions 	return 0;
2694*a1e26a70SApple OSS Distributions }
2695*a1e26a70SApple OSS Distributions 
2696*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_gid_np(const posix_spawnattr_t * attr,gid_t gid)2697*a1e26a70SApple OSS Distributions posix_spawnattr_set_gid_np(const posix_spawnattr_t *attr, gid_t gid)
2698*a1e26a70SApple OSS Distributions {
2699*a1e26a70SApple OSS Distributions 	struct _posix_spawn_posix_cred_info *pspci;
2700*a1e26a70SApple OSS Distributions 
2701*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2702*a1e26a70SApple OSS Distributions 		return EINVAL;
2703*a1e26a70SApple OSS Distributions 	}
2704*a1e26a70SApple OSS Distributions 
2705*a1e26a70SApple OSS Distributions 	pspci = _posix_spawnattr_get_posix_creds_info(*(_posix_spawnattr_t *)attr);
2706*a1e26a70SApple OSS Distributions 	if (pspci == NULL) {
2707*a1e26a70SApple OSS Distributions 		return ENOMEM;
2708*a1e26a70SApple OSS Distributions 	}
2709*a1e26a70SApple OSS Distributions 
2710*a1e26a70SApple OSS Distributions 	pspci->pspci_gid = gid;
2711*a1e26a70SApple OSS Distributions 
2712*a1e26a70SApple OSS Distributions 	pspci->pspci_flags |= POSIX_SPAWN_POSIX_CRED_GID;
2713*a1e26a70SApple OSS Distributions 
2714*a1e26a70SApple OSS Distributions 	return 0;
2715*a1e26a70SApple OSS Distributions }
2716*a1e26a70SApple OSS Distributions 
2717*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_groups_np(const posix_spawnattr_t * attr,int ngroups,gid_t * gidarray,uid_t gmuid)2718*a1e26a70SApple OSS Distributions posix_spawnattr_set_groups_np(const posix_spawnattr_t *attr,
2719*a1e26a70SApple OSS Distributions     int ngroups, gid_t *gidarray, uid_t gmuid)
2720*a1e26a70SApple OSS Distributions {
2721*a1e26a70SApple OSS Distributions 	struct _posix_spawn_posix_cred_info *pspci;
2722*a1e26a70SApple OSS Distributions 
2723*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2724*a1e26a70SApple OSS Distributions 		return EINVAL;
2725*a1e26a70SApple OSS Distributions 	}
2726*a1e26a70SApple OSS Distributions 
2727*a1e26a70SApple OSS Distributions 	if (gidarray == NULL) {
2728*a1e26a70SApple OSS Distributions 		return EINVAL;
2729*a1e26a70SApple OSS Distributions 	}
2730*a1e26a70SApple OSS Distributions 
2731*a1e26a70SApple OSS Distributions 	if (ngroups > NGROUPS || ngroups < 0) {
2732*a1e26a70SApple OSS Distributions 		return EINVAL;
2733*a1e26a70SApple OSS Distributions 	}
2734*a1e26a70SApple OSS Distributions 
2735*a1e26a70SApple OSS Distributions 	pspci = _posix_spawnattr_get_posix_creds_info(*(_posix_spawnattr_t *)attr);
2736*a1e26a70SApple OSS Distributions 	if (pspci == NULL) {
2737*a1e26a70SApple OSS Distributions 		return ENOMEM;
2738*a1e26a70SApple OSS Distributions 	}
2739*a1e26a70SApple OSS Distributions 
2740*a1e26a70SApple OSS Distributions 	pspci->pspci_ngroups = ngroups;
2741*a1e26a70SApple OSS Distributions 	for (int i = 0; i < ngroups; i++) {
2742*a1e26a70SApple OSS Distributions 		pspci->pspci_groups[i] = gidarray[i];
2743*a1e26a70SApple OSS Distributions 	}
2744*a1e26a70SApple OSS Distributions 
2745*a1e26a70SApple OSS Distributions 	pspci->pspci_gmuid = gmuid;
2746*a1e26a70SApple OSS Distributions 
2747*a1e26a70SApple OSS Distributions 	pspci->pspci_flags |= POSIX_SPAWN_POSIX_CRED_GROUPS;
2748*a1e26a70SApple OSS Distributions 
2749*a1e26a70SApple OSS Distributions 	return 0;
2750*a1e26a70SApple OSS Distributions }
2751*a1e26a70SApple OSS Distributions 
2752*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_login_np(const posix_spawnattr_t * attr,const char * login)2753*a1e26a70SApple OSS Distributions posix_spawnattr_set_login_np(const posix_spawnattr_t *attr, const char *login)
2754*a1e26a70SApple OSS Distributions {
2755*a1e26a70SApple OSS Distributions 	struct _posix_spawn_posix_cred_info *pspci;
2756*a1e26a70SApple OSS Distributions 
2757*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2758*a1e26a70SApple OSS Distributions 		return EINVAL;
2759*a1e26a70SApple OSS Distributions 	}
2760*a1e26a70SApple OSS Distributions 
2761*a1e26a70SApple OSS Distributions 	if (strlen(login) > MAXLOGNAME) {
2762*a1e26a70SApple OSS Distributions 		return ERANGE;
2763*a1e26a70SApple OSS Distributions 	}
2764*a1e26a70SApple OSS Distributions 
2765*a1e26a70SApple OSS Distributions 	pspci = _posix_spawnattr_get_posix_creds_info(*(_posix_spawnattr_t *)attr);
2766*a1e26a70SApple OSS Distributions 	if (pspci == NULL) {
2767*a1e26a70SApple OSS Distributions 		return ENOMEM;
2768*a1e26a70SApple OSS Distributions 	}
2769*a1e26a70SApple OSS Distributions 
2770*a1e26a70SApple OSS Distributions 	strlcpy(pspci->pspci_login, login, sizeof(pspci->pspci_login));
2771*a1e26a70SApple OSS Distributions 
2772*a1e26a70SApple OSS Distributions 	pspci->pspci_flags |= POSIX_SPAWN_POSIX_CRED_LOGIN;
2773*a1e26a70SApple OSS Distributions 
2774*a1e26a70SApple OSS Distributions 	return 0;
2775*a1e26a70SApple OSS Distributions }
2776*a1e26a70SApple OSS Distributions 
2777*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_conclave_id_np(const posix_spawnattr_t * attr,const char * conclave_id)2778*a1e26a70SApple OSS Distributions posix_spawnattr_set_conclave_id_np(const posix_spawnattr_t *attr, const char *conclave_id)
2779*a1e26a70SApple OSS Distributions {
2780*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2781*a1e26a70SApple OSS Distributions 
2782*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2783*a1e26a70SApple OSS Distributions 		return EINVAL;
2784*a1e26a70SApple OSS Distributions 	}
2785*a1e26a70SApple OSS Distributions 
2786*a1e26a70SApple OSS Distributions 	if (strlen(conclave_id) > MAXCONCLAVENAME - 1) {
2787*a1e26a70SApple OSS Distributions 		return ERANGE;
2788*a1e26a70SApple OSS Distributions 	}
2789*a1e26a70SApple OSS Distributions 
2790*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2791*a1e26a70SApple OSS Distributions 	if (psattr->psa_conclave_id == NULL) {
2792*a1e26a70SApple OSS Distributions 		void *buf = malloc(MAXCONCLAVENAME);
2793*a1e26a70SApple OSS Distributions 		if (buf == NULL) {
2794*a1e26a70SApple OSS Distributions 			return ENOMEM;
2795*a1e26a70SApple OSS Distributions 		}
2796*a1e26a70SApple OSS Distributions 		psattr->psa_conclave_id = buf;
2797*a1e26a70SApple OSS Distributions 	}
2798*a1e26a70SApple OSS Distributions 	strlcpy(psattr->psa_conclave_id, conclave_id, MAXCONCLAVENAME);
2799*a1e26a70SApple OSS Distributions 	return 0;
2800*a1e26a70SApple OSS Distributions }
2801*a1e26a70SApple OSS Distributions 
2802*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_portlimits_ext(posix_spawnattr_t * __restrict attr,uint32_t port_soft_limit,uint32_t port_hard_limit)2803*a1e26a70SApple OSS Distributions posix_spawnattr_set_portlimits_ext(posix_spawnattr_t * __restrict attr,
2804*a1e26a70SApple OSS Distributions     uint32_t port_soft_limit, uint32_t port_hard_limit)
2805*a1e26a70SApple OSS Distributions {
2806*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2807*a1e26a70SApple OSS Distributions 
2808*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2809*a1e26a70SApple OSS Distributions 		return EINVAL;
2810*a1e26a70SApple OSS Distributions 	}
2811*a1e26a70SApple OSS Distributions 
2812*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2813*a1e26a70SApple OSS Distributions 
2814*a1e26a70SApple OSS Distributions 	psattr->psa_port_soft_limit = port_soft_limit;
2815*a1e26a70SApple OSS Distributions 	psattr->psa_port_hard_limit = port_hard_limit;
2816*a1e26a70SApple OSS Distributions 
2817*a1e26a70SApple OSS Distributions 	return 0;
2818*a1e26a70SApple OSS Distributions }
2819*a1e26a70SApple OSS Distributions 
2820*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_filedesclimit_ext(posix_spawnattr_t * __restrict attr,uint32_t filedesc_soft_limit,uint32_t filedesc_hard_limit)2821*a1e26a70SApple OSS Distributions posix_spawnattr_set_filedesclimit_ext(posix_spawnattr_t * __restrict attr,
2822*a1e26a70SApple OSS Distributions     uint32_t filedesc_soft_limit, uint32_t filedesc_hard_limit)
2823*a1e26a70SApple OSS Distributions {
2824*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2825*a1e26a70SApple OSS Distributions 
2826*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2827*a1e26a70SApple OSS Distributions 		return EINVAL;
2828*a1e26a70SApple OSS Distributions 	}
2829*a1e26a70SApple OSS Distributions 
2830*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2831*a1e26a70SApple OSS Distributions 
2832*a1e26a70SApple OSS Distributions 	psattr->psa_filedesc_soft_limit = filedesc_soft_limit;
2833*a1e26a70SApple OSS Distributions 	psattr->psa_filedesc_hard_limit = filedesc_hard_limit;
2834*a1e26a70SApple OSS Distributions 
2835*a1e26a70SApple OSS Distributions 	return 0;
2836*a1e26a70SApple OSS Distributions }
2837*a1e26a70SApple OSS Distributions 
2838*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_kqworklooplimit_ext(posix_spawnattr_t * __restrict attr,uint32_t kqworkloop_soft_limit,uint32_t kqworkloop_hard_limit)2839*a1e26a70SApple OSS Distributions posix_spawnattr_set_kqworklooplimit_ext(posix_spawnattr_t * __restrict attr,
2840*a1e26a70SApple OSS Distributions     uint32_t kqworkloop_soft_limit, uint32_t kqworkloop_hard_limit)
2841*a1e26a70SApple OSS Distributions {
2842*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2843*a1e26a70SApple OSS Distributions 
2844*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2845*a1e26a70SApple OSS Distributions 		return EINVAL;
2846*a1e26a70SApple OSS Distributions 	}
2847*a1e26a70SApple OSS Distributions 
2848*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2849*a1e26a70SApple OSS Distributions 
2850*a1e26a70SApple OSS Distributions 	psattr->psa_kqworkloop_soft_limit = kqworkloop_soft_limit;
2851*a1e26a70SApple OSS Distributions 	psattr->psa_kqworkloop_hard_limit = kqworkloop_hard_limit;
2852*a1e26a70SApple OSS Distributions 
2853*a1e26a70SApple OSS Distributions 	return 0;
2854*a1e26a70SApple OSS Distributions }
2855*a1e26a70SApple OSS Distributions 
2856*a1e26a70SApple OSS Distributions /*
2857*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_jetsam_ttr_np
2858*a1e26a70SApple OSS Distributions  *
2859*a1e26a70SApple OSS Distributions  * Description: Pass data regarding recent relaunch behavior when jetsammed for the process.
2860*a1e26a70SApple OSS Distributions  *              The recent history is effectively converted into a histogram and the highest
2861*a1e26a70SApple OSS Distributions  *              frequency bucket defines the "type" of the process. The type is passed along
2862*a1e26a70SApple OSS Distributions  *              to the jetsam code as part of psa_jetsam_flags.
2863*a1e26a70SApple OSS Distributions  *
2864*a1e26a70SApple OSS Distributions  * Parameters:	count           Number of entries in the ttrs_millis array
2865*a1e26a70SApple OSS Distributions  *              ttrs_millis     Array of raw data for relaunch behavior
2866*a1e26a70SApple OSS Distributions  *
2867*a1e26a70SApple OSS Distributions  * Returns:     0       Success
2868*a1e26a70SApple OSS Distributions  *              EINVAL  Bad attr pointer or empty data array
2869*a1e26a70SApple OSS Distributions  */
2870*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_jetsam_ttr_np(const posix_spawnattr_t * __restrict attr,uint32_t count,uint32_t * ttrs_millis)2871*a1e26a70SApple OSS Distributions posix_spawnattr_set_jetsam_ttr_np(const posix_spawnattr_t * __restrict attr, uint32_t count, uint32_t *ttrs_millis)
2872*a1e26a70SApple OSS Distributions {
2873*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2874*a1e26a70SApple OSS Distributions 
2875*a1e26a70SApple OSS Distributions 	/*
2876*a1e26a70SApple OSS Distributions 	 * Define the bucketizing policy which would be used to generate the histogram. These
2877*a1e26a70SApple OSS Distributions 	 * values are based on looking at data from various Avg. Joanna runs.
2878*a1e26a70SApple OSS Distributions 	 */
2879*a1e26a70SApple OSS Distributions 	static const uint32_t relaunch_buckets_msecs[POSIX_SPAWN_JETSAM_RELAUNCH_BEHAVIOR_BUCKETS] = {
2880*a1e26a70SApple OSS Distributions 		5000,
2881*a1e26a70SApple OSS Distributions 		10000,
2882*a1e26a70SApple OSS Distributions 		UINT32_MAX
2883*a1e26a70SApple OSS Distributions 	};
2884*a1e26a70SApple OSS Distributions 	static const uint32_t relaunch_jetsam_flags[POSIX_SPAWN_JETSAM_RELAUNCH_BEHAVIOR_BUCKETS] = {
2885*a1e26a70SApple OSS Distributions 		POSIX_SPAWN_JETSAM_RELAUNCH_BEHAVIOR_HIGH,
2886*a1e26a70SApple OSS Distributions 		POSIX_SPAWN_JETSAM_RELAUNCH_BEHAVIOR_MED,
2887*a1e26a70SApple OSS Distributions 		POSIX_SPAWN_JETSAM_RELAUNCH_BEHAVIOR_LOW
2888*a1e26a70SApple OSS Distributions 	};
2889*a1e26a70SApple OSS Distributions 
2890*a1e26a70SApple OSS Distributions 	/* Make sure the attr pointer is valid */
2891*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2892*a1e26a70SApple OSS Distributions 		return EINVAL;
2893*a1e26a70SApple OSS Distributions 	}
2894*a1e26a70SApple OSS Distributions 
2895*a1e26a70SApple OSS Distributions 	/* Make sure the count of entries is non-zero */
2896*a1e26a70SApple OSS Distributions 	if (count == 0) {
2897*a1e26a70SApple OSS Distributions 		return EINVAL;
2898*a1e26a70SApple OSS Distributions 	}
2899*a1e26a70SApple OSS Distributions 
2900*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2901*a1e26a70SApple OSS Distributions 
2902*a1e26a70SApple OSS Distributions 	/* Generate a histogram based on the relaunch data while maintaining highest frequency bucket info */
2903*a1e26a70SApple OSS Distributions 	int relaunch_histogram[POSIX_SPAWN_JETSAM_RELAUNCH_BEHAVIOR_BUCKETS] = {0};
2904*a1e26a70SApple OSS Distributions 	int max_frequency = -1;
2905*a1e26a70SApple OSS Distributions 	int highest_frequency_bucket = -1;
2906*a1e26a70SApple OSS Distributions 
2907*a1e26a70SApple OSS Distributions 	for (uint32_t i = 0; i < count; i++) {
2908*a1e26a70SApple OSS Distributions 		/* For each data point passed in via launchd, find the bucket it lands in */
2909*a1e26a70SApple OSS Distributions 		for (uint32_t bucket = 0; bucket < POSIX_SPAWN_JETSAM_RELAUNCH_BEHAVIOR_BUCKETS; bucket++) {
2910*a1e26a70SApple OSS Distributions 			if (ttrs_millis[i] <= relaunch_buckets_msecs[bucket]) {
2911*a1e26a70SApple OSS Distributions 				relaunch_histogram[bucket]++;
2912*a1e26a70SApple OSS Distributions 
2913*a1e26a70SApple OSS Distributions 				/* Check if the bucket is the highest frequency bucket now */
2914*a1e26a70SApple OSS Distributions 				if (relaunch_histogram[bucket] > max_frequency) {
2915*a1e26a70SApple OSS Distributions 					max_frequency = relaunch_histogram[bucket];
2916*a1e26a70SApple OSS Distributions 					highest_frequency_bucket = bucket;
2917*a1e26a70SApple OSS Distributions 				}
2918*a1e26a70SApple OSS Distributions 				break;
2919*a1e26a70SApple OSS Distributions 			}
2920*a1e26a70SApple OSS Distributions 		}
2921*a1e26a70SApple OSS Distributions 	}
2922*a1e26a70SApple OSS Distributions 	psattr->psa_jetsam_flags |= relaunch_jetsam_flags[highest_frequency_bucket];
2923*a1e26a70SApple OSS Distributions 	return 0;
2924*a1e26a70SApple OSS Distributions }
2925*a1e26a70SApple OSS Distributions 
2926*a1e26a70SApple OSS Distributions /*
2927*a1e26a70SApple OSS Distributions  * posix_spawnattr_set_launch_type_np
2928*a1e26a70SApple OSS Distributions  * Description: sets the launch type in posix_spawnattr_t attr
2929*a1e26a70SApple OSS Distributions  */
2930*a1e26a70SApple OSS Distributions int
posix_spawnattr_set_launch_type_np(posix_spawnattr_t * attr,uint8_t launch_type)2931*a1e26a70SApple OSS Distributions posix_spawnattr_set_launch_type_np(posix_spawnattr_t *attr, uint8_t launch_type)
2932*a1e26a70SApple OSS Distributions {
2933*a1e26a70SApple OSS Distributions 	_posix_spawnattr_t psattr;
2934*a1e26a70SApple OSS Distributions 
2935*a1e26a70SApple OSS Distributions 	if (attr == NULL || *attr == NULL) {
2936*a1e26a70SApple OSS Distributions 		return EINVAL;
2937*a1e26a70SApple OSS Distributions 	}
2938*a1e26a70SApple OSS Distributions 
2939*a1e26a70SApple OSS Distributions 	psattr = *(_posix_spawnattr_t *)attr;
2940*a1e26a70SApple OSS Distributions 	psattr->psa_launch_type = launch_type;
2941*a1e26a70SApple OSS Distributions 
2942*a1e26a70SApple OSS Distributions 	return 0;
2943*a1e26a70SApple OSS Distributions }
2944*a1e26a70SApple OSS Distributions 
2945*a1e26a70SApple OSS Distributions /*
2946*a1e26a70SApple OSS Distributions  * posix_spawn
2947*a1e26a70SApple OSS Distributions  *
2948*a1e26a70SApple OSS Distributions  * Description:	Create a new process from the process image corresponding to
2949*a1e26a70SApple OSS Distributions  *		the supplied 'path' argument.
2950*a1e26a70SApple OSS Distributions  *
2951*a1e26a70SApple OSS Distributions  * Parameters:	pid				Pointer to pid_t to receive the
2952*a1e26a70SApple OSS Distributions  *						PID of the spawned process, if
2953*a1e26a70SApple OSS Distributions  *						successful and 'pid' != NULL
2954*a1e26a70SApple OSS Distributions  *		path				Path of image file to spawn
2955*a1e26a70SApple OSS Distributions  *		file_actions			spawn file actions object which
2956*a1e26a70SApple OSS Distributions  *						describes file actions to be
2957*a1e26a70SApple OSS Distributions  *						performed during the spawn
2958*a1e26a70SApple OSS Distributions  *		attrp				spawn attributes object which
2959*a1e26a70SApple OSS Distributions  *						describes attributes to be
2960*a1e26a70SApple OSS Distributions  *						applied during the spawn
2961*a1e26a70SApple OSS Distributions  *		argv				argument vector array; NULL
2962*a1e26a70SApple OSS Distributions  *						terminated
2963*a1e26a70SApple OSS Distributions  *		envp				environment vector array; NULL
2964*a1e26a70SApple OSS Distributions  *						terminated
2965*a1e26a70SApple OSS Distributions  *
2966*a1e26a70SApple OSS Distributions  * Returns:	0				Success
2967*a1e26a70SApple OSS Distributions  *		!0				An errno value indicating the
2968*a1e26a70SApple OSS Distributions  *						cause of the failure to spawn
2969*a1e26a70SApple OSS Distributions  *
2970*a1e26a70SApple OSS Distributions  * Notes:	Unlike other system calls, the return value of this system
2971*a1e26a70SApple OSS Distributions  *		call is expected to either be a 0 or an errno, rather than a
2972*a1e26a70SApple OSS Distributions  *		0 or a -1, with the 'errno' variable being set.
2973*a1e26a70SApple OSS Distributions  */
2974*a1e26a70SApple OSS Distributions int
posix_spawn(pid_t * __restrict pid,const char * __restrict path,const posix_spawn_file_actions_t * file_actions,const posix_spawnattr_t * __restrict attrp,char * const argv[__restrict],char * const envp[__restrict])2975*a1e26a70SApple OSS Distributions posix_spawn(pid_t * __restrict pid, const char * __restrict path,
2976*a1e26a70SApple OSS Distributions     const posix_spawn_file_actions_t *file_actions,
2977*a1e26a70SApple OSS Distributions     const posix_spawnattr_t * __restrict attrp,
2978*a1e26a70SApple OSS Distributions     char *const argv[__restrict], char *const envp[__restrict])
2979*a1e26a70SApple OSS Distributions {
2980*a1e26a70SApple OSS Distributions 	int saveerrno = errno;
2981*a1e26a70SApple OSS Distributions 	int ret = 0;
2982*a1e26a70SApple OSS Distributions 	struct _posix_spawn_args_desc ad;
2983*a1e26a70SApple OSS Distributions 	struct _posix_spawn_args_desc *adp = NULL;
2984*a1e26a70SApple OSS Distributions 	/*
2985*a1e26a70SApple OSS Distributions 	 * Only do extra work if we have file actions or attributes to push
2986*a1e26a70SApple OSS Distributions 	 * down.  We use a descriptor to push this information down, since we
2987*a1e26a70SApple OSS Distributions 	 * want to have size information, which will let us (1) preallocate a
2988*a1e26a70SApple OSS Distributions 	 * single chunk of memory for the copyin(), and (2) allow us to do a
2989*a1e26a70SApple OSS Distributions 	 * single copyin() per attributes or file actions as a monlithic block.
2990*a1e26a70SApple OSS Distributions 	 *
2991*a1e26a70SApple OSS Distributions 	 * Note:	A future implementation may attempt to do the same
2992*a1e26a70SApple OSS Distributions 	 *		thing for the argv/envp data, which could potentially
2993*a1e26a70SApple OSS Distributions 	 *		result in a performance improvement due to increased
2994*a1e26a70SApple OSS Distributions 	 *		kernel efficiency, even though it would mean copying
2995*a1e26a70SApple OSS Distributions 	 *		the data in user space.
2996*a1e26a70SApple OSS Distributions 	 */
2997*a1e26a70SApple OSS Distributions 	if ((file_actions != NULL && (*file_actions != NULL) && (*(_posix_spawn_file_actions_t *)file_actions)->psfa_act_count > 0) || attrp != NULL) {
2998*a1e26a70SApple OSS Distributions 		memset(&ad, 0, sizeof(ad));
2999*a1e26a70SApple OSS Distributions 		adp = &ad;
3000*a1e26a70SApple OSS Distributions 		if (attrp != NULL && *attrp != NULL) {
3001*a1e26a70SApple OSS Distributions 			_posix_spawnattr_t psattr = *(_posix_spawnattr_t *)attrp;
3002*a1e26a70SApple OSS Distributions 			ad.attr_size = sizeof(struct _posix_spawnattr);
3003*a1e26a70SApple OSS Distributions 			ad.attrp = psattr;
3004*a1e26a70SApple OSS Distributions 
3005*a1e26a70SApple OSS Distributions 			if (psattr->psa_ports != NULL) {
3006*a1e26a70SApple OSS Distributions 				size_t psact_size = PS_PORT_ACTIONS_SIZE(psattr->psa_ports->pspa_count);
3007*a1e26a70SApple OSS Distributions 				if (psact_size == 0 && psattr->psa_ports->pspa_count != 0) {
3008*a1e26a70SApple OSS Distributions 					errno = EINVAL;
3009*a1e26a70SApple OSS Distributions 					ret = -1;
3010*a1e26a70SApple OSS Distributions 					goto out;
3011*a1e26a70SApple OSS Distributions 				}
3012*a1e26a70SApple OSS Distributions 				ad.port_actions = psattr->psa_ports;
3013*a1e26a70SApple OSS Distributions 				ad.port_actions_size = psact_size;
3014*a1e26a70SApple OSS Distributions 			}
3015*a1e26a70SApple OSS Distributions 			if (psattr->psa_mac_extensions != NULL) {
3016*a1e26a70SApple OSS Distributions 				size_t macext_size = PS_MAC_EXTENSIONS_SIZE(psattr->psa_mac_extensions->psmx_count);
3017*a1e26a70SApple OSS Distributions 				if (macext_size == 0 && psattr->psa_mac_extensions->psmx_count != 0) {
3018*a1e26a70SApple OSS Distributions 					errno = EINVAL;
3019*a1e26a70SApple OSS Distributions 					ret = -1;
3020*a1e26a70SApple OSS Distributions 					goto out;
3021*a1e26a70SApple OSS Distributions 				}
3022*a1e26a70SApple OSS Distributions 				ad.mac_extensions = psattr->psa_mac_extensions;
3023*a1e26a70SApple OSS Distributions 				ad.mac_extensions_size = macext_size;
3024*a1e26a70SApple OSS Distributions 			}
3025*a1e26a70SApple OSS Distributions 			if (psattr->psa_coalition_info != NULL) {
3026*a1e26a70SApple OSS Distributions 				ad.coal_info_size = sizeof(struct _posix_spawn_coalition_info);
3027*a1e26a70SApple OSS Distributions 				ad.coal_info = psattr->psa_coalition_info;
3028*a1e26a70SApple OSS Distributions 			}
3029*a1e26a70SApple OSS Distributions 			if (psattr->psa_persona_info != NULL) {
3030*a1e26a70SApple OSS Distributions 				ad.persona_info_size = sizeof(struct _posix_spawn_persona_info);
3031*a1e26a70SApple OSS Distributions 				ad.persona_info = psattr->psa_persona_info;
3032*a1e26a70SApple OSS Distributions 			}
3033*a1e26a70SApple OSS Distributions 			if (psattr->psa_posix_cred_info != NULL) {
3034*a1e26a70SApple OSS Distributions 				ad.posix_cred_info_size = sizeof(struct _posix_spawn_posix_cred_info);
3035*a1e26a70SApple OSS Distributions 				ad.posix_cred_info = psattr->psa_posix_cred_info;
3036*a1e26a70SApple OSS Distributions 			}
3037*a1e26a70SApple OSS Distributions 			if (psattr->psa_subsystem_root_path != NULL) {
3038*a1e26a70SApple OSS Distributions 				ad.subsystem_root_path_size = MAXPATHLEN;
3039*a1e26a70SApple OSS Distributions 				ad.subsystem_root_path = psattr->psa_subsystem_root_path;
3040*a1e26a70SApple OSS Distributions 			}
3041*a1e26a70SApple OSS Distributions 			if (psattr->psa_conclave_id != NULL) {
3042*a1e26a70SApple OSS Distributions 				ad.conclave_id_size = MAXCONCLAVENAME;
3043*a1e26a70SApple OSS Distributions 				ad.conclave_id = psattr->psa_conclave_id;
3044*a1e26a70SApple OSS Distributions 			}
3045*a1e26a70SApple OSS Distributions 		}
3046*a1e26a70SApple OSS Distributions 		if (file_actions != NULL && *file_actions != NULL) {
3047*a1e26a70SApple OSS Distributions 			_posix_spawn_file_actions_t psactsp =
3048*a1e26a70SApple OSS Distributions 			    *(_posix_spawn_file_actions_t *)file_actions;
3049*a1e26a70SApple OSS Distributions 
3050*a1e26a70SApple OSS Distributions 			if (psactsp->psfa_act_count > 0) {
3051*a1e26a70SApple OSS Distributions 				size_t fa_size = PSF_ACTIONS_SIZE(psactsp->psfa_act_count);
3052*a1e26a70SApple OSS Distributions 				if (fa_size == 0 && psactsp->psfa_act_count != 0) {
3053*a1e26a70SApple OSS Distributions 					errno = EINVAL;
3054*a1e26a70SApple OSS Distributions 					ret = -1;
3055*a1e26a70SApple OSS Distributions 					goto out;
3056*a1e26a70SApple OSS Distributions 				}
3057*a1e26a70SApple OSS Distributions 				ad.file_actions_size = fa_size;
3058*a1e26a70SApple OSS Distributions 				ad.file_actions = psactsp;
3059*a1e26a70SApple OSS Distributions 			}
3060*a1e26a70SApple OSS Distributions 		}
3061*a1e26a70SApple OSS Distributions 	}
3062*a1e26a70SApple OSS Distributions 
3063*a1e26a70SApple OSS Distributions 	if (!posix_spawn_with_filter ||
3064*a1e26a70SApple OSS Distributions 	    !posix_spawn_with_filter(pid, path, argv, envp, adp, &ret)) {
3065*a1e26a70SApple OSS Distributions 		ret = __posix_spawn(pid, path, adp, argv, envp);
3066*a1e26a70SApple OSS Distributions 	}
3067*a1e26a70SApple OSS Distributions 
3068*a1e26a70SApple OSS Distributions out:
3069*a1e26a70SApple OSS Distributions 	if (ret < 0) {
3070*a1e26a70SApple OSS Distributions 		ret = errno;
3071*a1e26a70SApple OSS Distributions 	}
3072*a1e26a70SApple OSS Distributions 	errno = saveerrno;
3073*a1e26a70SApple OSS Distributions 	return ret;
3074*a1e26a70SApple OSS Distributions }
3075*a1e26a70SApple OSS Distributions 
3076*a1e26a70SApple OSS Distributions int
execve(const char * fname,char * const * argp,char * const * envp)3077*a1e26a70SApple OSS Distributions execve(const char *fname, char * const *argp, char * const *envp)
3078*a1e26a70SApple OSS Distributions {
3079*a1e26a70SApple OSS Distributions 	int ret;
3080*a1e26a70SApple OSS Distributions 	if (execve_with_filter) {
3081*a1e26a70SApple OSS Distributions 		/* Noinline slow path to avoid a large stack frame in the common case */
3082*a1e26a70SApple OSS Distributions 		return execve_with_filter(fname, argp, envp);
3083*a1e26a70SApple OSS Distributions 	}
3084*a1e26a70SApple OSS Distributions 
3085*a1e26a70SApple OSS Distributions 	ret = __execve(fname, argp, envp);
3086*a1e26a70SApple OSS Distributions 	return ret;
3087*a1e26a70SApple OSS Distributions }
3088