@@ -1780,26 +1780,158 @@ static void ensure_socket_initialization(void)
1780
1780
initialized = 1 ;
1781
1781
}
1782
1782
1783
+ static int winsock_error_to_errno (DWORD err )
1784
+ {
1785
+ switch (err ) {
1786
+ case WSAEINTR : return EINTR ;
1787
+ case WSAEBADF : return EBADF ;
1788
+ case WSAEACCES : return EACCES ;
1789
+ case WSAEFAULT : return EFAULT ;
1790
+ case WSAEINVAL : return EINVAL ;
1791
+ case WSAEMFILE : return EMFILE ;
1792
+ case WSAEWOULDBLOCK : return EWOULDBLOCK ;
1793
+ case WSAEINPROGRESS : return EINPROGRESS ;
1794
+ case WSAEALREADY : return EALREADY ;
1795
+ case WSAENOTSOCK : return ENOTSOCK ;
1796
+ case WSAEDESTADDRREQ : return EDESTADDRREQ ;
1797
+ case WSAEMSGSIZE : return EMSGSIZE ;
1798
+ case WSAEPROTOTYPE : return EPROTOTYPE ;
1799
+ case WSAENOPROTOOPT : return ENOPROTOOPT ;
1800
+ case WSAEPROTONOSUPPORT : return EPROTONOSUPPORT ;
1801
+ case WSAEOPNOTSUPP : return EOPNOTSUPP ;
1802
+ case WSAEAFNOSUPPORT : return EAFNOSUPPORT ;
1803
+ case WSAEADDRINUSE : return EADDRINUSE ;
1804
+ case WSAEADDRNOTAVAIL : return EADDRNOTAVAIL ;
1805
+ case WSAENETDOWN : return ENETDOWN ;
1806
+ case WSAENETUNREACH : return ENETUNREACH ;
1807
+ case WSAENETRESET : return ENETRESET ;
1808
+ case WSAECONNABORTED : return ECONNABORTED ;
1809
+ case WSAECONNRESET : return ECONNRESET ;
1810
+ case WSAENOBUFS : return ENOBUFS ;
1811
+ case WSAEISCONN : return EISCONN ;
1812
+ case WSAENOTCONN : return ENOTCONN ;
1813
+ case WSAETIMEDOUT : return ETIMEDOUT ;
1814
+ case WSAECONNREFUSED : return ECONNREFUSED ;
1815
+ case WSAELOOP : return ELOOP ;
1816
+ case WSAENAMETOOLONG : return ENAMETOOLONG ;
1817
+ case WSAEHOSTUNREACH : return EHOSTUNREACH ;
1818
+ case WSAENOTEMPTY : return ENOTEMPTY ;
1819
+ /* No errno equivalent; default to EIO */
1820
+ case WSAESOCKTNOSUPPORT :
1821
+ case WSAEPFNOSUPPORT :
1822
+ case WSAESHUTDOWN :
1823
+ case WSAETOOMANYREFS :
1824
+ case WSAEHOSTDOWN :
1825
+ case WSAEPROCLIM :
1826
+ case WSAEUSERS :
1827
+ case WSAEDQUOT :
1828
+ case WSAESTALE :
1829
+ case WSAEREMOTE :
1830
+ case WSASYSNOTREADY :
1831
+ case WSAVERNOTSUPPORTED :
1832
+ case WSANOTINITIALISED :
1833
+ case WSAEDISCON :
1834
+ case WSAENOMORE :
1835
+ case WSAECANCELLED :
1836
+ case WSAEINVALIDPROCTABLE :
1837
+ case WSAEINVALIDPROVIDER :
1838
+ case WSAEPROVIDERFAILEDINIT :
1839
+ case WSASYSCALLFAILURE :
1840
+ case WSASERVICE_NOT_FOUND :
1841
+ case WSATYPE_NOT_FOUND :
1842
+ case WSA_E_NO_MORE :
1843
+ case WSA_E_CANCELLED :
1844
+ case WSAEREFUSED :
1845
+ case WSAHOST_NOT_FOUND :
1846
+ case WSATRY_AGAIN :
1847
+ case WSANO_RECOVERY :
1848
+ case WSANO_DATA :
1849
+ case WSA_QOS_RECEIVERS :
1850
+ case WSA_QOS_SENDERS :
1851
+ case WSA_QOS_NO_SENDERS :
1852
+ case WSA_QOS_NO_RECEIVERS :
1853
+ case WSA_QOS_REQUEST_CONFIRMED :
1854
+ case WSA_QOS_ADMISSION_FAILURE :
1855
+ case WSA_QOS_POLICY_FAILURE :
1856
+ case WSA_QOS_BAD_STYLE :
1857
+ case WSA_QOS_BAD_OBJECT :
1858
+ case WSA_QOS_TRAFFIC_CTRL_ERROR :
1859
+ case WSA_QOS_GENERIC_ERROR :
1860
+ case WSA_QOS_ESERVICETYPE :
1861
+ case WSA_QOS_EFLOWSPEC :
1862
+ case WSA_QOS_EPROVSPECBUF :
1863
+ case WSA_QOS_EFILTERSTYLE :
1864
+ case WSA_QOS_EFILTERTYPE :
1865
+ case WSA_QOS_EFILTERCOUNT :
1866
+ case WSA_QOS_EOBJLENGTH :
1867
+ case WSA_QOS_EFLOWCOUNT :
1868
+ #ifndef _MSC_VER
1869
+ case WSA_QOS_EUNKNOWNPSOBJ :
1870
+ #endif
1871
+ case WSA_QOS_EPOLICYOBJ :
1872
+ case WSA_QOS_EFLOWDESC :
1873
+ case WSA_QOS_EPSFLOWSPEC :
1874
+ case WSA_QOS_EPSFILTERSPEC :
1875
+ case WSA_QOS_ESDMODEOBJ :
1876
+ case WSA_QOS_ESHAPERATEOBJ :
1877
+ case WSA_QOS_RESERVED_PETYPE :
1878
+ default : return EIO ;
1879
+ }
1880
+ }
1881
+
1882
+ /*
1883
+ * On Windows, `errno` is a global macro to a function call.
1884
+ * This makes it difficult to debug and single-step our mappings.
1885
+ */
1886
+ static inline void set_wsa_errno (void )
1887
+ {
1888
+ DWORD wsa = WSAGetLastError ();
1889
+ int e = winsock_error_to_errno (wsa );
1890
+ errno = e ;
1891
+
1892
+ #ifdef DEBUG_WSA_ERRNO
1893
+ fprintf (stderr , "winsock error: %d -> %d\n" , wsa , e );
1894
+ fflush (stderr );
1895
+ #endif
1896
+ }
1897
+
1898
+ static inline int winsock_return (int ret )
1899
+ {
1900
+ if (ret < 0 )
1901
+ set_wsa_errno ();
1902
+
1903
+ return ret ;
1904
+ }
1905
+
1906
+ #define WINSOCK_RETURN (x ) do { return winsock_return(x); } while (0)
1907
+
1783
1908
#undef gethostname
1784
1909
int mingw_gethostname (char * name , int namelen )
1785
1910
{
1786
- ensure_socket_initialization ();
1787
- return gethostname (name , namelen );
1911
+ ensure_socket_initialization ();
1912
+ WINSOCK_RETURN ( gethostname (name , namelen ) );
1788
1913
}
1789
1914
1790
1915
#undef gethostbyname
1791
1916
struct hostent * mingw_gethostbyname (const char * host )
1792
1917
{
1918
+ struct hostent * ret ;
1919
+
1793
1920
ensure_socket_initialization ();
1794
- return gethostbyname (host );
1921
+
1922
+ ret = gethostbyname (host );
1923
+ if (!ret )
1924
+ set_wsa_errno ();
1925
+
1926
+ return ret ;
1795
1927
}
1796
1928
1797
1929
#undef getaddrinfo
1798
1930
int mingw_getaddrinfo (const char * node , const char * service ,
1799
1931
const struct addrinfo * hints , struct addrinfo * * res )
1800
1932
{
1801
1933
ensure_socket_initialization ();
1802
- return getaddrinfo (node , service , hints , res );
1934
+ WINSOCK_RETURN ( getaddrinfo (node , service , hints , res ) );
1803
1935
}
1804
1936
1805
1937
int mingw_socket (int domain , int type , int protocol )
@@ -1819,7 +1951,7 @@ int mingw_socket(int domain, int type, int protocol)
1819
1951
* in errno so that _if_ someone looks up the code somewhere,
1820
1952
* then it is at least the number that are usually listed.
1821
1953
*/
1822
- errno = WSAGetLastError ();
1954
+ set_wsa_errno ();
1823
1955
return -1 ;
1824
1956
}
1825
1957
/* convert into a file descriptor */
@@ -1835,35 +1967,35 @@ int mingw_socket(int domain, int type, int protocol)
1835
1967
int mingw_connect (int sockfd , struct sockaddr * sa , size_t sz )
1836
1968
{
1837
1969
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
1838
- return connect (s , sa , sz );
1970
+ WINSOCK_RETURN ( connect (s , sa , sz ) );
1839
1971
}
1840
1972
1841
1973
#undef bind
1842
1974
int mingw_bind (int sockfd , struct sockaddr * sa , size_t sz )
1843
1975
{
1844
1976
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
1845
- return bind (s , sa , sz );
1977
+ WINSOCK_RETURN ( bind (s , sa , sz ) );
1846
1978
}
1847
1979
1848
1980
#undef setsockopt
1849
1981
int mingw_setsockopt (int sockfd , int lvl , int optname , void * optval , int optlen )
1850
1982
{
1851
1983
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
1852
- return setsockopt (s , lvl , optname , (const char * )optval , optlen );
1984
+ WINSOCK_RETURN ( setsockopt (s , lvl , optname , (const char * )optval , optlen ) );
1853
1985
}
1854
1986
1855
1987
#undef shutdown
1856
1988
int mingw_shutdown (int sockfd , int how )
1857
1989
{
1858
1990
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
1859
- return shutdown (s , how );
1991
+ WINSOCK_RETURN ( shutdown (s , how ) );
1860
1992
}
1861
1993
1862
1994
#undef listen
1863
1995
int mingw_listen (int sockfd , int backlog )
1864
1996
{
1865
1997
SOCKET s = (SOCKET )_get_osfhandle (sockfd );
1866
- return listen (s , backlog );
1998
+ WINSOCK_RETURN ( listen (s , backlog ) );
1867
1999
}
1868
2000
1869
2001
#undef accept
@@ -1874,6 +2006,11 @@ int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)
1874
2006
SOCKET s1 = (SOCKET )_get_osfhandle (sockfd1 );
1875
2007
SOCKET s2 = accept (s1 , sa , sz );
1876
2008
2009
+ if (s2 == INVALID_SOCKET ) {
2010
+ set_wsa_errno ();
2011
+ return -1 ;
2012
+ }
2013
+
1877
2014
/* convert into a file descriptor */
1878
2015
if ((sockfd2 = _open_osfhandle (s2 , O_RDWR |O_BINARY )) < 0 ) {
1879
2016
int err = errno ;
0 commit comments