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