@@ -1956,26 +1956,158 @@ static void ensure_socket_initialization(void)
1956
1956
initialized = 1 ;
1957
1957
}
1958
1958
1959
+ static int winsock_error_to_errno (DWORD err )
1960
+ {
1961
+ switch (err ) {
1962
+ case WSAEINTR : return EINTR ;
1963
+ case WSAEBADF : return EBADF ;
1964
+ case WSAEACCES : return EACCES ;
1965
+ case WSAEFAULT : return EFAULT ;
1966
+ case WSAEINVAL : return EINVAL ;
1967
+ case WSAEMFILE : return EMFILE ;
1968
+ case WSAEWOULDBLOCK : return EWOULDBLOCK ;
1969
+ case WSAEINPROGRESS : return EINPROGRESS ;
1970
+ case WSAEALREADY : return EALREADY ;
1971
+ case WSAENOTSOCK : return ENOTSOCK ;
1972
+ case WSAEDESTADDRREQ : return EDESTADDRREQ ;
1973
+ case WSAEMSGSIZE : return EMSGSIZE ;
1974
+ case WSAEPROTOTYPE : return EPROTOTYPE ;
1975
+ case WSAENOPROTOOPT : return ENOPROTOOPT ;
1976
+ case WSAEPROTONOSUPPORT : return EPROTONOSUPPORT ;
1977
+ case WSAEOPNOTSUPP : return EOPNOTSUPP ;
1978
+ case WSAEAFNOSUPPORT : return EAFNOSUPPORT ;
1979
+ case WSAEADDRINUSE : return EADDRINUSE ;
1980
+ case WSAEADDRNOTAVAIL : return EADDRNOTAVAIL ;
1981
+ case WSAENETDOWN : return ENETDOWN ;
1982
+ case WSAENETUNREACH : return ENETUNREACH ;
1983
+ case WSAENETRESET : return ENETRESET ;
1984
+ case WSAECONNABORTED : return ECONNABORTED ;
1985
+ case WSAECONNRESET : return ECONNRESET ;
1986
+ case WSAENOBUFS : return ENOBUFS ;
1987
+ case WSAEISCONN : return EISCONN ;
1988
+ case WSAENOTCONN : return ENOTCONN ;
1989
+ case WSAETIMEDOUT : return ETIMEDOUT ;
1990
+ case WSAECONNREFUSED : return ECONNREFUSED ;
1991
+ case WSAELOOP : return ELOOP ;
1992
+ case WSAENAMETOOLONG : return ENAMETOOLONG ;
1993
+ case WSAEHOSTUNREACH : return EHOSTUNREACH ;
1994
+ case WSAENOTEMPTY : return ENOTEMPTY ;
1995
+ /* No errno equivalent; default to EIO */
1996
+ case WSAESOCKTNOSUPPORT :
1997
+ case WSAEPFNOSUPPORT :
1998
+ case WSAESHUTDOWN :
1999
+ case WSAETOOMANYREFS :
2000
+ case WSAEHOSTDOWN :
2001
+ case WSAEPROCLIM :
2002
+ case WSAEUSERS :
2003
+ case WSAEDQUOT :
2004
+ case WSAESTALE :
2005
+ case WSAEREMOTE :
2006
+ case WSASYSNOTREADY :
2007
+ case WSAVERNOTSUPPORTED :
2008
+ case WSANOTINITIALISED :
2009
+ case WSAEDISCON :
2010
+ case WSAENOMORE :
2011
+ case WSAECANCELLED :
2012
+ case WSAEINVALIDPROCTABLE :
2013
+ case WSAEINVALIDPROVIDER :
2014
+ case WSAEPROVIDERFAILEDINIT :
2015
+ case WSASYSCALLFAILURE :
2016
+ case WSASERVICE_NOT_FOUND :
2017
+ case WSATYPE_NOT_FOUND :
2018
+ case WSA_E_NO_MORE :
2019
+ case WSA_E_CANCELLED :
2020
+ case WSAEREFUSED :
2021
+ case WSAHOST_NOT_FOUND :
2022
+ case WSATRY_AGAIN :
2023
+ case WSANO_RECOVERY :
2024
+ case WSANO_DATA :
2025
+ case WSA_QOS_RECEIVERS :
2026
+ case WSA_QOS_SENDERS :
2027
+ case WSA_QOS_NO_SENDERS :
2028
+ case WSA_QOS_NO_RECEIVERS :
2029
+ case WSA_QOS_REQUEST_CONFIRMED :
2030
+ case WSA_QOS_ADMISSION_FAILURE :
2031
+ case WSA_QOS_POLICY_FAILURE :
2032
+ case WSA_QOS_BAD_STYLE :
2033
+ case WSA_QOS_BAD_OBJECT :
2034
+ case WSA_QOS_TRAFFIC_CTRL_ERROR :
2035
+ case WSA_QOS_GENERIC_ERROR :
2036
+ case WSA_QOS_ESERVICETYPE :
2037
+ case WSA_QOS_EFLOWSPEC :
2038
+ case WSA_QOS_EPROVSPECBUF :
2039
+ case WSA_QOS_EFILTERSTYLE :
2040
+ case WSA_QOS_EFILTERTYPE :
2041
+ case WSA_QOS_EFILTERCOUNT :
2042
+ case WSA_QOS_EOBJLENGTH :
2043
+ case WSA_QOS_EFLOWCOUNT :
2044
+ #ifndef _MSC_VER
2045
+ case WSA_QOS_EUNKNOWNPSOBJ :
2046
+ #endif
2047
+ case WSA_QOS_EPOLICYOBJ :
2048
+ case WSA_QOS_EFLOWDESC :
2049
+ case WSA_QOS_EPSFLOWSPEC :
2050
+ case WSA_QOS_EPSFILTERSPEC :
2051
+ case WSA_QOS_ESDMODEOBJ :
2052
+ case WSA_QOS_ESHAPERATEOBJ :
2053
+ case WSA_QOS_RESERVED_PETYPE :
2054
+ default : return EIO ;
2055
+ }
2056
+ }
2057
+
2058
+ /*
2059
+ * On Windows, `errno` is a global macro to a function call.
2060
+ * This makes it difficult to debug and single-step our mappings.
2061
+ */
2062
+ static inline void set_wsa_errno (void )
2063
+ {
2064
+ DWORD wsa = WSAGetLastError ();
2065
+ int e = winsock_error_to_errno (wsa );
2066
+ errno = e ;
2067
+
2068
+ #ifdef DEBUG_WSA_ERRNO
2069
+ fprintf (stderr , "winsock error: %d -> %d\n" , wsa , e );
2070
+ fflush (stderr );
2071
+ #endif
2072
+ }
2073
+
2074
+ static inline int winsock_return (int ret )
2075
+ {
2076
+ if (ret < 0 )
2077
+ set_wsa_errno ();
2078
+
2079
+ return ret ;
2080
+ }
2081
+
2082
+ #define WINSOCK_RETURN (x ) do { return winsock_return(x); } while (0)
2083
+
1959
2084
#undef gethostname
1960
2085
int mingw_gethostname (char * name , int namelen )
1961
2086
{
1962
- ensure_socket_initialization ();
1963
- return gethostname (name , namelen );
2087
+ ensure_socket_initialization ();
2088
+ WINSOCK_RETURN ( gethostname (name , namelen ) );
1964
2089
}
1965
2090
1966
2091
#undef gethostbyname
1967
2092
struct hostent * mingw_gethostbyname (const char * host )
1968
2093
{
2094
+ struct hostent * ret ;
2095
+
1969
2096
ensure_socket_initialization ();
1970
- return gethostbyname (host );
2097
+
2098
+ ret = gethostbyname (host );
2099
+ if (!ret )
2100
+ set_wsa_errno ();
2101
+
2102
+ return ret ;
1971
2103
}
1972
2104
1973
2105
#undef getaddrinfo
1974
2106
int mingw_getaddrinfo (const char * node , const char * service ,
1975
2107
const struct addrinfo * hints , struct addrinfo * * res )
1976
2108
{
1977
2109
ensure_socket_initialization ();
1978
- return getaddrinfo (node , service , hints , res );
2110
+ WINSOCK_RETURN ( getaddrinfo (node , service , hints , res ) );
1979
2111
}
1980
2112
1981
2113
int mingw_socket (int domain , int type , int protocol )
@@ -1995,7 +2127,7 @@ int mingw_socket(int domain, int type, int protocol)
1995
2127
* in errno so that _if_ someone looks up the code somewhere,
1996
2128
* then it is at least the number that are usually listed.
1997
2129
*/
1998
- errno = WSAGetLastError ();
2130
+ set_wsa_errno ();
1999
2131
return -1 ;
2000
2132
}
2001
2133
/* convert into a file descriptor */
@@ -2011,35 +2143,35 @@ int mingw_socket(int domain, int type, int protocol)
2011
2143
int mingw_connect (int sockfd , struct sockaddr * sa , size_t sz )
2012
2144
{
2013
2145
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
2014
- return connect (s , sa , sz );
2146
+ WINSOCK_RETURN ( connect (s , sa , sz ) );
2015
2147
}
2016
2148
2017
2149
#undef bind
2018
2150
int mingw_bind (int sockfd , struct sockaddr * sa , size_t sz )
2019
2151
{
2020
2152
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
2021
- return bind (s , sa , sz );
2153
+ WINSOCK_RETURN ( bind (s , sa , sz ) );
2022
2154
}
2023
2155
2024
2156
#undef setsockopt
2025
2157
int mingw_setsockopt (int sockfd , int lvl , int optname , void * optval , int optlen )
2026
2158
{
2027
2159
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
2028
- return setsockopt (s , lvl , optname , (const char * )optval , optlen );
2160
+ WINSOCK_RETURN ( setsockopt (s , lvl , optname , (const char * )optval , optlen ) );
2029
2161
}
2030
2162
2031
2163
#undef shutdown
2032
2164
int mingw_shutdown (int sockfd , int how )
2033
2165
{
2034
2166
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
2035
- return shutdown (s , how );
2167
+ WINSOCK_RETURN ( shutdown (s , how ) );
2036
2168
}
2037
2169
2038
2170
#undef listen
2039
2171
int mingw_listen (int sockfd , int backlog )
2040
2172
{
2041
2173
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
2042
- return listen (s , backlog );
2174
+ WINSOCK_RETURN ( listen (s , backlog ) );
2043
2175
}
2044
2176
2045
2177
#undef accept
@@ -2050,6 +2182,11 @@ int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)
2050
2182
SOCKET s1 = (SOCKET )_get_osfhandle (sockfd1 );
2051
2183
SOCKET s2 = accept (s1 , sa , sz );
2052
2184
2185
+ if (s2 == INVALID_SOCKET ) {
2186
+ set_wsa_errno ();
2187
+ return -1 ;
2188
+ }
2189
+
2053
2190
/* convert into a file descriptor */
2054
2191
if ((sockfd2 = _open_osfhandle (s2 , O_RDWR |O_BINARY )) < 0 ) {
2055
2192
int err = errno ;
0 commit comments