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;