summaryrefslogtreecommitdiff
path: root/win32/sockets.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2013-04-22 18:53:52 +0200
committerAnatol Belski <ab@php.net>2013-04-22 18:55:32 +0200
commitf082d6311b7998987f018fc6c791dd1892f2912a (patch)
tree2de4f3b2ac3c20e18c7e2d7686c8f3656e06ed23 /win32/sockets.c
parent70b67f2e509ca05e60c85cc14c1b82b107713604 (diff)
downloadphp-git-f082d6311b7998987f018fc6c791dd1892f2912a.tar.gz
Fixed stream_socket_pair() on Windows x64 and
improved errorhandling in the socketpair() implementation.
Diffstat (limited to 'win32/sockets.c')
-rw-r--r--win32/sockets.c51
1 files changed, 36 insertions, 15 deletions
diff --git a/win32/sockets.c b/win32/sockets.c
index d64280870f..c8fddd6e52 100644
--- a/win32/sockets.c
+++ b/win32/sockets.c
@@ -39,33 +39,54 @@ PHPAPI int socketpair(int domain, int type, int protocol, SOCKET sock[2])
return -1;
}
+ sock[0] = sock[1] = redirect = INVALID_SOCKET;
- sock[0] = socket(domain, type, protocol);
- address.sin_addr.s_addr = INADDR_ANY;
- address.sin_family = AF_INET;
- address.sin_port = 0;
- bind(sock[0], (struct sockaddr*)&address, sizeof(address));
+ sock[0] = socket(domain, type, protocol);
+ if (INVALID_SOCKET == sock[0]) {
+ goto error;
+ }
+
+ address.sin_addr.s_addr = INADDR_ANY;
+ address.sin_family = AF_INET;
+ address.sin_port = 0;
+
+ if (bind(sock[0], (struct sockaddr*)&address, sizeof(address)) != 0) {
+ goto error;
+ }
if(getsockname(sock[0], (struct sockaddr *)&address, &size) != 0) {
+ goto error;
+ }
+
+ if (listen(sock[0], 2) != 0) {
+ goto error;
+ }
+
+ sock[1] = socket(domain, type, protocol);
+ if (INVALID_SOCKET == sock[1]) {
+ goto error;
}
- listen(sock[0], 2);
- sock[1] = socket(domain, type, protocol);
address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ if(connect(sock[1], (struct sockaddr*)&address, sizeof(address)) != 0) {
+ goto error;
+ }
- connect(sock[1], (struct sockaddr*)&address, sizeof(address));
redirect = accept(sock[0],(struct sockaddr*)&address, &size);
+ if (INVALID_SOCKET == redirect) {
+ goto error;
+ }
closesocket(sock[0]);
sock[0] = redirect;
- if(sock[0] == INVALID_SOCKET ) {
- closesocket(sock[0]);
- closesocket(sock[1]);
- WSASetLastError(WSAECONNABORTED);
- return -1;
- }
-
return 0;
+
+error:
+ closesocket(redirect);
+ closesocket(sock[0]);
+ closesocket(sock[1]);
+ WSASetLastError(WSAECONNABORTED);
+ return -1;
}