xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/libdruntime/core/sys/posix/spawn.d (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
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