6 changed files with 1499 additions and 1236 deletions
-
2ext/sockets/CREDITS
-
95ext/sockets/php_sockets.h
-
175ext/sockets/php_sockets_win.c
-
83ext/sockets/php_sockets_win.h
-
2264ext/sockets/sockets.c
-
116ext/sockets/sockets.dsp
@ -1,2 +1,2 @@ |
|||
Sockets |
|||
Chris Vandomelen, Sterling Hughes |
|||
Chris Vandomelen, Sterling Hughes, Daniel Beulshausen |
|||
@ -0,0 +1,175 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP version 4.0 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.02 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available at through the world-wide-web at | |
|||
| http://www.php.net/license/2_02.txt. | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Chris Vandomelen <chrisv@b0rked.dhs.org> | |
|||
| Sterling Hughes <sterling@php.net> | |
|||
| | |
|||
| WinSock: Daniel Beulshausen <daniel@php4win.de> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#ifdef PHP_WIN32 |
|||
|
|||
#include <stdio.h> |
|||
#include <fcntl.h> |
|||
|
|||
#include "php.h" |
|||
#include "php_sockets.h" |
|||
#include "php_sockets_win.h" |
|||
|
|||
ssize_t readv(SOCKET sock, const struct iovec *iov, int iovcnt) { |
|||
size_t bytes, remain, len, pos = 0; |
|||
ssize_t retval; |
|||
int i; |
|||
char *buffer = NULL; |
|||
|
|||
for(bytes=0, i=0; i<iovcnt; i++) { |
|||
bytes += iov[i].iov_len; |
|||
} |
|||
|
|||
buffer = (char*)emalloc(bytes); |
|||
if (buffer == NULL) { |
|||
return -1; |
|||
} |
|||
|
|||
retval = recv(sock, buffer, bytes, 0); |
|||
if(retval < 0) { |
|||
efree(buffer); |
|||
return retval; |
|||
} |
|||
|
|||
remain = bytes = (size_t) retval; |
|||
|
|||
for(i=0; i<iovcnt; i++) { |
|||
len = (iov[i].iov_len < remain) ? iov[i].iov_len : remain; |
|||
memcpy(iov[i].iov_base, buffer+pos, len); |
|||
pos += len; |
|||
remain -= len; |
|||
} |
|||
|
|||
efree(buffer); |
|||
return bytes; |
|||
} |
|||
|
|||
ssize_t writev(SOCKET sock, const struct iovec *iov, int iovcnt) { |
|||
size_t bytes, pos = 0; |
|||
ssize_t retval; |
|||
int i; |
|||
char *buffer = NULL; |
|||
|
|||
for(bytes=0, i=0; i<iovcnt; i++) { |
|||
bytes += iov[i].iov_len; |
|||
} |
|||
|
|||
buffer = (char*)emalloc(bytes); |
|||
|
|||
if(buffer == NULL) { |
|||
return -1; |
|||
} |
|||
|
|||
for(i=0; i<iovcnt; i++) { |
|||
memcpy(buffer+pos, iov[i].iov_base, iov[i].iov_len); |
|||
pos += iov[i].iov_len; |
|||
} |
|||
|
|||
retval = send(sock, buffer, bytes, 0); |
|||
efree(buffer); |
|||
|
|||
return retval; |
|||
} |
|||
|
|||
ssize_t recvmsg(SOCKET sock, struct msghdr *msg, int flags) { |
|||
set_errno(WSAEOPNOTSUPP); |
|||
return -1; |
|||
} |
|||
|
|||
ssize_t sendmsg(SOCKET sock, struct msghdr *msg, int flags) { |
|||
set_errno(WSAEOPNOTSUPP); |
|||
return -1; |
|||
} |
|||
|
|||
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); |
|||
return -1; |
|||
} |
|||
|
|||
|
|||
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) { |
|||
|
|||
} |
|||
|
|||
listen(sock[0], 2); |
|||
sock[1] = socket(domain, type, protocol); |
|||
address.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
|||
|
|||
connect(sock[1], (struct sockaddr*)&address, sizeof(address)); |
|||
redirect = accept(sock[0],(struct sockaddr*)&address, &size); |
|||
|
|||
close(sock[0]); |
|||
sock[0] = redirect; |
|||
|
|||
if(sock[0] == INVALID_SOCKET ) { |
|||
close(sock[0]); |
|||
close(sock[1]); |
|||
set_errno(WSAECONNABORTED); |
|||
return -1; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
int inet_aton(const char *cp, struct in_addr *inp) { |
|||
inp->s_addr = inet_addr(cp); |
|||
|
|||
if (inp->s_addr == INADDR_NONE) { |
|||
return 0; |
|||
} |
|||
|
|||
return 1; |
|||
} |
|||
|
|||
int fcntl(int fd, int cmd, ...) { |
|||
va_list va; |
|||
int retval; |
|||
|
|||
va_start(va, cmd); |
|||
|
|||
switch(cmd) { |
|||
case F_GETFL: |
|||
case F_SETFD: |
|||
case F_GETFD: |
|||
default: |
|||
retval = -1; |
|||
break; |
|||
|
|||
case F_SETFL: |
|||
retval = ioctlsocket(fd, cmd, va_arg(va, int*)); |
|||
break; |
|||
} |
|||
|
|||
va_end(va); |
|||
return retval; |
|||
} |
|||
#endif |
|||
@ -0,0 +1,83 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP version 4.0 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.02 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available at through the world-wide-web at | |
|||
| http://www.php.net/license/2_02.txt. | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Chris Vandomelen <chrisv@b0rked.dhs.org> | |
|||
| Sterling Hughes <sterling@php.net> | |
|||
| | |
|||
| WinSock: Daniel Beulshausen <daniel@php4win.de> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#ifdef PHP_WIN32 |
|||
|
|||
#define F_SETFL 0 |
|||
#define F_GETFL 1 |
|||
#define F_SETFD 2 |
|||
#define F_GETFD 3 |
|||
|
|||
#define O_NONBLOCK FIONBIO |
|||
|
|||
#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 set_h_errno(a) WSASetLastError(a) |
|||
#define close(a) closesocket(a) |
|||
#define CMSG_DATA(cmsg) ((cmsg)->cmsg_data) |
|||
#define IS_INVALID_SOCKET(a) (a->socket == INVALID_SOCKET) |
|||
|
|||
typedef long ssize_t; |
|||
|
|||
struct sockaddr_un { |
|||
short sun_family; |
|||
char sun_path[108]; |
|||
}; |
|||
|
|||
struct iovec { |
|||
char * iov_base; |
|||
int iov_len; |
|||
}; |
|||
|
|||
struct msghdr { |
|||
void* msg_name; |
|||
socklen_t msg_namelen; |
|||
struct iovec* msg_iov; |
|||
int msg_iovlen; |
|||
void* msg_control; |
|||
socklen_t msg_controllen; |
|||
int msg_flags; |
|||
}; |
|||
|
|||
struct cmsghdr { |
|||
socklen_t cmsg_len; |
|||
int cmsg_level; |
|||
int cmsg_type; |
|||
unsigned char cmsg_data[]; |
|||
}; |
|||
|
|||
ssize_t readv(SOCKET sock, const struct iovec *iov, int iovcnt); |
|||
ssize_t writev(SOCKET sock, const struct iovec *iov, int iovcnt); |
|||
ssize_t recvmsg(SOCKET sock, struct msghdr *msg, int flags); |
|||
ssize_t sendmsg(SOCKET sock, struct msghdr *msg, int flags); |
|||
int socketpair(int domain, int type, int protocol, SOCKET sock[2]); |
|||
int inet_aton(const char *cp, struct in_addr *inp); |
|||
int fcntl(int fd, int cmd, ...); |
|||
|
|||
#endif |
|||
2264
ext/sockets/sockets.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,116 @@ |
|||
# Microsoft Developer Studio Project File - Name="sockets" - Package Owner=<4> |
|||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 |
|||
# ** DO NOT EDIT ** |
|||
|
|||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 |
|||
|
|||
CFG=sockets - Win32 Debug_TS |
|||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, |
|||
!MESSAGE use the Export Makefile command and run |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "SOCKETS.MAK". |
|||
!MESSAGE |
|||
!MESSAGE You can specify a configuration when running NMAKE |
|||
!MESSAGE by defining the macro CFG on the command line. For example: |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "SOCKETS.MAK" CFG="sockets - Win32 Debug_TS" |
|||
!MESSAGE |
|||
!MESSAGE Possible choices for configuration are: |
|||
!MESSAGE |
|||
!MESSAGE "sockets - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") |
|||
!MESSAGE "sockets - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") |
|||
!MESSAGE |
|||
|
|||
# Begin Project |
|||
# PROP AllowPerConfigDependencies 0 |
|||
# PROP Scc_ProjName "" |
|||
# PROP Scc_LocalPath "" |
|||
CPP=cl.exe |
|||
MTL=midl.exe |
|||
RSC=rc.exe |
|||
|
|||
!IF "$(CFG)" == "sockets - Win32 Release_TS" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 0 |
|||
# PROP BASE Output_Dir "Release_TS" |
|||
# PROP BASE Intermediate_Dir "Release_TS" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 0 |
|||
# PROP Output_Dir "Release_TS" |
|||
# PROP Intermediate_Dir "Release_TS" |
|||
# PROP Ignore_Export_Lib 0 |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOCKETS_EXPORTS" /YX /FD /c |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /D "WIN32" /D "PHP_EXPORTS" /D "COMPILE_DL_SOCKETS" /D ZTS=1 /D HAVE_SOCKETS=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "ZEND_WIN32" /D "PHP_WIN32" /YX /FD /c |
|||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 |
|||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 |
|||
# ADD BASE RSC /l 0x407 /d "NDEBUG" |
|||
# ADD RSC /l 0x407 /d "NDEBUG" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
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 LINK32 php4ts.lib Ws2_32.lib 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 /out:"..\..\Release_TS/php_sockets.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" |
|||
|
|||
!ELSEIF "$(CFG)" == "sockets - Win32 Debug_TS" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 1 |
|||
# PROP BASE Output_Dir "Debug_TS" |
|||
# PROP BASE Intermediate_Dir "Debug_TS" |
|||
# PROP BASE Ignore_Export_Lib 0 |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 1 |
|||
# PROP Output_Dir "Debug_TS" |
|||
# PROP Intermediate_Dir "Debug_TS" |
|||
# PROP Ignore_Export_Lib 0 |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOCKETS_EXPORTS" /YX /FD /GZ /c |
|||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PHP_EXPORTS" /D "COMPILE_DL_SOCKETS" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_SOCKETS=1 /YX /FD /GZ /c |
|||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 |
|||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 |
|||
# ADD BASE RSC /l 0x407 /d "_DEBUG" |
|||
# ADD RSC /l 0x407 /d "_DEBUG" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
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 LINK32 php4ts_debug.lib Ws2_32.lib 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 /out:"..\..\Debug_TS/php_sockets.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" |
|||
|
|||
!ENDIF |
|||
|
|||
# Begin Target |
|||
|
|||
# Name "sockets - Win32 Release_TS" |
|||
# Name "sockets - Win32 Debug_TS" |
|||
# Begin Group "Source Files" |
|||
|
|||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\php_sockets_win.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\sockets.c |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Header Files" |
|||
|
|||
# PROP Default_Filter "h;hpp;hxx;hm;inl" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\php_sockets.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\php_sockets_win.h |
|||
# End Source File |
|||
# End Group |
|||
# End Target |
|||
# End Project |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue