1 /* 2 This file is part of libmicrohttpd 3 Copyright (C) 2014 Karlson2k (Evgeny Grin) 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library. 17 If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 /** 21 * @file include/w32functions.h 22 * @brief internal functions for W32 systems 23 * @author Karlson2k (Evgeny Grin) 24 */ 25 26 #ifndef MHD_W32FUNCTIONS_H 27 #define MHD_W32FUNCTIONS_H 28 #ifndef _WIN32 29 #error w32functions.h is designed only for W32 systems 30 #endif 31 32 #include "platform.h" 33 #include <errno.h> 34 #include <winsock2.h> 35 #include "platform_interface.h" 36 37 #ifdef __cplusplus 38 extern "C" 39 { 40 #endif 41 42 #define MHDW32ERRBASE 3300 43 44 #ifndef EWOULDBLOCK 45 #define EWOULDBLOCK (MHDW32ERRBASE+1) 46 #endif 47 #ifndef EINPROGRESS 48 #define EINPROGRESS (MHDW32ERRBASE+2) 49 #endif 50 #ifndef EALREADY 51 #define EALREADY (MHDW32ERRBASE+3) 52 #endif 53 #ifndef ENOTSOCK 54 #define ENOTSOCK (MHDW32ERRBASE+4) 55 #endif 56 #ifndef EDESTADDRREQ 57 #define EDESTADDRREQ (MHDW32ERRBASE+5) 58 #endif 59 #ifndef EMSGSIZE 60 #define EMSGSIZE (MHDW32ERRBASE+6) 61 #endif 62 #ifndef EPROTOTYPE 63 #define EPROTOTYPE (MHDW32ERRBASE+7) 64 #endif 65 #ifndef ENOPROTOOPT 66 #define ENOPROTOOPT (MHDW32ERRBASE+8) 67 #endif 68 #ifndef EPROTONOSUPPORT 69 #define EPROTONOSUPPORT (MHDW32ERRBASE+9) 70 #endif 71 #ifndef EOPNOTSUPP 72 #define EOPNOTSUPP (MHDW32ERRBASE+10) 73 #endif 74 #ifndef EAFNOSUPPORT 75 #define EAFNOSUPPORT (MHDW32ERRBASE+11) 76 #endif 77 #ifndef EADDRINUSE 78 #define EADDRINUSE (MHDW32ERRBASE+12) 79 #endif 80 #ifndef EADDRNOTAVAIL 81 #define EADDRNOTAVAIL (MHDW32ERRBASE+13) 82 #endif 83 #ifndef ENETDOWN 84 #define ENETDOWN (MHDW32ERRBASE+14) 85 #endif 86 #ifndef ENETUNREACH 87 #define ENETUNREACH (MHDW32ERRBASE+15) 88 #endif 89 #ifndef ENETRESET 90 #define ENETRESET (MHDW32ERRBASE+16) 91 #endif 92 #ifndef ECONNABORTED 93 #define ECONNABORTED (MHDW32ERRBASE+17) 94 #endif 95 #ifndef ECONNRESET 96 #define ECONNRESET (MHDW32ERRBASE+18) 97 #endif 98 #ifndef ENOBUFS 99 #define ENOBUFS (MHDW32ERRBASE+19) 100 #endif 101 #ifndef EISCONN 102 #define EISCONN (MHDW32ERRBASE+20) 103 #endif 104 #ifndef ENOTCONN 105 #define ENOTCONN (MHDW32ERRBASE+21) 106 #endif 107 #ifndef ETOOMANYREFS 108 #define ETOOMANYREFS (MHDW32ERRBASE+22) 109 #endif 110 #ifndef ECONNREFUSED 111 #define ECONNREFUSED (MHDW32ERRBASE+23) 112 #endif 113 #ifndef ELOOP 114 #define ELOOP (MHDW32ERRBASE+24) 115 #endif 116 #ifndef EHOSTDOWN 117 #define EHOSTDOWN (MHDW32ERRBASE+25) 118 #endif 119 #ifndef EHOSTUNREACH 120 #define EHOSTUNREACH (MHDW32ERRBASE+26) 121 #endif 122 #ifndef EPROCLIM 123 #define EPROCLIM (MHDW32ERRBASE+27) 124 #endif 125 #ifndef EUSERS 126 #define EUSERS (MHDW32ERRBASE+28) 127 #endif 128 #ifndef EDQUOT 129 #define EDQUOT (MHDW32ERRBASE+29) 130 #endif 131 #ifndef ESTALE 132 #define ESTALE (MHDW32ERRBASE+30) 133 #endif 134 #ifndef EREMOTE 135 #define EREMOTE (MHDW32ERRBASE+31) 136 #endif 137 #ifndef ESOCKTNOSUPPORT 138 #define ESOCKTNOSUPPORT (MHDW32ERRBASE+32) 139 #endif 140 #ifndef EPFNOSUPPORT 141 #define EPFNOSUPPORT (MHDW32ERRBASE+33) 142 #endif 143 #ifndef ESHUTDOWN 144 #define ESHUTDOWN (MHDW32ERRBASE+34) 145 #endif 146 #ifndef ENODATA 147 #define ENODATA (MHDW32ERRBASE+35) 148 #endif 149 #ifndef ETIMEDOUT 150 #define ETIMEDOUT (MHDW32ERRBASE+36) 151 #endif 152 153 /** 154 * Return errno equivalent of last winsock error 155 * @return errno equivalent of last winsock error 156 */ 157 int MHD_W32_errno_from_winsock_(void); 158 159 /** 160 * Return pointer to string description of errnum error 161 * Works fine with both standard errno errnums 162 * and errnums from MHD_W32_errno_from_winsock_ 163 * @param errnum the errno or value from MHD_W32_errno_from_winsock_() 164 * @return pointer to string description of error 165 */ 166 const char* MHD_W32_strerror_(int errnum); 167 168 /** 169 * Return pointer to string description of last winsock error 170 * @return pointer to string description of last winsock error 171 */ 172 const char* MHD_W32_strerror_last_winsock_(void); 173 174 /** 175 * Set last winsock error to equivalent of given errno value 176 * @param errnum the errno value to set 177 */ 178 void MHD_W32_set_last_winsock_error_(int errnum); 179 180 /** 181 * Create pair of mutually connected TCP/IP sockets on loopback address 182 * @param sockets_pair array to receive resulted sockets 183 * @return zero on success, -1 otherwise 184 */ 185 int MHD_W32_pair_of_sockets_(SOCKET sockets_pair[2]); 186 187 /** 188 * Generate 31-bit pseudo random number. 189 * Function initialize itself at first call to current time. 190 * @return 31-bit pseudo random number. 191 */ 192 int MHD_W32_random_(void); 193 194 /* Emulate snprintf function on W32 */ 195 int W32_snprintf(char *__restrict s, size_t n, const char *__restrict format, ...); 196 197 #ifndef _MSC_FULL_VER 198 /* Thread name available only for VC-compiler */ 199 static void W32_SetThreadName(const DWORD thread_id, const char *thread_name) 200 { } 201 #else /* _MSC_FULL_VER */ 202 /** 203 * Set thread name 204 * @param thread_id ID of thread, -1 for current thread 205 * @param thread_name name to set 206 */ 207 void W32_SetThreadName(const DWORD thread_id, const char *thread_name); 208 #endif 209 210 #ifdef __cplusplus 211 } 212 #endif 213 #endif //MHD_W32FUNCTIONS_H 214