Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows sockets 2 #5

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions dummy_headers/windows.h
Original file line number Diff line number Diff line change
@@ -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();
Expand All @@ -8,24 +9,23 @@ 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;
struct { unsigned s_addr; } sin_addr;
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);
File renamed without changes.
26 changes: 14 additions & 12 deletions socketpair.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -51,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string.h>

#ifdef WIN32
# include <ws2tcpip.h> /* socklen_t, et al (MSVC20xx) */
# include <winsock2.h>
# include <windows.h>
# include <io.h>
#else
Expand All @@ -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));
Expand All @@ -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));
Expand All @@ -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);
Expand All @@ -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
Expand Down