mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-08-13 17:38:59 +00:00
FS-2746 --resolve large xmlrpc update thanks garmt
This commit is contained in:
71
libs/xmlrpc-c/Windows/socketpair.cpp
Normal file
71
libs/xmlrpc-c/Windows/socketpair.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
#include <winsock2.h>
|
||||
|
||||
|
||||
int
|
||||
xmlrpc_win32_socketpair(int const domain,
|
||||
int const type,
|
||||
int const protocol,
|
||||
SOCKET socks[2]) {
|
||||
bool error;
|
||||
|
||||
error = false; // initial value
|
||||
|
||||
SOCKET listener;
|
||||
listener = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (listener == INVALID_SOCKET)
|
||||
error = true;
|
||||
else {
|
||||
struct sockaddr_in addr;
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_addr.s_addr = htonl(0x7f000001);
|
||||
addr.sin_port = 0;
|
||||
|
||||
int rc;
|
||||
rc = bind(listener, (const struct sockaddr*) &addr, sizeof(addr));
|
||||
if (rc == SOCKET_ERROR)
|
||||
error = true;
|
||||
else {
|
||||
int addrlen;
|
||||
int rc;
|
||||
addrlen = sizeof(addr); // initial value
|
||||
rc = getsockname(listener, (struct sockaddr*) &addr, &addrlen);
|
||||
if (rc == SOCKET_ERROR)
|
||||
error = true;
|
||||
else {
|
||||
int rc;
|
||||
|
||||
rc = listen(listener, 1);
|
||||
if (rc == SOCKET_ERROR)
|
||||
error = true;
|
||||
else {
|
||||
socks[0] = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (socks[0] == INVALID_SOCKET)
|
||||
error = true;
|
||||
else {
|
||||
int rc;
|
||||
rc = connect(socks[0],
|
||||
(const struct sockaddr*) &addr,
|
||||
sizeof(addr));
|
||||
if (rc == SOCKET_ERROR)
|
||||
error = true;
|
||||
else {
|
||||
socks[1] = accept(listener, NULL, NULL);
|
||||
if (socks[1] == INVALID_SOCKET)
|
||||
error = true;
|
||||
}
|
||||
if (error)
|
||||
closesocket(socks[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
closesocket(listener);
|
||||
}
|
||||
|
||||
return error ? -1 : 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user