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