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