Skip to content

Commit

Permalink
MFH: Windows support for stream_socket_pair(), by moving the socketpa…
Browse files Browse the repository at this point in the history
…ir() implementation from ext/sockets to win32/
  • Loading branch information
KalleZ committed Jan 23, 2009
1 parent 2a4fc75 commit 73b1740
Show file tree
Hide file tree
Showing 11 changed files with 48 additions and 52 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion ext/sockets/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
9 changes: 8 additions & 1 deletion ext/sockets/php_sockets.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
17 changes: 13 additions & 4 deletions ext/sockets/sockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions ext/standard/streamsfuncs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
5 changes: 4 additions & 1 deletion ext/standard/streamsfuncs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 2 additions & 5 deletions ext/standard/tests/streams/stream_socket_pair.phpt
Original file line number Diff line number Diff line change
@@ -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")));
Expand Down
2 changes: 1 addition & 1 deletion win32/build/config.w32
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
3 changes: 3 additions & 0 deletions win32/build/config.w32.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
28 changes: 12 additions & 16 deletions ext/sockets/php_sockets_win.c → win32/sockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
25 changes: 2 additions & 23 deletions ext/sockets/php_sockets_win.h → win32/sockets.h
Original file line number Diff line number Diff line change
Expand Up @@ -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]);

0 comments on commit 73b1740

Please sign in to comment.