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