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;