1/* w32sock.h --- internal auxiliary functions for Windows socket functions 2 3 Copyright (C) 2008-2014 Free Software Foundation, Inc. 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program 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 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18/* Written by Paolo Bonzini */ 19 20#include <errno.h> 21 22/* Get O_RDWR and O_BINARY. */ 23#include <fcntl.h> 24 25/* Get _open_osfhandle(). */ 26#include <io.h> 27 28/* Get _get_osfhandle(). */ 29#include "msvc-nothrow.h" 30 31#define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd))) 32#define SOCKET_TO_FD(fh) (_open_osfhandle ((intptr_t) (fh), O_RDWR | O_BINARY)) 33 34static inline void 35set_winsock_errno (void) 36{ 37 int err = WSAGetLastError (); 38 39 /* Map some WSAE* errors to the runtime library's error codes. */ 40 switch (err) 41 { 42 case WSA_INVALID_HANDLE: 43 errno = EBADF; 44 break; 45 case WSA_NOT_ENOUGH_MEMORY: 46 errno = ENOMEM; 47 break; 48 case WSA_INVALID_PARAMETER: 49 errno = EINVAL; 50 break; 51 case WSAENAMETOOLONG: 52 errno = ENAMETOOLONG; 53 break; 54 case WSAENOTEMPTY: 55 errno = ENOTEMPTY; 56 break; 57 case WSAEWOULDBLOCK: 58 errno = EWOULDBLOCK; 59 break; 60 case WSAEINPROGRESS: 61 errno = EINPROGRESS; 62 break; 63 case WSAEALREADY: 64 errno = EALREADY; 65 break; 66 case WSAENOTSOCK: 67 errno = ENOTSOCK; 68 break; 69 case WSAEDESTADDRREQ: 70 errno = EDESTADDRREQ; 71 break; 72 case WSAEMSGSIZE: 73 errno = EMSGSIZE; 74 break; 75 case WSAEPROTOTYPE: 76 errno = EPROTOTYPE; 77 break; 78 case WSAENOPROTOOPT: 79 errno = ENOPROTOOPT; 80 break; 81 case WSAEPROTONOSUPPORT: 82 errno = EPROTONOSUPPORT; 83 break; 84 case WSAEOPNOTSUPP: 85 errno = EOPNOTSUPP; 86 break; 87 case WSAEAFNOSUPPORT: 88 errno = EAFNOSUPPORT; 89 break; 90 case WSAEADDRINUSE: 91 errno = EADDRINUSE; 92 break; 93 case WSAEADDRNOTAVAIL: 94 errno = EADDRNOTAVAIL; 95 break; 96 case WSAENETDOWN: 97 errno = ENETDOWN; 98 break; 99 case WSAENETUNREACH: 100 errno = ENETUNREACH; 101 break; 102 case WSAENETRESET: 103 errno = ENETRESET; 104 break; 105 case WSAECONNABORTED: 106 errno = ECONNABORTED; 107 break; 108 case WSAECONNRESET: 109 errno = ECONNRESET; 110 break; 111 case WSAENOBUFS: 112 errno = ENOBUFS; 113 break; 114 case WSAEISCONN: 115 errno = EISCONN; 116 break; 117 case WSAENOTCONN: 118 errno = ENOTCONN; 119 break; 120 case WSAETIMEDOUT: 121 errno = ETIMEDOUT; 122 break; 123 case WSAECONNREFUSED: 124 errno = ECONNREFUSED; 125 break; 126 case WSAELOOP: 127 errno = ELOOP; 128 break; 129 case WSAEHOSTUNREACH: 130 errno = EHOSTUNREACH; 131 break; 132 default: 133 errno = (err > 10000 && err < 10025) ? err - 10000 : err; 134 break; 135 } 136} 137