1 /**
2 * D header file for spawn.h.
3 *
4 * Copyright: Copyright (C) 2018 by The D Language Foundation, All Rights Reserved
5 * Authors: Petar Kirov
6 * License: $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7 * Source: $(LINK2 https://github.com/dlang/druntime/blob/master/src/core/sys/posix/spawn.d, _spawn.d)
8 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
9 */
10 module core.sys.posix.spawn;
11
12 /*
13 Based on the following system headers:
14
15 Glibc: https://sourceware.org/git/?p=glibc.git;a=blob;f=posix/spawn.h;hb=HEAD
16
17 Bionic libc: https://android.googlesource.com/platform/bionic.git/+/master/libc/include/spawn.h
18
19 Musl libc: https://git.musl-libc.org/cgit/musl/tree/include/spawn.h
20
21 uClibc: https://git.uclibc.org/uClibc/tree/include/spawn.h
22
23 Darwin XNU:
24 https://opensource.apple.com/source/xnu/xnu-4570.71.2/libsyscall/wrappers/spawn/spawn.h.auto.html
25 https://opensource.apple.com/source/xnu/xnu-4570.71.2/bsd/sys/spawn.h.auto.html
26 https://github.com/opensource-apple/xnu (GitHub mirror)
27
28 FreeBSD: https://github.com/freebsd/freebsd/blob/master/include/spawn.h
29
30 NetBSD: https://github.com/NetBSD/src/blob/trunk/sys/sys/spawn.h
31
32 OpenBSD: https://github.com/openbsd/src/blob/master/include/spawn.h
33
34 DragonFlyBSD: https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/include/spawn.h
35
36 Solaris: https://github.com/illumos/illumos-gate/blob/master/usr/src/head/spawn.h
37 */
38
39 version (OSX) // macOS and iOS only as this API is prohibited on WatchOS and TVOS
40 version = Darwin;
41 else version (iOS)
42 version = Darwin;
43
44 version (Posix):
45 public import core.sys.posix.sys.types : mode_t, pid_t;
46 public import core.sys.posix.signal : sigset_t;
47 public import core.sys.posix.sched : sched_param;
48
49 extern(C):
50 @nogc:
51 nothrow:
52
53 int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t*, int);
54 int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t*, int, int);
55 int posix_spawn_file_actions_addopen(posix_spawn_file_actions_t*, int, const char*, int, mode_t);
56 int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t*);
57 int posix_spawn_file_actions_init(posix_spawn_file_actions_t*);
58 int posix_spawnattr_destroy(posix_spawnattr_t*);
59 int posix_spawnattr_getflags(const posix_spawnattr_t*, short*);
60 int posix_spawnattr_getpgroup(const posix_spawnattr_t*, pid_t*);
61
version(Darwin)62 version (Darwin)
63 { } // Not supported
64 else
65 {
66 int posix_spawnattr_getschedparam(const posix_spawnattr_t*, sched_param*);
67 int posix_spawnattr_getschedpolicy(const posix_spawnattr_t*, int*);
68 int posix_spawnattr_setschedparam(posix_spawnattr_t*, const sched_param*);
69 int posix_spawnattr_setschedpolicy(posix_spawnattr_t*, int);
70 }
71
72 int posix_spawnattr_getsigdefault(const posix_spawnattr_t*, sigset_t*);
73 int posix_spawnattr_getsigmask(const posix_spawnattr_t*, sigset_t*);
74 int posix_spawnattr_init(posix_spawnattr_t*);
75 int posix_spawnattr_setflags(posix_spawnattr_t*, short);
76 int posix_spawnattr_setpgroup(posix_spawnattr_t*, pid_t);
77 int posix_spawnattr_setsigdefault(posix_spawnattr_t*, const sigset_t*);
78 int posix_spawnattr_setsigmask(posix_spawnattr_t*, const sigset_t*);
79 int posix_spawn(pid_t*pid, const char* path,
80 const posix_spawn_file_actions_t* file_actions,
81 const posix_spawnattr_t* attrp,
82 const char** argv, const char** envp);
83 int posix_spawnp(pid_t* pid, const char* file,
84 const posix_spawn_file_actions_t* file_actions,
85 const posix_spawnattr_t* attrp,
86 const char** argv, const char** envp);
87
version(linux)88 version (linux)
89 {
90 version (CRuntime_Glibc)
91 {
92 // Source: https://sourceware.org/git/?p=glibc.git;a=blob;f=posix/spawn.h;hb=HEAD
93 enum
94 {
95 POSIX_SPAWN_RESETIDS = 0x01,
96 POSIX_SPAWN_SETPGROUP = 0x02,
97 POSIX_SPAWN_SETSIGDEF = 0x04,
98 POSIX_SPAWN_SETSIGMASK = 0x08,
99 POSIX_SPAWN_SETSCHEDPARAM = 0x10,
100 POSIX_SPAWN_SETSCHEDULER = 0x20
101 }
102 import core.sys.posix.config : __USE_GNU;
103 static if (__USE_GNU)
104 {
105 enum
106 {
107 POSIX_SPAWN_USEVFORK = 0x40,
108 POSIX_SPAWN_SETSID = 0x80
109 }
110 }
111 struct posix_spawnattr_t
112 {
113 short __flags;
114 pid_t __pgrp;
115 sigset_t __sd;
116 sigset_t __ss;
117 sched_param __sp;
118 int __policy;
119 int[16] __pad;
120 }
121 struct __spawn_action;
122 struct posix_spawn_file_actions_t
123 {
124 int __allocated;
125 int __used;
126 __spawn_action* __actions;
127 int[16] __pad;
128 }
129 }
130 else version (CRuntime_Bionic)
131 {
132 // Source: https://android.googlesource.com/platform/bionic.git/+/master/libc/include/spawn.h
133 enum
134 {
135 POSIX_SPAWN_RESETIDS = 1,
136 POSIX_SPAWN_SETPGROUP = 2,
137 POSIX_SPAWN_SETSIGDEF = 4,
138 POSIX_SPAWN_SETSIGMASK = 8,
139 POSIX_SPAWN_SETSCHEDPARAM = 16,
140 POSIX_SPAWN_SETSCHEDULER = 32
141 }
142 import core.sys.posix.config : __USE_GNU;
143 static if (__USE_GNU)
144 {
145 enum
146 {
147 POSIX_SPAWN_USEVFORK = 64,
148 POSIX_SPAWN_SETSID = 128
149 }
150 }
151 alias posix_spawnattr_t = __posix_spawnattr*;
152 alias posix_spawn_file_actions_t = __posix_spawn_file_actions*;
153 struct __posix_spawnattr;
154 struct __posix_spawn_file_actions;
155 }
156 else version (CRuntime_Musl)
157 {
158 // Source: https://git.musl-libc.org/cgit/musl/tree/include/spawn.h
159 enum
160 {
161 POSIX_SPAWN_RESETIDS = 1,
162 POSIX_SPAWN_SETPGROUP = 2,
163 POSIX_SPAWN_SETSIGDEF = 4,
164 POSIX_SPAWN_SETSIGMASK = 8,
165 POSIX_SPAWN_SETSCHEDPARAM = 16,
166 POSIX_SPAWN_SETSCHEDULER = 32,
167 POSIX_SPAWN_USEVFORK = 64,
168 POSIX_SPAWN_SETSID = 128
169 }
170 struct posix_spawnattr_t
171 {
172 int __flags;
173 pid_t __pgrp;
174 sigset_t __def, __mask;
175 int __prio, __pol;
176 void* __fn;
177 char[64 - (void*).sizeof] __pad = void;
178 }
179 struct posix_spawn_file_actions_t
180 {
181 int[2] __pad0;
182 void* __actions;
183 int[16] __pad;
184 }
185 }
186 else version (CRuntime_UClibc)
187 {
188 // Source: https://git.uclibc.org/uClibc/tree/include/spawn.h
189 enum
190 {
191 POSIX_SPAWN_RESETIDS = 0x01,
192 POSIX_SPAWN_SETPGROUP = 0x02,
193 POSIX_SPAWN_SETSIGDEF = 0x04,
194 POSIX_SPAWN_SETSIGMASK = 0x08,
195 POSIX_SPAWN_SETSCHEDPARAM = 0x10,
196 POSIX_SPAWN_SETSCHEDULER = 0x20
197 }
198 import core.sys.posix.config : __USE_GNU;
199 static if (__USE_GNU)
200 {
201 enum
202 {
203 POSIX_SPAWN_USEVFORK = 0x40,
204 }
205 }
206 struct posix_spawnattr_t
207 {
208 short __flags;
209 pid_t __pgrp;
210 sigset_t __sd;
211 sigset_t __ss;
212 sched_param __sp;
213 int __policy;
214 int[16] __pad;
215 }
216 struct __spawn_action;
217 struct posix_spawn_file_actions_t
218 {
219 int __allocated;
220 int __used;
221 __spawn_action* __actions;
222 int[16] __pad;
223 }
224 }
225 else
226 static assert(0, "Unsupported Linux libc");
227 }
228 else version (Darwin)
229 {
230 // Sources:
231 // https://opensource.apple.com/source/xnu/xnu-4570.71.2/libsyscall/wrappers/spawn/spawn.h.auto.html
232 // https://opensource.apple.com/source/xnu/xnu-4570.71.2/bsd/sys/spawn.h.auto.html
233 enum
234 {
235 POSIX_SPAWN_RESETIDS = 0x01,
236 POSIX_SPAWN_SETPGROUP = 0x02,
237 POSIX_SPAWN_SETSIGDEF = 0x04,
238 POSIX_SPAWN_SETSIGMASK = 0x08,
239 // POSIX_SPAWN_SETSCHEDPARAM = 0x10, // not supported
240 // POSIX_SPAWN_SETSCHEDULER = 0x20, // ditto
241 POSIX_SPAWN_SETEXEC = 0x40,
242 POSIX_SPAWN_START_SUSPENDED = 0x80,
243 POSIX_SPAWN_CLOEXEC_DEFAULT = 0x4000
244 }
245 alias posix_spawnattr_t = void*;
246 alias posix_spawn_file_actions_t = void*;
247 }
248 else version (FreeBSD)
249 {
250 // Source: https://github.com/freebsd/freebsd/blob/master/include/spawn.h
251 enum
252 {
253 POSIX_SPAWN_RESETIDS = 0x01,
254 POSIX_SPAWN_SETPGROUP = 0x02,
255 POSIX_SPAWN_SETSCHEDPARAM = 0x04,
256 POSIX_SPAWN_SETSCHEDULER = 0x08,
257 POSIX_SPAWN_SETSIGDEF = 0x10,
258 POSIX_SPAWN_SETSIGMASK = 0x20
259 }
260 alias posix_spawnattr_t = void*;
261 alias posix_spawn_file_actions_t = void*;
262 }
263 else version (NetBSD)
264 {
265 // Source: https://github.com/NetBSD/src/blob/trunk/sys/sys/spawn.h
266 enum
267 {
268 POSIX_SPAWN_RESETIDS = 0x01,
269 POSIX_SPAWN_SETPGROUP = 0x02,
270 POSIX_SPAWN_SETSCHEDPARAM = 0x04,
271 POSIX_SPAWN_SETSCHEDULER = 0x08,
272 POSIX_SPAWN_SETSIGDEF = 0x10,
273 POSIX_SPAWN_SETSIGMASK = 0x20,
274 POSIX_SPAWN_RETURNERROR = 0x40 // NetBSD specific
275 }
276 struct posix_spawnattr
277 {
278 short sa_flags;
279 pid_t sa_pgroup;
280 sched_param sa_schedparam;
281 int sa_schedpolicy;
282 sigset_t sa_sigdefault;
283 sigset_t sa_sigmask;
284 }
285 struct posix_spawn_file_actions_entry_t;
286 struct posix_spawn_file_actions
287 {
288 uint size;
289 uint len;
290 posix_spawn_file_actions_entry_t* fae;
291 }
292 alias posix_spawnattr_t = posix_spawnattr;
293 alias posix_spawn_file_actions_t = posix_spawn_file_actions;
294 }
295 else version (OpenBSD)
296 {
297 // Source: https://github.com/openbsd/src/blob/master/include/spawn.h
298 enum
299 {
300 POSIX_SPAWN_RESETIDS = 0x01,
301 POSIX_SPAWN_SETPGROUP = 0x02,
302 POSIX_SPAWN_SETSCHEDPARAM = 0x04,
303 POSIX_SPAWN_SETSCHEDULER = 0x08,
304 POSIX_SPAWN_SETSIGDEF = 0x10,
305 POSIX_SPAWN_SETSIGMASK = 0x20
306 }
307 alias posix_spawnattr_t = __posix_spawnattr*;
308 alias posix_spawn_file_actions_t = __posix_spawn_file_actions*;
309 struct __posix_spawnattr;
310 struct __posix_spawn_file_actions;
311 }
312 else version (DragonFlyBSD)
313 {
314 // Source: https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/include/spawn.h
315 enum
316 {
317 POSIX_SPAWN_RESETIDS = 0x01,
318 POSIX_SPAWN_SETPGROUP = 0x02,
319 POSIX_SPAWN_SETSCHEDPARAM = 0x04,
320 POSIX_SPAWN_SETSCHEDULER = 0x08,
321 POSIX_SPAWN_SETSIGDEF = 0x10,
322 POSIX_SPAWN_SETSIGMASK = 0x20
323 }
324 alias posix_spawnattr_t = __posix_spawnattr*;
325 alias posix_spawn_file_actions_t = __posix_spawn_file_actions*;
326 struct __posix_spawnattr;
327 struct __posix_spawn_file_actions;
328 }
329 else version (Solaris)
330 {
331 // Source: https://github.com/illumos/illumos-gate/blob/master/usr/src/head/spawn.h
332 enum
333 {
334 POSIX_SPAWN_RESETIDS = 0x01,
335 POSIX_SPAWN_SETPGROUP = 0x02,
336 POSIX_SPAWN_SETSIGDEF = 0x04,
337 POSIX_SPAWN_SETSIGMASK = 0x08,
338 POSIX_SPAWN_SETSCHEDPARAM = 0x10,
339 POSIX_SPAWN_SETSCHEDULER = 0x20,
340 }
341 version (none)
342 {
343 // Non-portable Solaris extensions.
344 enum
345 {
346 POSIX_SPAWN_SETSIGIGN_NP = 0x0800,
347 POSIX_SPAWN_NOSIGCHLD_NP = 0x1000,
348 POSIX_SPAWN_WAITPID_NP = 0x2000,
349 POSIX_SPAWN_NOEXECERR_NP = 0x4000,
350 }
351 }
352 struct posix_spawnattr_t
353 {
354 void* __spawn_attrp;
355 }
356 struct posix_spawn_file_actions_t
357 {
358 void* __file_attrp;
359 }
360 version (none)
361 {
362 // Non-portable Solaris extensions.
363 alias boolean_t = int;
364 int posix_spawn_file_actions_addclosefrom_np(posix_spawn_file_actions_t* file_actions,
365 int lowfiledes);
366 int posix_spawn_pipe_np(pid_t* pidp, int* fdp, const char* cmd, boolean_t write,
367 posix_spawn_file_actions_t* fact,
368 posix_spawnattr_t* attr);
369 int posix_spawnattr_getsigignore_np(const posix_spawnattr_t* attr, sigset_t* sigignore);
370 int posix_spawnattr_setsigignore_np(posix_spawnattr_t* attr, const sigset_t* sigignore);
371 }
372 }
373 else
374 static assert(0, "Unsupported OS");
375