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