]> granicus.if.org Git - php/commitdiff
MFH: Windows support for stream_socket_pair(), by moving the socketpair() implementat...
authorKalle Sommer Nielsen <kalle@php.net>
Fri, 23 Jan 2009 15:49:49 +0000 (15:49 +0000)
committerKalle Sommer Nielsen <kalle@php.net>
Fri, 23 Jan 2009 15:49:49 +0000 (15:49 +0000)
NEWS
ext/sockets/config.w32
ext/sockets/php_sockets.h
ext/sockets/sockets.c
ext/standard/streamsfuncs.c
ext/standard/streamsfuncs.h
ext/standard/tests/streams/stream_socket_pair.phpt
win32/build/config.w32
win32/build/config.w32.h.in
win32/sockets.c [moved from ext/sockets/php_sockets_win.c with 85% similarity]
win32/sockets.h [moved from ext/sockets/php_sockets_win.h with 75% similarity]

diff --git a/NEWS b/NEWS
index 9421e933efde69b2863b8ee1e6a0f9e32609cd3a..0a4610eb30abdf2ee00daedfcdb037108b19afa4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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)
 
index 3e44356fe791623e216f922713ed254aa4523981..1672f85b156022043fc88fb71c9c27252dd3af7f 100644 (file)
@@ -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");
index f0c9cc5203aca5b02188bff16616c1e3c2244919..aebe3ea4bf03204e7e049a6ec69aa5636dc3782a 100644 (file)
@@ -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);
index d53b8f5b4c68db645ecb37853f857778c462b092..64347ea1e65915c807c7b4daa5a9def8b0658b6b 100644 (file)
 # 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)
index 5220cc1555f156557cd5b1d4e61a8f5bee0b4727..cdb420c0f73510fd2244d4840f273d413a46635a 100644 (file)
@@ -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
 
index 19e2c1ef15e094b63e031773adaa4ba3cd55fe77..a3052bac63bc31855f5fbf9b8d4832dfb6fde3c6 100644 (file)
@@ -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
index 5556d8e22c738090bfa8461cfa0382c2fada4481..203ae982d1c211113248ebd6147e8d27799aca16 100644 (file)
@@ -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")));
index 44912927aca3df8d3fadd8ab1ebb6957e2c18323..57c53a3a579b43492a662039bf2e1eee60fa21c2 100644 (file)
@@ -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) {
index db05b6b62762f1009c8d31baffa4618fd0583a7b..efd56d8522d05642c5c509f72498bdc2709b4c3d 100644 (file)
 /* 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
 
similarity index 85%
rename from ext/sockets/php_sockets_win.c
rename to win32/sockets.c
index 809b79c5577b35fba61a93cea82de9b186ec6a47..63fe26ac741eef3263006fd0b3a1420cbc8f9a17 100644 (file)
 
 /* $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
similarity index 75%
rename from ext/sockets/php_sockets_win.h
rename to win32/sockets.h
index f7e7c55e7857eafff2add87430e020bcfec0adc5..0d8bb07c8a29feb6e122d8f34cf713aa5e828ec6 100644 (file)
 
 /* $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