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