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 38extern "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 */ 157int 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 */ 166const 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 */ 172const 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 */ 178void 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 */ 185int 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 */ 192int MHD_W32_random_(void); 193 194/* Emulate snprintf function on W32 */ 195int 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 */ 199static 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 */ 207void 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