1 /**
2  * D header file for POSIX.
3  *
4  * Copyright: Public Domain
5  * License:   Public Domain
6  * Authors:   Sean Kelly
7  * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8  */
9 module tango.stdc.posix.sys.wait;
10 
11 private import tango.stdc.posix.config;
12 public import tango.stdc.posix.sys.types; // for id_t, pid_t
13 public import tango.stdc.posix.signal;    // for siginfo_t (XSI)
14 //public import tango.stdc.posix.resource; // for rusage (XSI)
15 private import tango.core.Octal;
16 
17 extern (C):
18 
19 //
20 // Required
21 //
22 /*
23 WNOHANG
24 WUNTRACED
25 
26 WEXITSTATUS
27 WIFCONTINUED
28 WIFEXITED
29 WIFSIGNALED
30 WIFSTOPPED
31 WSTOPSIG
32 WTERMSIG
33 
34 pid_t wait(int*);
35 pid_t waitpid(pid_t, int*, int);
36 */
37 
38 version( linux )
39 {
40     const WNOHANG       = 1;
41     const WUNTRACED     = 2;
42 
43     private
44     {
45         const __W_CONTINUED = 0xFFFF;
46 
47         extern (D) int __WTERMSIG( int status ) { return status & 0x7F; }
48     }
49 
50     //
51     // NOTE: These macros assume __USE_BSD is not defined in the relevant
52     //       C headers as the parameter definition there is different and
53     //       much more complicated.
54     //
55     extern (D) int  WEXITSTATUS( int status )  { return ( status & 0xFF00 ) >> 8;   }
56     extern (D) int  WIFCONTINUED( int status ) { return status == __W_CONTINUED;    }
57     extern (D) bool WIFEXITED( int status )    { return __WTERMSIG( status ) == 0;  }
58     extern (D) bool WIFSIGNALED( int status )
59     {
60         return ( cast(byte) ( ( status & 0x7F ) + 1 ) >> 1 ) > 0;
61     }
62     extern (D) bool WIFSTOPPED( int status )   { return ( status & 0xFF ) == 0x7F;  }
63     extern (D) int  WSTOPSIG( int status )     { return WEXITSTATUS( status );      }
64     extern (D) int  WTERMSIG( int status )     { return status & 0x7F;              }
65 }
66 else version( darwin )
67 {
68     const WNOHANG       = 1;
69     const WUNTRACED     = 2;
70 
71     private
72     {
73         const _WSTOPPED = octal!(177);
74     }
75 
76     extern (D) int _WSTATUS(int status)         { return (status & octal!(177));           }
77     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
78     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
79     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
80     extern (D) bool WIFSIGNALED( int status )
81     {
82         return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
83     }
84     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
85     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
86     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
87 }
88 else version( FreeBSD )
89 {
90     const WNOHANG       = 1;
91     const WUNTRACED     = 2;
92 	const WCONTINUED	= 4;
93 
94     private
95     {
96         const _WSTOPPED = octal!(177);
97     }
98 
99     extern (D) int _WSTATUS(int status)         { return (status & octal!(177));           }
100     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8);             }
101     extern (D) int  WIFCONTINUED( int status )  { return status == 0x13;            }
102     extern (D) bool WIFEXITED( int status )     { return _WSTATUS(status) == 0;     }
103     extern (D) bool WIFSIGNALED( int status )
104     {
105         return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
106     }
107     extern (D) bool WIFSTOPPED( int status )   { return _WSTATUS( status ) == _WSTOPPED; }
108     extern (D) int  WSTOPSIG( int status )     { return status >> 8;                     }
109     extern (D) int  WTERMSIG( int status )     { return _WSTATUS( status );              }
110 }
111 else version( solaris )
112 {	
113 	const WCONTFLG		= octal!(177777);
114 	
115     const WNOHANG       = octal!(100);
116     const WUNTRACED     = octal!(4);
117 	const WCONTINUED	= octal!(10);
118 	
119 	extern (D) int  WWORD( int status )			{ return (status & octal!(177777));			}
120     extern (D) int  WEXITSTATUS( int status )   { return (status >> 8) & 0xFF;			}
121     extern (D) int  WIFCONTINUED( int status )  { return WWORD(status) == WCONTFLG;		}
122     extern (D) bool WIFEXITED( int status )     { return (status & 0xFF) == 0;			}
123     extern (D) bool WIFSIGNALED( int status )	{ return (status & 0xFF) > 0 && (status & 0xFF00) == 0; }
124     extern (D) bool WIFSTOPPED( int status )	{ return (status & 0xFF) == octal!(177) && (status & 0xFF00) != 0; }
125     extern (D) int  WSTOPSIG( int status )		{ return (status >> 8) & 0xFF;			}
126     extern (D) int  WTERMSIG( int status )		{ return status & 0x7F;					}
127 }
128 else
129 {
130     static assert( false );
131 }
132 
133 pid_t wait(int*);
134 pid_t waitpid(pid_t, int*, int);
135 
136 //
137 // XOpen (XSI)
138 //
139 /*
140 WEXITED
141 WSTOPPED
142 WCONTINUED
143 WNOHANG
144 WNOWAIT
145 
146 enum idtype_t
147 {
148     P_ALL,
149     P_PID,
150     P_PGID
151 }
152 
153 int waitid(idtype_t, id_t, siginfo_t*, int);
154 */