mirror of
https://github.com/php/php-src.git
synced 2024-12-12 19:33:31 +08:00
Windows support for stream_socket_pair(), by moving the socketpair() implementation from ext/sockets to win32/
This commit is contained in:
parent
8a81441f6a
commit
6776d26fdc
@ -6,7 +6,7 @@ ARG_ENABLE("sockets", "SOCKETS support", "no");
|
||||
if (PHP_SOCKETS != "no") {
|
||||
|
||||
if (CHECK_LIB("ws2_32.lib", "sockets", PHP_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");
|
||||
|
@ -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 HAVE_SOCKETPAIR
|
||||
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);
|
||||
|
@ -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)
|
||||
@ -1857,7 +1866,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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -57,11 +57,14 @@ PHP_FUNCTION(stream_filter_remove);
|
||||
PHP_FUNCTION(stream_encoding);
|
||||
PHP_FUNCTION(stream_socket_enable_crypto);
|
||||
PHP_FUNCTION(stream_socket_shutdown);
|
||||
PHP_FUNCTION(stream_socket_pair);
|
||||
PHP_FUNCTION(stream_resolve_include_path);
|
||||
PHP_FUNCTION(stream_is_local);
|
||||
PHP_FUNCTION(stream_supports_lock);
|
||||
|
||||
#if HAVE_SOCKETPAIR
|
||||
PHP_FUNCTION(stream_socket_pair);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
|
@ -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")));
|
||||
|
@ -351,7 +351,7 @@ ADD_SOURCES("main", "main.c snprintf.c spprintf.c fopen_wrappers.c \
|
||||
php_open_temporary_file.c php_logos.c output.c internal_functions.c php_sprintf.c \
|
||||
getopt.c");
|
||||
|
||||
ADD_SOURCES("win32", "inet.c fnmatch.c");
|
||||
ADD_SOURCES("win32", "inet.c fnmatch.c sockets.c");
|
||||
|
||||
// Newer versions have it
|
||||
if (VCVERS <= 1300) {
|
||||
|
@ -146,6 +146,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
|
||||
|
||||
|
@ -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
|
@ -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]);
|
Loading…
Reference in New Issue
Block a user