| 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; | |
| } | |