Browse Source

update sockets to work with winsock as well

experimental/pre_new_hash_func
Daniel Beulshausen 25 years ago
parent
commit
9820c2a5af
  1. 2
      ext/sockets/CREDITS
  2. 95
      ext/sockets/php_sockets.h
  3. 175
      ext/sockets/php_sockets_win.c
  4. 83
      ext/sockets/php_sockets_win.h
  5. 2264
      ext/sockets/sockets.c
  6. 116
      ext/sockets/sockets.dsp

2
ext/sockets/CREDITS

@ -1,2 +1,2 @@
Sockets
Chris Vandomelen, Sterling Hughes
Chris Vandomelen, Sterling Hughes, Daniel Beulshausen

95
ext/sockets/php_sockets.h

@ -13,6 +13,9 @@
| 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> |
+----------------------------------------------------------------------+
*/
@ -35,50 +38,59 @@ extern zend_module_entry sockets_module_entry;
PHP_MINIT_FUNCTION(sockets);
PHP_MINFO_FUNCTION(sockets);
PHP_FUNCTION(fd_alloc);
PHP_FUNCTION(fd_dealloc);
PHP_FUNCTION(fd_set);
PHP_FUNCTION(fd_isset);
PHP_FUNCTION(fd_clear);
PHP_FUNCTION(fd_zero);
PHP_FUNCTION(select);
PHP_FUNCTION(open_listen_sock);
PHP_FUNCTION(accept_connect);
PHP_FUNCTION(set_nonblock);
PHP_FUNCTION(listen);
PHP_FUNCTION(close);
PHP_FUNCTION(write);
PHP_FUNCTION(read);
PHP_FUNCTION(getsockname);
PHP_FUNCTION(getpeername);
PHP_FUNCTION(socket);
PHP_FUNCTION(connect);
PHP_FUNCTION(strerror);
PHP_FUNCTION(bind);
PHP_FUNCTION(recv);
PHP_FUNCTION(send);
PHP_FUNCTION(recvfrom);
PHP_FUNCTION(sendto);
PHP_FUNCTION(build_iovec);
PHP_FUNCTION(fetch_iovec);
PHP_FUNCTION(free_iovec);
PHP_FUNCTION(add_iovec);
PHP_FUNCTION(delete_iovec);
PHP_FUNCTION(set_iovec);
PHP_FUNCTION(recvmsg);
PHP_FUNCTION(sendmsg);
PHP_FUNCTION(readv);
PHP_FUNCTION(writev);
PHP_FUNCTION(getsockopt);
PHP_FUNCTION(setsockopt);
PHP_FUNCTION(socketpair);
PHP_FUNCTION(shutdown);
PHP_FUNCTION(socket_fd_alloc);
PHP_FUNCTION(socket_fd_free);
PHP_FUNCTION(socket_fd_set);
PHP_FUNCTION(socket_fd_isset);
PHP_FUNCTION(socket_fd_clear);
PHP_FUNCTION(socket_fd_zero);
PHP_FUNCTION(socket_iovec_alloc);
PHP_FUNCTION(socket_iovec_free);
PHP_FUNCTION(socket_iovec_set);
PHP_FUNCTION(socket_iovec_fetch);
PHP_FUNCTION(socket_iovec_add);
PHP_FUNCTION(socket_iovec_delete);
PHP_FUNCTION(socket_select);
PHP_FUNCTION(socket_create_listen);
PHP_FUNCTION(socket_create_pair);
PHP_FUNCTION(socket_accept);
PHP_FUNCTION(socket_set_nonblock);
PHP_FUNCTION(socket_listen);
PHP_FUNCTION(socket_close);
PHP_FUNCTION(socket_write);
PHP_FUNCTION(socket_read);
PHP_FUNCTION(socket_getsockname);
PHP_FUNCTION(socket_getpeername);
PHP_FUNCTION(socket_create);
PHP_FUNCTION(socket_connect);
PHP_FUNCTION(socket_strerror);
PHP_FUNCTION(socket_bind);
PHP_FUNCTION(socket_recv);
PHP_FUNCTION(socket_send);
PHP_FUNCTION(socket_recvfrom);
PHP_FUNCTION(socket_sendto);
PHP_FUNCTION(socket_recvmsg);
PHP_FUNCTION(socket_sendmsg);
PHP_FUNCTION(socket_readv);
PHP_FUNCTION(socket_writev);
PHP_FUNCTION(socket_getopt);
PHP_FUNCTION(socket_setopt);
PHP_FUNCTION(socket_shutdown);
typedef struct php_iovec {
struct iovec *iov_array;
unsigned int count;
} php_iovec_t;
typedef struct {
#ifdef PHP_WIN32
SOCKET socket;
#else
int socket;
#endif
int type;
} php_socket;
typedef struct {
zend_bool use_system_read;
} php_sockets_globals;
@ -93,17 +105,14 @@ typedef struct {
#endif
#else
#define phpext_sockets_ptr NULL
#endif
#endif /* PHP_SOCKETS_H */
#endif
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
*/

175
ext/sockets/php_sockets_win.c

@ -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

83
ext/sockets/php_sockets_win.h

@ -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

116
ext/sockets/sockets.dsp

@ -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
Loading…
Cancel
Save