1 module deimos.uv._d;
2 
3 package import core.stdc.stdint;
4 public import core.stdc.config;
5 
6 version (OSX)
7     version = Darwin;
8 else version (iOS)
9     version = Darwin;
10 else version (TVOS)
11     version = Darwin;
12 else version (WatchOS)
13     version = Darwin;
14 
15 
16 version(CRuntime_Musl) {
17 	enum isMUSL     = true;
18 } else {
19 	enum isMUSL	= false;
20 }
21 
22 version(Posix) {
23 	private import core.sys.posix.config;
24 	public import core.sys.posix.netdb : addrinfo, sockaddr, sockaddr_storage, sockaddr_in, sockaddr_in6;
25 	public import core.sys.posix.netinet.in_ : IPPROTO_TCP, IPPROTO_UDP;
26 	public import core.sys.posix.sys.socket : AF_INET, AF_INET6, SOCK_STREAM;
27 	package import core.sys.posix.sys.types;
28 	package import core.sys.posix.termios;
29 	package import core.sys.posix.dirent : dirent;
30 	package import core.sys.posix.semaphore : sem_t;
31 	version( CRuntime_Musl ) {
32 		struct pthread_barrier_t { 
33 			void*[4] __p;
34 		} 
35     	alias ubyte cc_t;
36     	alias uint  speed_t;   
37     	alias uint  tcflag_t;  
38 		const NCCS = 32 ;
39 		struct termios {
40         		tcflag_t c_iflag;
41         		tcflag_t c_oflag;
42         		tcflag_t c_cflag;
43         		tcflag_t c_lflag;
44         		cc_t 	c_line;
45         		cc_t[NCCS] 	c_cc;
46         		speed_t __c_ispeed;
47         		speed_t __c_ospeed;
48 		}
49 		enum NI_MAXHOST = 255;
50 	} else {
51 		package import core.sys.posix.net.if_ : IF_NAMESIZE ;
52 		const UV_IF_NAMESIZE = IF_NAMESIZE + 1;
53 		enum NI_MAXHOST = 1025;
54 	}
55 	package(deimos.uv) struct DIR;
56 } else {
57 	const UV_IF_NAMESIZE = 16 + 1 ;
58 }
59 
60 version(Windows) {
61 	enum isWindowsOS	= true ;
62 	enum isMSVC2008 	= true ;
63 	public import core.sys.windows.winsock2 : addrinfo, sockaddr, sockaddr_in, sockaddr_in6,  AF_INET, AF_INET6, SOCK_STREAM, IPPROTO_TCP;
64 	package import core.sys.windows.mswsock : LPTRANSMIT_FILE_BUFFERS, LPWSABUF ;
65 	package import core.sys.windows.wincon ;
66 	package import 
67 			core.stdc.stdio,
68 			core.sys.windows.basetyps, 	// GUID
69 			core.sys.windows.basetsd, 
70 			core.sys.windows.winnt,	  // BOOL, PVOID, DWORD, LPINT
71 			core.sys.windows.winsock2,	// SOCKET	
72 			core.sys.windows.winbase;	// CRITICAL_SECTION
73 	package enum {
74 		_O_RANDOM  = 0x0010 ,
75 		_O_SEQUENTIAL = 0x0020 ,
76 		_O_TEMPORARY = 0x0040 ,
77 		_O_SHORT_LIVED = 0x1000 ,
78 	};
79 	package enum {
80 		UV_DIRENT_UNKNOWN,
81 		UV_DIRENT_FILE,
82 		UV_DIRENT_DIR,
83 		UV_DIRENT_LINK,
84 		UV_DIRENT_FIFO,
85 		UV_DIRENT_SOCKET,
86 		UV_DIRENT_CHAR,
87 		UV_DIRENT_BLOCK
88 	};
89 	alias sockaddr_storage = SOCKADDR_STORAGE ;
90 	static if( size_t.sizeof == 8 )
91 	    	alias ssize_t = long;
92     	else
93     		alias ssize_t = int;
94 	struct addrinfoW {
95 		int              ai_flags;
96 		int              ai_family;
97 		int              ai_socktype;
98 		int              ai_protocol;
99 		size_t           ai_addrlen;
100 		PWSTR            ai_canonname;
101 		sockaddr  *ai_addr;
102 		addrinfoW  *ai_next;
103     } ;
104     alias ADDRINFOW = addrinfoW;
105     alias PADDRINFOW = ADDRINFOW*;
106     struct WSABUF {
107         ULONG len;
108         CHAR* buf;
109     }
110 } else {
111 	enum isWindowsOS	= false ;
112 	enum isMSVC2008 	= false ;
113 }
114 
115 enum isCygWin	= false ;
116 enum isMSYS	= false ;
117 
118 version(linux) {
119 	enum isLinuxOS	= true ;
120 } else {
121 	enum isLinuxOS	= false ;
122 	version(Posix) alias pthread_rwlock_t_ = pthread_rwlock_t;
123 }
124 
125 version(Darwin) {
126 	enum isMacOS	= true ;
127 	enum hasPTHREAD_BARRIER = false ;
128 	package import core.sys.darwin.mach.semaphore;
129 	struct pthread_barrier_t {
130 		void* data;
131 	}
132 } else {
133 	enum isMacOS	= false ;
134 	enum hasPTHREAD_BARRIER = true ;
135 }
136 
137 version(Solaris) {
138 	enum isSunOS	= true ;
139 } else {
140 	enum isSunOS	= false ;
141 }
142 
143 version(FreeBSD) {
144 	enum isBsdOS	= true ;
145 } else {
146 	enum isBsdOS	= false ;
147 }
148 
149 version(AIXOS) {
150 	enum isAixOS	= true ;
151 } else {
152 	enum isAixOS	= false ;
153 }
154 
155 version(Android) {
156 	enum isAndroidOS	= true ;
157 	enum EFTYPE = 79;
158 	alias ifa_dstaddr	= sockaddr*;
159 	private {
160 		alias ubyte cc_t;
161 		alias uint  speed_t;
162 		alias uint  tcflag_t;
163 		enum NCCS   = 8;
164 	}
165 	struct termios {
166 		tcflag_t   c_iflag;
167 		tcflag_t   c_oflag;
168 		tcflag_t   c_cflag;
169 		tcflag_t   c_lflag;
170 		cc_t       c_line;
171 		cc_t[NCCS] c_cc;
172 		speed_t    c_ispeed;
173 		speed_t    c_ospeed;
174 	}
175 	struct pthread_barrier_t {
176 	 	version(D_LP64 ) {
177 	  	  int64_t[4] __private;
178 		} else {
179 	  	  int32_t[8] __private;
180 		}
181 	} ;
182 } else {
183 	enum isAndroidOS	= false ;
184 }
185 
186 enum isOS390 = false ;
187 enum isOS400 = false ;
188 enum isHaiKuOS = false;
189 enum isQNX = false;
190 
191 static if( isLinuxOS ) {
192         // @fixme druntime pthread_rwlock_t size is (36, 64), linux is (32, 56)
193         version(D_LP64) {
194                 struct pthread_rwlock_t_ {
195                         byte[56] __size;
196                 }
197         } else {
198                 static if(isAndroidOS) {
199                         struct pthread_rwlock_t_ {
200                                 byte[40] __size;
201                         }
202                 } else /* static if (isMUSL) */ {
203                         struct pthread_rwlock_t_ {
204                                 byte[32] __size;
205                         }
206                 } 
207         }
208 }
209 
210 package:
211 
212 enum isDtUnknow = true ;
213 enum isGnuC	= false ;
214 version(linux) {
215 	enum isEHOSTDOWN = true ;
216 } else {
217 	enum isEHOSTDOWN = false ;
218 }
219 
220 struct RB_ENTRY(T) { 
221 	T*	rbe_left;
222 	T*	rbe_right;
223 	T*	rbe_parent;
224 	int rbe_color; 
225 }
226 
227 struct RB_HEAD(T) {
228 	T* rbh_root;
229 }
230 
231 template ExternC(T) if (is(typeof(*(T.init)) P == function)) {
232 	static if (is(typeof(*(T.init)) R == return)) {
233 		static if (is(typeof(*(T.init)) P == function)) {
234 			alias ExternC = extern(C) R function(P) @nogc nothrow ;
235 		}
236 	}
237 }
238 
239 template ExternWindows(T) if (is(typeof(*(T.init)) P == function)) {
240 	static if (is(typeof(*(T.init)) R == return)) {
241 		static if (is(typeof(*(T.init)) P == function)) {
242 			alias ExternWindows = extern(Windows) R function(P) @nogc nothrow ;
243 		}
244 	}
245 }
246 
247 import  deimos.uv : uv_loop_s;