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