diff options
author | Kalle Sommer Nielsen <kalle@php.net> | 2009-01-23 15:49:49 +0000 |
---|---|---|
committer | Kalle Sommer Nielsen <kalle@php.net> | 2009-01-23 15:49:49 +0000 |
commit | 73b17408fbf06215c41e045d1a0a6fb55d10b1e7 (patch) | |
tree | b03ba7cdcab826b6a0bbbb204513ed73ff81afa9 | |
parent | 2a4fc75c5432463fbea83b3c112dac8b5110df8c (diff) | |
download | php-git-73b17408fbf06215c41e045d1a0a6fb55d10b1e7.tar.gz |
MFH: Windows support for stream_socket_pair(), by moving the socketpair() implementation from ext/sockets to win32/
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | ext/sockets/config.w32 | 2 | ||||
-rw-r--r-- | ext/sockets/php_sockets.h | 9 | ||||
-rw-r--r-- | ext/sockets/sockets.c | 17 | ||||
-rw-r--r-- | ext/standard/streamsfuncs.c | 1 | ||||
-rw-r--r-- | ext/standard/streamsfuncs.h | 5 | ||||
-rw-r--r-- | ext/standard/tests/streams/stream_socket_pair.phpt | 7 | ||||
-rw-r--r-- | win32/build/config.w32 | 2 | ||||
-rw-r--r-- | win32/build/config.w32.h.in | 3 | ||||
-rw-r--r-- | win32/sockets.c (renamed from ext/sockets/php_sockets_win.c) | 28 | ||||
-rw-r--r-- | win32/sockets.h (renamed from ext/sockets/php_sockets_win.h) | 25 |
11 files changed, 48 insertions, 52 deletions
@@ -43,6 +43,7 @@ PHP NEWS - Added ICU support to SQLite3 when using the bundled version. (Scott) - Added pixelation support in imagefilter(). (Takeshi Abe, Kalle) - Added SplObjectStorage::addAll/removeAll. (Etienne) +- Added Windows support for stream_socket_pair(). (Kalle) - Re-added socket_create_pair() for Windows in sockets extension. (Kalle) diff --git a/ext/sockets/config.w32 b/ext/sockets/config.w32 index 3e44356fe7..1672f85b15 100644 --- a/ext/sockets/config.w32 +++ b/ext/sockets/config.w32 @@ -6,7 +6,7 @@ ARG_ENABLE("sockets", "SOCKETS support", "no"); if (PHP_SOCKETS != "no") { if (CHECK_LIB("ws2_32.lib", "sockets", PHP_SOCKETS) && CHECK_HEADER_ADD_INCLUDE("winsock.h", "CFLAGS_SOCKETS")) { - EXTENSION('sockets', 'sockets.c php_sockets_win.c'); + EXTENSION('sockets', 'sockets.c'); AC_DEFINE('HAVE_SOCKETS', 1); } else { WARNING("sockets not enabled; libraries and headers not found"); diff --git a/ext/sockets/php_sockets.h b/ext/sockets/php_sockets.h index f0c9cc5203..aebe3ea4bf 100644 --- a/ext/sockets/php_sockets.h +++ b/ext/sockets/php_sockets.h @@ -43,7 +43,7 @@ PHP_RSHUTDOWN_FUNCTION(sockets); PHP_FUNCTION(socket_select); PHP_FUNCTION(socket_create_listen); -#if defined(HAVE_SOCKETPAIR) || defined(PHP_WIN32) +#ifdef PHP_WIN32 PHP_FUNCTION(socket_create_pair); #endif PHP_FUNCTION(socket_accept); @@ -84,6 +84,13 @@ typedef struct { int blocking; } php_socket; +#ifdef PHP_WIN32 +struct sockaddr_un { + short sun_family; + char sun_path[108]; +}; +#endif + /* Prototypes */ #ifdef ilia_0 /* not needed, only causes a compiler warning */ static int php_open_listen_sock(php_socket **php_sock, int port, int backlog TSRMLS_DC); diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index d53b8f5b4c..64347ea1e6 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -39,8 +39,17 @@ # include <windows.h> # include <Ws2tcpip.h> # include "php_sockets.h" -# include "php_sockets_win.h" +# include "win32/sockets.h" # define IS_INVALID_SOCKET(a) (a->bsd_socket == INVALID_SOCKET) +# define EPROTONOSUPPORT WSAEPROTONOSUPPORT +# define ECONNRESET WSAECONNRESET +# ifdef errno +# undef errno +# endif +# define errno WSAGetLastError() +# define h_errno WSAGetLastError() +# define set_errno(a) WSASetLastError(a) +# define close(a) closesocket(a) #else # include "php_sockets.h" # include <sys/types.h> @@ -223,7 +232,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_socket_set_option, 0, 0, 4) ZEND_ARG_INFO(0, optval) ZEND_END_ARG_INFO() -#if defined(HAVE_SOCKETPAIR) || defined(PHP_WIN32) +#ifdef HAVE_SOCKETPAIR ZEND_BEGIN_ARG_INFO_EX(arginfo_socket_create_pair, 0, 0, 4) ZEND_ARG_INFO(0, domain) ZEND_ARG_INFO(0, type) @@ -254,7 +263,7 @@ const zend_function_entry sockets_functions[] = { PHP_FE(socket_select, arginfo_socket_select) PHP_FE(socket_create, arginfo_socket_create) PHP_FE(socket_create_listen, arginfo_socket_create_listen) -#if defined(HAVE_SOCKETPAIR) || defined(PHP_WIN32) +#ifdef HAVE_SOCKETPAIR PHP_FE(socket_create_pair, arginfo_socket_create_pair) #endif PHP_FE(socket_accept, arginfo_socket_accept) @@ -1867,7 +1876,7 @@ PHP_FUNCTION(socket_set_option) } /* }}} */ -#if defined(HAVE_SOCKETPAIR) || defined(PHP_WIN32) +#ifdef HAVE_SOCKETPAIR /* {{{ proto bool socket_create_pair(int domain, int type, int protocol, array &fd) U Creates a pair of indistinguishable sockets and stores them in fds. */ PHP_FUNCTION(socket_create_pair) diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 5220cc1555..cdb420c0f7 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -36,6 +36,7 @@ typedef unsigned long long php_timeout_ull; #else #include "win32/select.h" +#include "win32/sockets.h" typedef unsigned __int64 php_timeout_ull; #endif diff --git a/ext/standard/streamsfuncs.h b/ext/standard/streamsfuncs.h index 19e2c1ef15..a3052bac63 100644 --- a/ext/standard/streamsfuncs.h +++ b/ext/standard/streamsfuncs.h @@ -56,10 +56,13 @@ PHP_FUNCTION(stream_filter_append); PHP_FUNCTION(stream_filter_remove); PHP_FUNCTION(stream_socket_enable_crypto); PHP_FUNCTION(stream_socket_shutdown); -PHP_FUNCTION(stream_socket_pair); PHP_FUNCTION(stream_is_local); PHP_FUNCTION(stream_supports_lock); +#if HAVE_SOCKETPAIR +PHP_FUNCTION(stream_socket_pair); +#endif + /* * Local variables: * tab-width: 4 diff --git a/ext/standard/tests/streams/stream_socket_pair.phpt b/ext/standard/tests/streams/stream_socket_pair.phpt index 5556d8e22c..203ae982d1 100644 --- a/ext/standard/tests/streams/stream_socket_pair.phpt +++ b/ext/standard/tests/streams/stream_socket_pair.phpt @@ -1,12 +1,9 @@ --TEST-- stream_socket_pair() ---SKIPIF-- -<?php -if (substr(PHP_OS, 0, 3) == 'WIN') die("skip: non windows test"); -?> --FILE-- <?php -$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0); +$domain = (strtoupper(substr(PHP_OS, 0, 3) == 'WIN') ? STREAM_PF_INET : STREAM_PF_UNIX); +$sockets = stream_socket_pair($domain, STREAM_SOCK_STREAM, 0); var_dump($sockets); fwrite($sockets[0], b"foo"); var_dump(fread($sockets[1], strlen(b"foo"))); diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 44912927ac..57c53a3a57 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -317,7 +317,7 @@ ADD_SOURCES("main", "main.c snprintf.c spprintf.c safe_mode.c getopt.c fopen_wra php_scandir.c php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \ strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c network.c \ php_open_temporary_file.c php_logos.c output.c internal_functions.c php_sprintf.c"); -ADD_SOURCES("win32", "inet.c fnmatch.c"); +ADD_SOURCES("win32", "inet.c fnmatch.c sockets.c"); // Newer versions have it if (VCVERS <= 1300) { diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index db05b6b627..efd56d8522 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -147,6 +147,9 @@ /* Win32 supports strcoll */ #define HAVE_STRCOLL 1 +/* Win32 supports socketpair by the emulation in win32/sockets.c */ +#define HAVE_SOCKETPAIR 1 + /* Win32 support proc_open */ #define PHP_CAN_SUPPORT_PROC_OPEN 1 diff --git a/ext/sockets/php_sockets_win.c b/win32/sockets.c index 809b79c557..63fe26ac74 100644 --- a/ext/sockets/php_sockets_win.c +++ b/win32/sockets.c @@ -21,36 +21,34 @@ /* $Id$ */ - -#ifdef PHP_WIN32 +/* Code originally from ext/sockets */ #include <stdio.h> #include <fcntl.h> #include "php.h" -#include "php_sockets.h" -#include "php_sockets_win.h" -int socketpair(int domain, int type, int protocol, SOCKET sock[2]) { +PHPAPI int socketpair(int domain, int type, int protocol, SOCKET sock[2]) +{ struct sockaddr_in address; SOCKET redirect; int size = sizeof(address); if(domain != AF_INET) { - set_errno(WSAENOPROTOOPT); + WSASetLastError(WSAENOPROTOOPT); return -1; } - sock[0] = socket(domain, type, protocol); - address.sin_addr.s_addr = INADDR_ANY; + 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)); - if(getsockname(sock[0], (struct sockaddr *)&address, &size) != 0) { - } + if(getsockname(sock[0], (struct sockaddr *)&address, &size) != 0) { + } listen(sock[0], 2); sock[1] = socket(domain, type, protocol); @@ -59,17 +57,15 @@ int socketpair(int domain, int type, int protocol, SOCKET sock[2]) { connect(sock[1], (struct sockaddr*)&address, sizeof(address)); redirect = accept(sock[0],(struct sockaddr*)&address, &size); - close(sock[0]); + closesocket(sock[0]); sock[0] = redirect; if(sock[0] == INVALID_SOCKET ) { - close(sock[0]); - close(sock[1]); - set_errno(WSAECONNABORTED); + closesocket(sock[0]); + closesocket(sock[1]); + WSASetLastError(WSAECONNABORTED); return -1; } return 0; } - -#endif diff --git a/ext/sockets/php_sockets_win.h b/win32/sockets.h index f7e7c55e78..0d8bb07c8a 100644 --- a/ext/sockets/php_sockets_win.h +++ b/win32/sockets.h @@ -21,27 +21,6 @@ /* $Id$ */ +/* Code originally from ext/sockets */ -#ifdef PHP_WIN32 - -#define EPROTONOSUPPORT WSAEPROTONOSUPPORT -#define ECONNRESET WSAECONNRESET - -#ifdef errno -#undef errno -#endif - -#define errno WSAGetLastError() -#define h_errno WSAGetLastError() -#define set_errno(a) WSASetLastError(a) -#define close(a) closesocket(a) - -struct sockaddr_un { - short sun_family; - char sun_path[108]; -}; - -int socketpair(int domain, int type, int protocol, SOCKET sock[2]); -int inet_aton(const char *cp, struct in_addr *inp); - -#endif +PHPAPI int socketpair(int domain, int type, int protocol, SOCKET sock[2]);
\ No newline at end of file |