diff --git a/dummy_headers/windows.h b/dummy_headers/windows.h index e53a0bf..4b08901 100644 --- a/dummy_headers/windows.h +++ b/dummy_headers/windows.h @@ -1,5 +1,6 @@ typedef void* SOCKET; typedef unsigned int DWORD; +typedef unsigned int GROUP; #define WSA_FLAG_OVERLAPPED 1 extern void WSASetLastError(int); extern int WSAGetLastError(); @@ -8,7 +9,7 @@ extern int WSAGetLastError(); #define AF_INET 33 #define SOCK_STREAM 44 #define IPPROTO_TCP 55 -#define INVALID_SOCKET 0 +#define INVALID_SOCKET (SOCKET)(~0) extern void* socket(int, int, int); struct sockaddr_in { int sin_family; @@ -16,16 +17,15 @@ struct sockaddr_in { unsigned short sin_port; }; struct sockaddr { int dummy; }; -typedef unsigned socklen_t; #define SOL_SOCKET 66 #define SO_REUSEADDR 77 #define INADDR_LOOPBACK 88 -extern int setsockopt(SOCKET, int, int, char*, unsigned); -extern int bind(SOCKET, struct sockaddr*, unsigned); -extern int getsockname(SOCKET, struct sockaddr*, socklen_t*); +extern int setsockopt(SOCKET, int, int, const char*, int); +extern int bind(SOCKET, const struct sockaddr*, int); +extern int getsockname(SOCKET, struct sockaddr*, int*); extern int listen(SOCKET, int); -extern SOCKET WSASocket(int, int, int, void*, int, int); -extern int connect(SOCKET, struct sockaddr*, unsigned); -extern SOCKET accept(SOCKET, void*, void*); +extern SOCKET WSASocket(int, int, int, void*, GROUP, DWORD); +extern int connect(SOCKET, const struct sockaddr*, int); +extern SOCKET accept(SOCKET, struct sockaddr*, int*); extern int closesocket(SOCKET); -extern unsigned htonl(unsigned); +extern unsigned long htonl(unsigned long); diff --git a/dummy_headers/ws2tcpip.h b/dummy_headers/winsock2.h similarity index 100% rename from dummy_headers/ws2tcpip.h rename to dummy_headers/winsock2.h diff --git a/socketpair.c b/socketpair.c index ededc9f..38e8d04 100644 --- a/socketpair.c +++ b/socketpair.c @@ -26,6 +26,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Changes: + * 2022-11-04: align types of arguments and return value of Windows Sockets 2 + * functions with Muicrosoft documentation * 2014-02-12: merge David Woodhouse, Ger Hobbelt improvements * git.infradead.org/users/dwmw2/openconnect.git/commitdiff/bdeefa54 * github.com/GerHobbelt/selectable-socketpair @@ -51,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #ifdef WIN32 -# include /* socklen_t, et al (MSVC20xx) */ +# include # include # include #else @@ -77,19 +79,19 @@ int dumb_socketpair(SOCKET socks[2], int make_overlapped) struct sockaddr addr; } a; SOCKET listener; - int e; - socklen_t addrlen = sizeof(a.inaddr); + int addrlen = (int) sizeof(a.inaddr); DWORD flags = (make_overlapped ? WSA_FLAG_OVERLAPPED : 0); - int reuse = 1; + DWORD reuse = 1; + int e; if (socks == 0) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } - socks[0] = socks[1] = -1; + socks[0] = socks[1] = INVALID_SOCKET; listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (listener == -1) + if (listener == INVALID_SOCKET) return SOCKET_ERROR; memset(&a, 0, sizeof(a)); @@ -99,9 +101,9 @@ int dumb_socketpair(SOCKET socks[2], int make_overlapped) for (;;) { if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, - (char*) &reuse, (socklen_t) sizeof(reuse)) == -1) + (const char*) &reuse, (int) sizeof(reuse)) == SOCKET_ERROR) break; - if (bind(listener, &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR) + if (bind(listener, &a.addr, (int) sizeof(a.inaddr)) == SOCKET_ERROR) break; memset(&a, 0, sizeof(a)); @@ -116,13 +118,13 @@ int dumb_socketpair(SOCKET socks[2], int make_overlapped) break; socks[0] = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, flags); - if (socks[0] == -1) + if (socks[0] == INVALID_SOCKET) break; - if (connect(socks[0], &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR) + if (connect(socks[0], &a.addr, (int) sizeof(a.inaddr)) == SOCKET_ERROR) break; socks[1] = accept(listener, NULL, NULL); - if (socks[1] == -1) + if (socks[1] == INVALID_SOCKET) break; closesocket(listener); @@ -134,7 +136,7 @@ int dumb_socketpair(SOCKET socks[2], int make_overlapped) closesocket(socks[0]); closesocket(socks[1]); WSASetLastError(e); - socks[0] = socks[1] = -1; + socks[0] = socks[1] = INVALID_SOCKET; return SOCKET_ERROR; } #else