| /* w32sock.h --- internal auxiliary functions for Windows socket functions |
| |
| Copyright (C) 2008-2022 Free Software Foundation, Inc. |
| |
| This file is free software: you can redistribute it and/or modify |
| it under the terms of the GNU Lesser General Public License as |
| published by the Free Software Foundation; either version 2.1 of the |
| License, or (at your option) any later version. |
| |
| This file is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
| |
| /* Written by Paolo Bonzini */ |
| |
| #include <errno.h> |
| |
| /* Get O_RDWR and O_BINARY. */ |
| #include <fcntl.h> |
| |
| /* Get _open_osfhandle(). */ |
| #include <io.h> |
| |
| /* Get _get_osfhandle(). */ |
| #if GNULIB_MSVC_NOTHROW |
| # include "msvc-nothrow.h" |
| #else |
| # include <io.h> |
| #endif |
| |
| #define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd))) |
| #define SOCKET_TO_FD(fh) (_open_osfhandle ((intptr_t) (fh), O_RDWR | O_BINARY)) |
| |
| static inline void |
| set_winsock_errno (void) |
| { |
| int err = WSAGetLastError (); |
| |
| /* Map some WSAE* errors to the runtime library's error codes. */ |
| switch (err) |
| { |
| case WSA_INVALID_HANDLE: |
| errno = EBADF; |
| break; |
| case WSA_NOT_ENOUGH_MEMORY: |
| errno = ENOMEM; |
| break; |
| case WSA_INVALID_PARAMETER: |
| errno = EINVAL; |
| break; |
| case WSAENAMETOOLONG: |
| errno = ENAMETOOLONG; |
| break; |
| case WSAENOTEMPTY: |
| errno = ENOTEMPTY; |
| break; |
| case WSAEWOULDBLOCK: |
| errno = EWOULDBLOCK; |
| break; |
| case WSAEINPROGRESS: |
| errno = EINPROGRESS; |
| break; |
| case WSAEALREADY: |
| errno = EALREADY; |
| break; |
| case WSAENOTSOCK: |
| errno = ENOTSOCK; |
| break; |
| case WSAEDESTADDRREQ: |
| errno = EDESTADDRREQ; |
| break; |
| case WSAEMSGSIZE: |
| errno = EMSGSIZE; |
| break; |
| case WSAEPROTOTYPE: |
| errno = EPROTOTYPE; |
| break; |
| case WSAENOPROTOOPT: |
| errno = ENOPROTOOPT; |
| break; |
| case WSAEPROTONOSUPPORT: |
| errno = EPROTONOSUPPORT; |
| break; |
| case WSAEOPNOTSUPP: |
| errno = EOPNOTSUPP; |
| break; |
| case WSAEAFNOSUPPORT: |
| errno = EAFNOSUPPORT; |
| break; |
| case WSAEADDRINUSE: |
| errno = EADDRINUSE; |
| break; |
| case WSAEADDRNOTAVAIL: |
| errno = EADDRNOTAVAIL; |
| break; |
| case WSAENETDOWN: |
| errno = ENETDOWN; |
| break; |
| case WSAENETUNREACH: |
| errno = ENETUNREACH; |
| break; |
| case WSAENETRESET: |
| errno = ENETRESET; |
| break; |
| case WSAECONNABORTED: |
| errno = ECONNABORTED; |
| break; |
| case WSAECONNRESET: |
| errno = ECONNRESET; |
| break; |
| case WSAENOBUFS: |
| errno = ENOBUFS; |
| break; |
| case WSAEISCONN: |
| errno = EISCONN; |
| break; |
| case WSAENOTCONN: |
| errno = ENOTCONN; |
| break; |
| case WSAETIMEDOUT: |
| errno = ETIMEDOUT; |
| break; |
| case WSAECONNREFUSED: |
| errno = ECONNREFUSED; |
| break; |
| case WSAELOOP: |
| errno = ELOOP; |
| break; |
| case WSAEHOSTUNREACH: |
| errno = EHOSTUNREACH; |
| break; |
| default: |
| errno = (err > 10000 && err < 10025) ? err - 10000 : err; |
| break; |
| } |
| } |