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