mirror of
https://github.com/php/php-src.git
synced 2025-08-15 13:38:49 +02:00
A add much more useful select(2) implementation than is provided by
windows sockets. The winsock implementation will only work with sockets; our implementation works with sockets and file descriptors. By association, stream_select() will now operate correctly with files, pipes and sockets. This change required linking against the winsock2 library. In terms of compatibility, only older versions of windows 95 do not have winsock2 installed by default. It is available as a redistributable file, and is most likely installed by any OS patches (eg: Internet Explorer) applied by the user. Also, add a win32 compatible pipe test when opening a stream from a pipe. This test will only work on NT, win2k and XP platforms. Without this test, interleaved fread() and select() calls would cause the read buffer to be clobbered. I will be working on a fix for this issue for win9x.
This commit is contained in:
parent
5edec2a910
commit
0a18a9d744
30 changed files with 225 additions and 43 deletions
|
@ -30,7 +30,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
#include "ext/standard/php_string.h"
|
#include "ext/standard/php_string.h"
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#else
|
#else
|
||||||
#include <php_config.h>
|
#include <php_config.h>
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
#ifdef USE_WINSOCK /* Modified to use Winsock (NOVSOCK2.H), atleast for now */
|
#ifdef USE_WINSOCK /* Modified to use Winsock (NOVSOCK2.H), atleast for now */
|
||||||
#include <novsock2.h>
|
#include <novsock2.h>
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
# include <winsock.h>
|
# include <winsock2.h>
|
||||||
# define EWOULDBLOCK WSAEWOULDBLOCK
|
# define EWOULDBLOCK WSAEWOULDBLOCK
|
||||||
# define ETIMEDOUT WSAETIMEDOUT
|
# define ETIMEDOUT WSAETIMEDOUT
|
||||||
# define bcopy memcpy
|
# define bcopy memcpy
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
#include "SAPI.h"
|
#include "SAPI.h"
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HYPERWAVE
|
#if HYPERWAVE
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "win32/sendmail.h"
|
#include "win32/sendmail.h"
|
||||||
MAILSTREAM DEFAULTPROTO;
|
MAILSTREAM DEFAULTPROTO;
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if HAVE_NSLDAP
|
#if HAVE_NSLDAP
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#endif
|
#endif
|
||||||
#define strdup _strdup
|
#define strdup _strdup
|
||||||
#undef WINDOWS
|
#undef WINDOWS
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
#include "ext/standard/info.h"
|
#include "ext/standard/info.h"
|
||||||
#include "ext/standard/basic_functions.h"
|
#include "ext/standard/basic_functions.h"
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include "winsock.h"
|
#include "winsock2.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void cal_close_it(zend_rsrc_list_entry *rsrc TSRMLS_DC);
|
static void cal_close_it(zend_rsrc_list_entry *rsrc TSRMLS_DC);
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#if HAVE_MYSQL
|
#if HAVE_MYSQL
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
# include <winsock.h>
|
# include <winsock2.h>
|
||||||
# define signal(a, b) NULL
|
# define signal(a, b) NULL
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
# include <sys/socket.h>
|
# include <sys/socket.h>
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#include "php_ini.h"
|
#include "php_ini.h"
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
|
|
||||||
#define ODBC_TYPE "Win32"
|
#define ODBC_TYPE "Win32"
|
||||||
#define PHP_ODBC_TYPE ODBC_TYPE
|
#define PHP_ODBC_TYPE ODBC_TYPE
|
||||||
|
|
|
@ -56,13 +56,13 @@
|
||||||
|
|
||||||
#define _WIN32_DCOM
|
#define _WIN32_DCOM
|
||||||
|
|
||||||
|
#include "php.h"
|
||||||
|
#include "php_ini.h"
|
||||||
|
|
||||||
#include <iostream.h>
|
#include <iostream.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <ocidl.h>
|
#include <ocidl.h>
|
||||||
|
|
||||||
#include "php.h"
|
|
||||||
#include "php_ini.h"
|
|
||||||
|
|
||||||
#include "../rpc.h"
|
#include "../rpc.h"
|
||||||
#include "../php_rpc.h"
|
#include "../php_rpc.h"
|
||||||
#include "../handler.h"
|
#include "../handler.h"
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include "win32/time.h"
|
#include "win32/time.h"
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#include "resolv.h"
|
#include "resolv.h"
|
||||||
#endif
|
#endif
|
||||||
#endif /* HAVE_LIBBIND */
|
#endif /* HAVE_LIBBIND */
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#else /* This holds good for NetWare too, both for Winsock and Berkeley sockets */
|
#else /* This holds good for NetWare too, both for Winsock and Berkeley sockets */
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#if HAVE_ARPA_INET_H
|
#if HAVE_ARPA_INET_H
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#include "win32/winutil.h"
|
#include "win32/winutil.h"
|
||||||
|
@ -821,6 +821,160 @@ static int stream_array_emulate_read_fd_set(zval *stream_array TSRMLS_DC)
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
#ifdef PHP_WIN32
|
||||||
|
/* Win32 select() will only work with sockets, so we roll our own implementation that will
|
||||||
|
* get the OS file handle from regular fd's and sockets and then use WaitForMultipleObjects().
|
||||||
|
* This implementation is not as feature-full as posix select, but it works for our purposes
|
||||||
|
*/
|
||||||
|
static int php_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv)
|
||||||
|
{
|
||||||
|
HANDLE *handles;
|
||||||
|
DWORD ms, waitret;
|
||||||
|
DWORD ms_total;
|
||||||
|
int i, f, s, fd_count = 0, sock_count = 0;
|
||||||
|
int retval;
|
||||||
|
fd_set ard, awr, aex; /* active fd sets */
|
||||||
|
long sock_events;
|
||||||
|
|
||||||
|
for (i = 0; i < max_fd; i++) {
|
||||||
|
if (FD_ISSET(i, rfds) || FD_ISSET(i, wfds) || FD_ISSET(i, efds)) {
|
||||||
|
if (_get_osfhandle(i) == 0xffffffff) {
|
||||||
|
/* it is a socket */
|
||||||
|
sock_count++;
|
||||||
|
} else {
|
||||||
|
fd_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd_count + sock_count == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
handles = (HANDLE*)emalloc((fd_count + sock_count) * sizeof(HANDLE));
|
||||||
|
|
||||||
|
/* populate the events and handles arrays */
|
||||||
|
f = 0;
|
||||||
|
s = 0;
|
||||||
|
for (i = 0; i < max_fd; i++) {
|
||||||
|
if (FD_ISSET(i, rfds) || FD_ISSET(i, wfds) || FD_ISSET(i, efds)) {
|
||||||
|
long h = _get_osfhandle(i);
|
||||||
|
if (h == 0xFFFFFFFF) {
|
||||||
|
HANDLE evt;
|
||||||
|
long evt_flags = 0;
|
||||||
|
|
||||||
|
if (FD_ISSET(i, rfds)) {
|
||||||
|
evt_flags |= FD_READ|FD_CONNECT|FD_ACCEPT|FD_CLOSE;
|
||||||
|
}
|
||||||
|
if (FD_ISSET(i, wfds)) {
|
||||||
|
evt_flags |= FD_WRITE;
|
||||||
|
}
|
||||||
|
if (FD_ISSET(i, efds)) {
|
||||||
|
evt_flags |= FD_OOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
evt = WSACreateEvent();
|
||||||
|
WSAEventSelect(i, evt, evt_flags);
|
||||||
|
|
||||||
|
handles[fd_count + s] = evt;
|
||||||
|
s++;
|
||||||
|
} else {
|
||||||
|
handles[f++] = (HANDLE)h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate how long we need to wait in milliseconds */
|
||||||
|
if (tv == NULL) {
|
||||||
|
ms_total = INFINITE;
|
||||||
|
} else {
|
||||||
|
ms_total = tv->tv_sec * 1000;
|
||||||
|
ms_total += tv->tv_usec / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
waitret = MsgWaitForMultipleObjects(fd_count + sock_count, handles, FALSE, ms_total, QS_ALLEVENTS);
|
||||||
|
|
||||||
|
if (waitret == WAIT_TIMEOUT) {
|
||||||
|
retval = 0;
|
||||||
|
} else if (waitret == 0xFFFFFFFF) {
|
||||||
|
retval = -1;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
FD_ZERO(&ard);
|
||||||
|
FD_ZERO(&awr);
|
||||||
|
FD_ZERO(&aex);
|
||||||
|
|
||||||
|
f = 0;
|
||||||
|
retval = 0;
|
||||||
|
for (i = 0; i < max_fd; i++) {
|
||||||
|
if (FD_ISSET(i, rfds) || FD_ISSET(i, wfds) || FD_ISSET(i, efds)) {
|
||||||
|
if (f >= fd_count) {
|
||||||
|
/* socket event */
|
||||||
|
HANDLE evt = handles[f];
|
||||||
|
|
||||||
|
if (WAIT_OBJECT_0 == WaitForSingleObject(evt, 0)) {
|
||||||
|
/* check for various signal states */
|
||||||
|
if (FD_ISSET(i, rfds)) {
|
||||||
|
WSAEventSelect(i, evt, FD_READ|FD_CONNECT|FD_ACCEPT|FD_CLOSE);
|
||||||
|
if (WAIT_OBJECT_0 == WaitForSingleObject(evt, 0)) {
|
||||||
|
FD_SET(i, &ard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (FD_ISSET(i, wfds)) {
|
||||||
|
WSAEventSelect(i, evt, FD_WRITE);
|
||||||
|
if (WAIT_OBJECT_0 == WaitForSingleObject(evt, 0)) {
|
||||||
|
FD_SET(i, &awr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (FD_ISSET(i, efds)) {
|
||||||
|
WSAEventSelect(i, evt, FD_OOB);
|
||||||
|
if (WAIT_OBJECT_0 == WaitForSingleObject(evt, 0)) {
|
||||||
|
FD_SET(i, &aex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
retval++;
|
||||||
|
}
|
||||||
|
|
||||||
|
WSACloseEvent(evt);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (WAIT_OBJECT_0 == WaitForSingleObject(handles[f], 0)) {
|
||||||
|
if (FD_ISSET(i, rfds)) {
|
||||||
|
FD_SET(i, &ard);
|
||||||
|
}
|
||||||
|
if (FD_ISSET(i, wfds)) {
|
||||||
|
FD_SET(i, &awr);
|
||||||
|
}
|
||||||
|
if (FD_ISSET(i, efds)) {
|
||||||
|
FD_SET(i, &aex);
|
||||||
|
}
|
||||||
|
retval++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
f++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rfds) {
|
||||||
|
*rfds = ard;
|
||||||
|
}
|
||||||
|
if (wfds) {
|
||||||
|
*wfds = awr;
|
||||||
|
}
|
||||||
|
if (efds) {
|
||||||
|
*efds = aex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
efree(handles);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define php_select(m, r, w, e, t) select(m, r, w, e, t)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* {{{ proto int stream_select(array &read_streams, array &write_streams, array &except_streams, int tv_sec[, int tv_usec])
|
/* {{{ proto int stream_select(array &read_streams, array &write_streams, array &except_streams, int tv_sec[, int tv_usec])
|
||||||
Runs the select() system call on the sets of streams with a timeout specified by tv_sec and tv_usec */
|
Runs the select() system call on the sets of streams with a timeout specified by tv_sec and tv_usec */
|
||||||
PHP_FUNCTION(stream_select)
|
PHP_FUNCTION(stream_select)
|
||||||
|
@ -867,11 +1021,11 @@ PHP_FUNCTION(stream_select)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = select(max_fd+1, &rfds, &wfds, &efds, tv_p);
|
retval = php_select(max_fd+1, &rfds, &wfds, &efds, tv_p);
|
||||||
|
|
||||||
if (retval == -1) {
|
if (retval == -1) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to select [%d]: %s",
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to select [%d]: %s (max_fd=%d)",
|
||||||
errno, strerror(errno));
|
errno, strerror(errno), max_fd);
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
#ifdef NEW_LIBC
|
#ifdef NEW_LIBC
|
||||||
#ifdef USE_WINSOCK
|
#ifdef USE_WINSOCK
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#elif defined(NETWARE) && defined(USE_WINSOCK)
|
#elif defined(NETWARE) && defined(USE_WINSOCK)
|
||||||
/*#include <ws2nlm.h>*/
|
/*#include <ws2nlm.h>*/
|
||||||
#include <novsock2.h>
|
#include <novsock2.h>
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
|
@ -59,7 +59,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#elif defined(NETWARE) && defined(USE_WINSOCK)
|
#elif defined(NETWARE) && defined(USE_WINSOCK)
|
||||||
/*#include <ws2nlm.h>*/
|
/*#include <ws2nlm.h>*/
|
||||||
#include <novsock2.h>
|
#include <novsock2.h>
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#elif defined(NETWARE) && defined(USE_WINSOCK)
|
#elif defined(NETWARE) && defined(USE_WINSOCK)
|
||||||
/*#include <ws2nlm.h>*/
|
/*#include <ws2nlm.h>*/
|
||||||
#include <novsock2.h>
|
#include <novsock2.h>
|
||||||
|
|
|
@ -61,7 +61,7 @@ static char sccsid[] = "@(#)merge.c 8.2 (Berkeley) 2/14/94";
|
||||||
#include "php.h"
|
#include "php.h"
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <winsock.h> /* Includes definition for u_char */
|
#include <winsock2.h> /* Includes definition for u_char */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(NETWARE) && !defined(NEW_LIBC)
|
#if defined(NETWARE) && !defined(NEW_LIBC)
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#elif defined(NETWARE)
|
#elif defined(NETWARE)
|
||||||
|
|
|
@ -22,6 +22,10 @@
|
||||||
#ifndef PHP_H
|
#ifndef PHP_H
|
||||||
#define PHP_H
|
#define PHP_H
|
||||||
|
|
||||||
|
#ifdef PHP_WIN32
|
||||||
|
#include <winsock2.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_DMALLOC
|
#ifdef HAVE_DMALLOC
|
||||||
#include <dmalloc.h>
|
#include <dmalloc.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
#ifdef PHP_WIN32
|
#ifdef PHP_WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#define O_RDONLY _O_RDONLY
|
#define O_RDONLY _O_RDONLY
|
||||||
#include "win32/param.h"
|
#include "win32/param.h"
|
||||||
#include "win32/winutil.h"
|
#include "win32/winutil.h"
|
||||||
|
|
|
@ -1332,6 +1332,15 @@ PHPAPI php_stream *_php_stream_fopen_from_fd(int fd, const char *mode STREAMS_DC
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
self->is_pipe = (fstat(self->fd, &sb) == 0 && S_ISFIFO(sb.st_mode)) ? 1 : 0;
|
self->is_pipe = (fstat(self->fd, &sb) == 0 && S_ISFIFO(sb.st_mode)) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
#elif defined(PHP_WIN32)
|
||||||
|
{
|
||||||
|
long handle = _get_osfhandle(self->fd);
|
||||||
|
DWORD in_buf_size, out_buf_size;
|
||||||
|
|
||||||
|
if (handle != 0xFFFFFFFF) {
|
||||||
|
self->is_pipe = GetNamedPipeInfo((HANDLE)handle, NULL, &out_buf_size, &in_buf_size, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
|
stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
|
||||||
|
@ -1365,6 +1374,15 @@ PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STRE
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
self->is_pipe = (fstat(self->fd, &sb) == 0 && S_ISFIFO(sb.st_mode)) ? 1 : 0;
|
self->is_pipe = (fstat(self->fd, &sb) == 0 && S_ISFIFO(sb.st_mode)) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
#elif defined(PHP_WIN32)
|
||||||
|
{
|
||||||
|
long handle = _get_osfhandle(self->fd);
|
||||||
|
DWORD in_buf_size, out_buf_size;
|
||||||
|
|
||||||
|
if (handle != 0xFFFFFFFF) {
|
||||||
|
self->is_pipe = GetNamedPipeInfo((HANDLE)handle, NULL, &out_buf_size, &in_buf_size, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
|
stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
|
||||||
|
|
|
@ -520,26 +520,32 @@ function system_with_timeout($commandline)
|
||||||
{
|
{
|
||||||
$data = "";
|
$data = "";
|
||||||
|
|
||||||
$proc = proc_open($commandline, array(1 => array('pipe', 'w')), $pipes);
|
$proc = proc_open($commandline, array(
|
||||||
|
0 => array('pipe', 'r'),
|
||||||
|
1 => array('pipe', 'w'),
|
||||||
|
2 => array('pipe', 'w')
|
||||||
|
), $pipes);
|
||||||
|
|
||||||
if (!$proc)
|
if (!$proc)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
fclose($pipes[0]);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
/* hide errors from interrupted syscalls */
|
/* hide errors from interrupted syscalls */
|
||||||
$r = $pipes;
|
$r = $pipes;
|
||||||
$w = null;
|
$w = null;
|
||||||
$e = null;
|
$e = null;
|
||||||
$n = stream_select($r, $w, $e, 60);
|
$n = @stream_select($r, $w, $e, 60);
|
||||||
|
|
||||||
if ($n == 0) {
|
if ($n == 0) {
|
||||||
/* timed out */
|
/* timed out */
|
||||||
$data .= "\n ** ERROR: process timed out **\n";
|
$data .= "\n ** ERROR: process timed out **\n";
|
||||||
proc_terminate($proc);
|
proc_terminate($proc);
|
||||||
return $data;
|
return $data;
|
||||||
} else if ($n) {
|
} else if ($n > 0) {
|
||||||
$line = fgets($pipes[1]);
|
$line = fread($pipes[1], 8192);
|
||||||
if ($line === false) {
|
if (strlen($line) == 0) {
|
||||||
/* EOF */
|
/* EOF */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ BSC32=bscmake.exe
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /debug /machine:I386 /nodefaultlib:"libcmt" /out:"..\Debug_TS\php4ts_debug.dll" /pdbtype:sept /libpath:"..\TSRM\Debug_TS" /libpath:"..\Zend\Debug_TS" /libpath:"..\..\bindlib_w32\Debug" /libpath:"..\ext\mysql\libmysql\Debug_TS" /libpath:"Debug_TS" /libpath:"..\..\zlib\Debug"
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib ws2_32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /debug /machine:I386 /nodefaultlib:"libcmt" /out:"..\Debug_TS\php4ts_debug.dll" /pdbtype:sept /libpath:"..\TSRM\Debug_TS" /libpath:"..\Zend\Debug_TS" /libpath:"..\..\bindlib_w32\Debug" /libpath:"..\ext\mysql\libmysql\Debug_TS" /libpath:"Debug_TS" /libpath:"..\..\zlib\Debug"
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "php4dllts - Win32 Release_TS"
|
!ELSEIF "$(CFG)" == "php4dllts - Win32 Release_TS"
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ BSC32=bscmake.exe
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /machine:I386 /nodefaultlib:"libcmt" /out:"..\Release_TS\php4ts.dll" /libpath:"..\TSRM\Release_TS" /libpath:"..\Zend\Release_TS" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TS" /libpath:"Release_TS" /libpath:"..\..\zlib\Release"
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib ws2_32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /machine:I386 /nodefaultlib:"libcmt" /out:"..\Release_TS\php4ts.dll" /libpath:"..\TSRM\Release_TS" /libpath:"..\Zend\Release_TS" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TS" /libpath:"Release_TS" /libpath:"..\..\zlib\Release"
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "php4dllts - Win32 Release_TS_inline"
|
!ELSEIF "$(CFG)" == "php4dllts - Win32 Release_TS_inline"
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ BSC32=bscmake.exe
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib /nologo /dll /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libcmt.lib" /out:"Release_TS/php4ts.dll" /libpath:"TSRM\Release_TS" /libpath:"Zend\Release_TS" /libpath:"..\bindlib_w32\Release"
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib /nologo /dll /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libcmt.lib" /out:"Release_TS/php4ts.dll" /libpath:"TSRM\Release_TS" /libpath:"Zend\Release_TS" /libpath:"..\bindlib_w32\Release"
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /machine:I386 /nodefaultlib:"libcmt" /out:"..\Release_TS_inline\php4ts.dll" /libpath:"..\TSRM\Release_TS_inline" /libpath:"..\Zend\Release_TS_inline" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TS_inline" /libpath:"Release_TS_Inline" /libpath:"..\..\zlib\Release"
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib ws2_32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /machine:I386 /nodefaultlib:"libcmt" /out:"..\Release_TS_inline\php4ts.dll" /libpath:"..\TSRM\Release_TS_inline" /libpath:"..\Zend\Release_TS_inline" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TS_inline" /libpath:"Release_TS_Inline" /libpath:"..\..\zlib\Release"
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "php4dllts - Win32 Release_TSDbg"
|
!ELSEIF "$(CFG)" == "php4dllts - Win32 Release_TSDbg"
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ BSC32=bscmake.exe
|
||||||
# ADD BSC32 /nologo
|
# ADD BSC32 /nologo
|
||||||
LINK32=link.exe
|
LINK32=link.exe
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib /nologo /version:4.0 /dll /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libcmt.lib" /out:"..\Release_TS\php4ts.dll" /libpath:"..\TSRM\Release_TS" /libpath:"..\Zend\Release_TS" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TS" /libpath:"Release_TS"
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib /nologo /version:4.0 /dll /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libcmt.lib" /out:"..\Release_TS\php4ts.dll" /libpath:"..\TSRM\Release_TS" /libpath:"..\Zend\Release_TS" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TS" /libpath:"Release_TS"
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib wsock32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /debug /machine:I386 /nodefaultlib:"libcmt" /out:"..\Release_TSDbg\php4ts.dll" /libpath:"..\TSRM\Release_TSDbg" /libpath:"..\Zend\Release_TSDbg" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TSDbg" /libpath:"Release_TSDbg"
|
# ADD LINK32 kernel32.lib user32.lib gdi32.lib ws2_32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ZendTS.lib TSRM.lib resolv.lib libmysql.lib zlib.lib Urlmon.lib /nologo /version:4.0 /dll /debug /machine:I386 /nodefaultlib:"libcmt" /out:"..\Release_TSDbg\php4ts.dll" /libpath:"..\TSRM\Release_TSDbg" /libpath:"..\Zend\Release_TSDbg" /libpath:"..\..\bindlib_w32\Release" /libpath:"..\ext\mysql\libmysql\Release_TSDbg" /libpath:"Release_TSDbg"
|
||||||
|
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifndef NETWARE
|
#ifndef NETWARE
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#else /* NETWARE */
|
#else /* NETWARE */
|
||||||
#include <netware\sendmail_nw.h>
|
#include <netware\sendmail_nw.h>
|
||||||
#endif /* NETWARE */
|
#endif /* NETWARE */
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#define TIME_H
|
#define TIME_H
|
||||||
|
|
||||||
/* Include stuff ************************************************************ */
|
/* Include stuff ************************************************************ */
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <php.h>
|
#include <php.h>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue