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 */