xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/libdruntime/core/sys/posix/sys/wait.d (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /**
2  * D header file for POSIX.
3  *
4  * Copyright: Copyright Sean Kelly 2005 - 2009.
5  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6  * Authors:   Sean Kelly, Alex Rønne Petersen
7  * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8  */
9 
10 /*          Copyright Sean Kelly 2005 - 2009.
11  * Distributed under the Boost Software License, Version 1.0.
12  *    (See accompanying file LICENSE or copy at
13  *          http://www.boost.org/LICENSE_1_0.txt)
14  */
15 module core.sys.posix.sys.wait;
16 
17 import core.sys.posix.config;
18 public import core.sys.posix.sys.types; // for id_t, pid_t
19 public import core.sys.posix.signal;    // for siginfo_t (XSI)
20 //public import core.sys.posix.resource; // for rusage (XSI)
21 
22 version (OSX)
23     version = Darwin;
24 else version (iOS)
25     version = Darwin;
26 else version (TVOS)
27     version = Darwin;
28 else version (WatchOS)
29     version = Darwin;
30 
version(Posix)31 version (Posix):
32 extern (C) nothrow @nogc:
33 @system:
34 
35 //
36 // Required
37 //
38 /*
39 WNOHANG
40 WUNTRACED
41 */
42 
43 version (linux)
44 {
45     enum WNOHANG        = 1;
46     enum WUNTRACED      = 2;
47 
48     private
49     {
50         enum __W_CONTINUED = 0xFFFF;
51     }
52 }
version(Darwin)53 else version (Darwin)
54 {
55     enum WNOHANG        = 1;
56     enum WUNTRACED      = 2;
57 
58     private
59     {
60         enum _WSTOPPED = 0x7F; // octal 0177
61     }
62 }
version(FreeBSD)63 else version (FreeBSD)
64 {
65     enum WNOHANG        = 1;
66     enum WUNTRACED      = 2;
67 
68     private
69     {
70         enum _WSTOPPED = 0x7F; // octal 0177
71         enum __W_CONTINUED = 0x13;
72     }
73 }
version(NetBSD)74 else version (NetBSD)
75 {
76     enum WNOHANG        = 1;
77     enum WUNTRACED      = 2;
78 
79     private
80     {
81         enum _WSTOPPED = 0x7F; // octal 0177
82     }
83 }
version(OpenBSD)84 else version (OpenBSD)
85 {
86     enum WNOHANG        = 1;
87     enum WUNTRACED      = 2;
88 
89     private
90     {
91         enum _WSTOPPED   = 0x7F;   // octal 0177
92         enum _WCONTINUED = 0xFFFF; // octal 0177777
93     }
94 }
version(DragonFlyBSD)95 else version (DragonFlyBSD)
96 {
97     enum WNOHANG        = 1;
98     enum WUNTRACED      = 2;
99 
100     private
101     {
102         enum _WSTOPPED = 0x7F; // octal 0177
103     }
104 }
version(Solaris)105 else version (Solaris)
106 {
107     enum WNOHANG        = 64;
108     enum WUNTRACED      = 4;
109 }
110 else
111 {
112     static assert(false, "Unsupported platform");
113 }
114 
115 /*
116 WEXITSTATUS
117 WIFCONTINUED
118 WIFEXITED
119 WIFSIGNALED
120 WIFSTOPPED
121 WSTOPSIG
122 WTERMSIG
123 */
124 
version(CRuntime_Glibc)125 version (CRuntime_Glibc)
126 {
127     @safe pure:
128 
129     private
130     {
131         extern (D) int __WTERMSIG( int status ) { return status & 0x7F; }
132     }
133 
134     //
135     // NOTE: These macros assume __USE_MISC is not defined in the relevant
136     //       C headers as the parameter definition there is different and
137     //       much more complicated.
138     //
139     extern (D) int  WEXITSTATUS( int status )  { return ( status & 0xFF00 ) >> 8;   }
140     extern (D) int  WIFCONTINUED( int status ) { return status == __W_CONTINUED;    }
141     extern (D) bool WIFEXITED( int status )    { return __WTERMSIG( status ) == 0;  }
142     extern (D) bool WIFSIGNALED( int status )
143     {
144         return ( cast(byte) ( ( status & 0x7F ) + 1 ) >> 1 ) > 0;
145     }
146     extern (D) bool WIFSTOPPED( int status )   { return ( status & 0xFF ) == 0x7F;  }
147     extern (D) int  WSTOPSIG( int status )     { return WEXITSTATUS( status );      }
148     extern (D) int  WTERMSIG( int status )     { return status & 0x7F;              }
149 }
version(Darwin)150 else version (Darwin)
151 {
152     @safe pure:
153 
154     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
155     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
156     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
157     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
158     extern (D) bool WIFSIGNALED( int status )
159     {
160         return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
161     }
162     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
163     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
164     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
165 }
version(FreeBSD)166 else version (FreeBSD)
167 {
168     @safe pure:
169 
170     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
171     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
172     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
173     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
174     extern (D) bool WIFSIGNALED( int status )
175     {
176         return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
177     }
178     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
179     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
180     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
181 }
version(NetBSD)182 else version (NetBSD)
183 {
184     @safe pure:
185 
186     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
187     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
188     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
189     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
190     extern (D) bool WIFSIGNALED( int status )
191     {
192         return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
193     }
194     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
195     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
196     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
197 }
version(OpenBSD)198 else version (OpenBSD)
199 {
200     @safe pure:
201 
202     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);                     }
203     extern (D) int  WEXITSTATUS(int status)   { return (status >> 8) & 0xFF;                  }
204     extern (D) int  WIFCONTINUED(int status)  { return (status & _WCONTINUED) == _WCONTINUED; }
205     extern (D) bool WIFEXITED(int status)     { return _WSTATUS(status) == 0;                 }
206     extern (D) bool WIFSIGNALED(int status)
207     {
208         return _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0;
209     }
210     extern (D) bool WIFSTOPPED(int status)   { return (status & 0xFF) == _WSTOPPED; }
211     extern (D) int  WSTOPSIG(int status)     { return (status >> 8) & 0xFF;         }
212     extern (D) int  WTERMSIG(int status)     { return _WSTATUS(status);             }
213 }
version(DragonFlyBSD)214 else version (DragonFlyBSD)
215 {
216     @safe pure:
217 
218     extern (D) int _WSTATUS(int status)         { return (status & 0x7F);           }
219     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
220     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
221     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
222     extern (D) bool WIFSIGNALED( int status )
223     {
224         return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
225     }
226     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
227     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
228     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
229 }
version(Solaris)230 else version (Solaris)
231 {
232     @safe pure:
233 
234     extern (D) int WEXITSTATUS(int status) { return (status >> 8) & 0xff; }
235     extern (D) int WIFCONTINUED(int status) { return (status & 0xffff) == 0xffff; }
236     extern (D) bool WIFEXITED(int status) { return (status & 0xff) == 0;     }
237     extern (D) bool WIFSIGNALED(int status) { return (status & 0xff) > 0 && (status & 0xff00) == 0; }
238     extern (D) bool WIFSTOPPED(int status) { return (status & 0xff) == 0x7f && (status & 0xff00) != 0; }
239     extern (D) int WSTOPSIG(int status) { return (status >> 8) & 0x7f; }
240     extern (D) int WTERMSIG(int status) { return (status & 0x7f); }
241 }
version(CRuntime_Bionic)242 else version (CRuntime_Bionic)
243 {
244     @safe pure:
245     extern (D) int  WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
246     extern (D) bool WIFEXITED( int status ) { return WTERMSIG(status) == 0; }
247     extern (D) bool WIFSIGNALED( int status ) { return WTERMSIG(status + 1) >= 2; }
248     extern (D) bool WIFSTOPPED( int status ) { return WTERMSIG(status) == 0x7F; }
249     extern (D) int  WSTOPSIG( int status ) { return WEXITSTATUS(status); }
250     extern (D) int  WTERMSIG( int status ) { return status & 0x7F; }
251 }
version(CRuntime_Musl)252 else version (CRuntime_Musl)
253 {
254     @safe pure:
255     extern (D) int  WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
256     extern (D) int  WIFCONTINUED( int status ) { return status == 0xffff; }
257     extern (D) bool WIFEXITED( int status ) { return WTERMSIG( status ) == 0; }
258     extern (D) bool WIFSIGNALED( int status ) { return (status&0xffff)-1U < 0xffU; }
259     extern (D) bool WIFSTOPPED( int status ) { return cast(short)(((status&0xffff)*0x10001)>>8) > 0x7f00; }
260     extern (D) int  WTERMSIG( int status ) { return status & 0x7F; }
261     alias WEXITSTATUS WSTOPSIG;
262 }
version(CRuntime_UClibc)263 else version (CRuntime_UClibc)
264 {
265     @safe pure:
266 
267     private
268     {
269         extern (D) int __WTERMSIG( int status ) { return status & 0x7F; }
270     }
271 
272     //
273     // NOTE: These macros assume __USE_BSD is not defined in the relevant
274     //       C headers as the parameter definition there is different and
275     //       much more complicated.
276     //
277     extern (D) int  WEXITSTATUS( int status )  { return ( status & 0xFF00 ) >> 8;   }
278     extern (D) int  WIFCONTINUED( int status ) { return status == __W_CONTINUED;    }
279     extern (D) bool WIFEXITED( int status )    { return __WTERMSIG( status ) == 0;  }
280     extern (D) bool WIFSIGNALED( int status )
281     {
282         return ( cast(ulong) ( ( status & 0xffff ) - 1U ) >> 1 ) < 0xffU;
283     }
284     version (MIPS32)
285     {
286         extern (D) bool WIFSTOPPED( int status )   { return ( status & 0xFF ) == 0x7F;  }
287     }
288     else
289     {
290         extern (D) bool WIFSTOPPED( int status )   { return ( status & 0xFF ) == 0x7F && ( status & 0xFF00 );  }
291     }
292     extern (D) int  WSTOPSIG( int status )     { return WEXITSTATUS( status );      }
293     extern (D) int  WTERMSIG( int status )     { return status & 0x7F;              }
294 }
295 else
296 {
297     static assert(false, "Unsupported platform");
298 }
299 
300 /*
301 pid_t wait(int*);
302 pid_t waitpid(pid_t, int*, int);
303 */
304 
305 pid_t wait(int*);
306 pid_t waitpid(pid_t, int*, int);
307 
308 //
309 // XOpen (XSI)
310 //
311 /*
312 WEXITED
313 WSTOPPED
314 WCONTINUED
315 WNOWAIT
316 
317 enum idtype_t
318 {
319     P_ALL,
320     P_PID,
321     P_PGID
322 }
323 */
324 
version(linux)325 version (linux)
326 {
327     enum WEXITED    = 4;
328     enum WSTOPPED   = 2;
329     enum WCONTINUED = 8;
330     enum WNOWAIT    = 0x01000000;
331 
332     enum idtype_t
333     {
334         P_ALL,
335         P_PID,
336         P_PGID
337     }
338 }
339 else version (Darwin)
340 {
341     enum WEXITED    = 0x00000004;
342     enum WSTOPPED   = 0x00000008;
343     enum WCONTINUED = 0x00000010;
344     enum WNOWAIT    = 0x00000020;
345 
346     enum idtype_t
347     {
348         P_ALL,
349         P_PID,
350         P_PGID
351     }
352 }
353 else version (FreeBSD)
354 {
355     enum WSTOPPED       = WUNTRACED;
356     enum WCONTINUED     = 4;
357     enum WNOWAIT        = 8;
358     enum WEXITED        = 16;
359     enum WTRAPPED       = 32;
360 
361     enum idtype_t
362     {
363         P_UID,
364         P_GID,
365         P_SID,
366         P_JAILID,
367         P_PID,
368         P_PPID,
369         P_PGID,
370         P_CID,
371         P_ALL,
372         P_LWPID,
373         P_TASKID,
374         P_PROJID,
375         P_POOLID,
376         P_CTID,
377         P_CPUID,
378         P_PSETID
379     }
380 }
381 else version (NetBSD)
382 {
383     enum WSTOPPED       = WUNTRACED;
384     //enum WCONTINUED     = 4;
385     enum WNOWAIT        = 0x00010000;
386 }
387 else version (OpenBSD)
388 {
389     enum WCONTINUED     = 8;
390     // OpenBSD does not define the following:
391     //enum WSTOPPED
392     //enum WNOWAIT
393 }
394 else version (DragonFlyBSD)
395 {
396     enum WSTOPPED       = WUNTRACED;
397     enum WCONTINUED     = 4;
398     enum WNOWAIT        = 8;
399 }
400 else version (Solaris)
401 {
402     enum WEXITED = 1;
403     enum WTRAPPED = 2;
404     enum WSTOPPED = WUNTRACED;
405     enum WCONTINUED = 8;
406     enum WNOWAIT = 128;
407 
408     enum idtype_t
409     {
410         P_PID,          /* A process identifier.                */
411         P_PPID,         /* A parent process identifier.         */
412         P_PGID,         /* A process group (job control group)  */
413                         /* identifier.                          */
414         P_SID,          /* A session identifier.                */
415         P_CID,          /* A scheduling class identifier.       */
416         P_UID,          /* A user identifier.                   */
417         P_GID,          /* A group identifier.                  */
418         P_ALL,          /* All processes.                       */
419         P_LWPID,        /* An LWP identifier.                   */
420         P_TASKID,       /* A task identifier.                   */
421         P_PROJID,       /* A project identifier.                */
422         P_POOLID,       /* A pool identifier.                   */
423         P_ZONEID,       /* A zone identifier.                   */
424         P_CTID,         /* A (process) contract identifier.     */
425         P_CPUID,        /* CPU identifier.                      */
426         P_PSETID,       /* Processor set identifier             */
427     }
428 }
429 else
430 {
431     static assert(false, "Unsupported platform");
432 }
433 
434 /*
435 int waitid(idtype_t, id_t, siginfo_t*, int);
436 */
437 
438 version (CRuntime_Glibc)
439 {
440     int waitid(idtype_t, id_t, siginfo_t*, int);
441 }
442 else version (Darwin)
443 {
444     int waitid(idtype_t, id_t, siginfo_t*, int);
445 }
446 else version (FreeBSD)
447 {
448     int waitid(idtype_t, id_t, siginfo_t*, int);
449 }
450 else version (NetBSD)
451 {
452 }
453 else version (OpenBSD)
454 {
455 }
456 else version (DragonFlyBSD)
457 {
458 }
459 else version (Solaris)
460 {
461     int waitid(idtype_t, id_t, siginfo_t*, int);
462 }
463 else version (CRuntime_Bionic)
464 {
465     int waitid(idtype_t, id_t, siginfo_t*, int);
466 }
467 else version (CRuntime_Musl)
468 {
469     int waitid(idtype_t, id_t, siginfo_t*, int);
470 }
471 else version (CRuntime_UClibc)
472 {
473     int waitid(idtype_t, id_t, siginfo_t*, int);
474 }
475 else
476 {
477     static assert(false, "Unsupported platform");
478 }
479