2009-07-27 23:43 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbstack.h
+ added socket error codes to HB_IOERRORS
* harbour/include/Makefile
+ harbour/include/hbsocket.ch
+ harbour/include/hbsocket.h
* harbour/source/rtl/Makefile
+ harbour/source/rtl/hbsocket.c
+ added new BSD socket functions: hb_socket*(). They should be quite
close to low level C socket interface with few modifications which
help to hide some platform differences. Unfortunately we do not use
autoconf so I had to arbitrary set which features are available
on some platforms. In practice it means that it reduces portability
to older OS-es, i.e. it should work with current Linux versions
but it will not without some modifications in macros used to control
supported features with older Linuxes using kernel 2.2 or 2.0.
The same can happen with other *nix ports like Darwin, SunOS, HP-UX
or with different versions of some Windows compilers. I also do not
know which functionality is available in OS2 GCC ports and I would
like to ask OS2 users to make tests and disable not working features.
We also need tests with HP-UX, Darwin and SunOS.
IP6 support is enabled only in *nixes. If Windows users are interested
in IP6 then please add support for it. Most of Windows compilers do
not support standard POSIX functions so I do not want to make it
myself using unknown for me API without testing.
In *nix builds PF_UNIX/PF_LOCAL sockets are also supported.
Support for other socket types can be easy added if someone is
interested in them.
The constant values used in hbsocket.ch are equal to original BSD
socket definitions. If it's necessary then it's possible to enable
their translation inside hbsocket.c code though I do not think we
will find such OS.
The list of hb_socket*() functions was designed to cover all existing
functionality in hbinet.c and socket.c. Most of functions supports
timeout parameter what effectively allows to hide direct select()
usage.
Please make test with real applications and report any problems
with hb_inet*() functions you will find.
* harbour/source/vm/hvm.c
* minor cleanup
* harbour/source/rtl/hbi18n1.c
* cleaned variable name
* harbour/source/rtl/hbinet.c
* harbour/examples/uhttpd2/socket.c
* harbour/contrib/hbssl/hbssl.c
* updated to use hb_socket*() functions
* harbour/include/hbextern.ch
* enabled HB_INET*() functions in DOS builds - they will simply return
errors
- harbour/include/hbapinet.h
- removed old header file
* harbour/source/pp/ppcore.c
! modified ENDTEXT marker to work also with comments in the same line
It's more closer to Clipper though intentionally we are not fully
CA-Cl*pper compatible here.
This commit is contained in:
@@ -17,6 +17,69 @@
|
||||
past entries belonging to author(s): Viktor Szakats.
|
||||
*/
|
||||
|
||||
2009-07-27 23:43 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
|
||||
* harbour/include/hbstack.h
|
||||
+ added socket error codes to HB_IOERRORS
|
||||
|
||||
* harbour/include/Makefile
|
||||
+ harbour/include/hbsocket.ch
|
||||
+ harbour/include/hbsocket.h
|
||||
* harbour/source/rtl/Makefile
|
||||
+ harbour/source/rtl/hbsocket.c
|
||||
+ added new BSD socket functions: hb_socket*(). They should be quite
|
||||
close to low level C socket interface with few modifications which
|
||||
help to hide some platform differences. Unfortunately we do not use
|
||||
autoconf so I had to arbitrary set which features are available
|
||||
on some platforms. In practice it means that it reduces portability
|
||||
to older OS-es, i.e. it should work with current Linux versions
|
||||
but it will not without some modifications in macros used to control
|
||||
supported features with older Linuxes using kernel 2.2 or 2.0.
|
||||
The same can happen with other *nix ports like Darwin, SunOS, HP-UX
|
||||
or with different versions of some Windows compilers. I also do not
|
||||
know which functionality is available in OS2 GCC ports and I would
|
||||
like to ask OS2 users to make tests and disable not working features.
|
||||
We also need tests with HP-UX, Darwin and SunOS.
|
||||
IP6 support is enabled only in *nixes. If Windows users are interested
|
||||
in IP6 then please add support for it. Most of Windows compilers do
|
||||
not support standard POSIX functions so I do not want to make it
|
||||
myself using unknown for me API without testing.
|
||||
In *nix builds PF_UNIX/PF_LOCAL sockets are also supported.
|
||||
Support for other socket types can be easy added if someone is
|
||||
interested in them.
|
||||
The constant values used in hbsocket.ch are equal to original BSD
|
||||
socket definitions. If it's necessary then it's possible to enable
|
||||
their translation inside hbsocket.c code though I do not think we
|
||||
will find such OS.
|
||||
The list of hb_socket*() functions was designed to cover all existing
|
||||
functionality in hbinet.c and socket.c. Most of functions supports
|
||||
timeout parameter what effectively allows to hide direct select()
|
||||
usage.
|
||||
Please make test with real applications and report any problems
|
||||
with hb_inet*() functions you will find.
|
||||
|
||||
* harbour/source/vm/hvm.c
|
||||
* minor cleanup
|
||||
|
||||
* harbour/source/rtl/hbi18n1.c
|
||||
* cleaned variable name
|
||||
|
||||
* harbour/source/rtl/hbinet.c
|
||||
* harbour/examples/uhttpd2/socket.c
|
||||
* harbour/contrib/hbssl/hbssl.c
|
||||
* updated to use hb_socket*() functions
|
||||
|
||||
* harbour/include/hbextern.ch
|
||||
* enabled HB_INET*() functions in DOS builds - they will simply return
|
||||
errors
|
||||
|
||||
- harbour/include/hbapinet.h
|
||||
- removed old header file
|
||||
|
||||
* harbour/source/pp/ppcore.c
|
||||
! modified ENDTEXT marker to work also with comments in the same line
|
||||
It's more closer to Clipper though intentionally we are not fully
|
||||
CA-Cl*pper compatible here.
|
||||
|
||||
2009-07-24 09:46 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* contrib/hbtip/sendmail.prg
|
||||
* contrib/hbtip/client.prg
|
||||
|
||||
@@ -53,13 +53,11 @@
|
||||
#include "hbapi.h"
|
||||
#include "hbapierr.h"
|
||||
#include "hbapiitm.h"
|
||||
#include "hbapinet.h"
|
||||
#include "hbsocket.h"
|
||||
#include "hbvm.h"
|
||||
|
||||
#include "hbssl.h"
|
||||
|
||||
#if defined( HB_API_NET )
|
||||
|
||||
HB_FUNC( HB_SSL_READ_ALL )
|
||||
{
|
||||
if( hb_SSL_is( 1 ) )
|
||||
@@ -82,7 +80,7 @@ HB_FUNC( HB_SSL_READ_ALL )
|
||||
int iLen;
|
||||
|
||||
if( SSL_pending( ssl ) ||
|
||||
hb_selectReadFD( ( HB_SOCKET_T ) SSL_get_fd( ssl ), iTimeout ) )
|
||||
hb_socketSelectRead( ( HB_SOCKET_T ) SSL_get_fd( ssl ), iTimeout ) )
|
||||
{
|
||||
iLen = SSL_read( ssl, &buffer, 1 );
|
||||
|
||||
@@ -151,7 +149,7 @@ HB_FUNC( HB_SSL_READ_LINE )
|
||||
int iLen;
|
||||
|
||||
if( SSL_pending( ssl ) ||
|
||||
hb_selectReadFD( ( HB_SOCKET_T ) SSL_get_fd( ssl ), iTimeout ) )
|
||||
hb_socketSelectRead( ( HB_SOCKET_T ) SSL_get_fd( ssl ), iTimeout ) )
|
||||
{
|
||||
iLen = SSL_read( ssl, &buffer, 1 );
|
||||
|
||||
@@ -201,5 +199,3 @@ HB_FUNC( HB_SSL_READ_LINE )
|
||||
else
|
||||
hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -42,450 +42,199 @@
|
||||
other: { AF_?, cAddressDump }
|
||||
*/
|
||||
|
||||
#include "hbapi.h"
|
||||
#include "hbsocket.h"
|
||||
#include "hbapiitm.h"
|
||||
#include "hbvm.h"
|
||||
|
||||
#if defined( HB_OS_WIN )
|
||||
#define _WINSOCKAPI_ /* Prevents inclusion of winsock.h in windows.h */
|
||||
#define HB_SOCKET_T SOCKET
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#define socklen_t int
|
||||
#define SHUT_RDWR SD_BOTH
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#define INVALID_SOCKET (-1)
|
||||
typedef int SOCKET;
|
||||
#endif
|
||||
|
||||
#ifdef hb_parnidef
|
||||
#undef hb_parnidef
|
||||
#endif
|
||||
|
||||
|
||||
static int hb_parnidef( int iParam, int iValue )
|
||||
{
|
||||
return HB_ISNUM( iParam ) ? hb_parni( iParam ) : iValue;
|
||||
}
|
||||
|
||||
|
||||
static SOCKET hb_parsocket( int iParam )
|
||||
static HB_SOCKET_T hb_parsocket( int iParam )
|
||||
{
|
||||
return HB_ISPOINTER( iParam ) ? ( SOCKET ) hb_parptr( 1 ) : INVALID_SOCKET;
|
||||
return HB_ISPOINTER( iParam ) ? ( HB_SOCKET_T ) ( HB_PTRDIFF )
|
||||
hb_parptr( iParam ) : HB_NO_SOCKET;
|
||||
}
|
||||
|
||||
|
||||
static void hb_retsocket( SOCKET hSocket )
|
||||
static void hb_retsocket( HB_SOCKET_T hSocket )
|
||||
{
|
||||
if( hSocket == INVALID_SOCKET )
|
||||
if( hSocket == HB_NO_SOCKET )
|
||||
hb_ret();
|
||||
else
|
||||
hb_retptr( ( void* ) hSocket );
|
||||
hb_retptr( ( void* ) ( HB_PTRDIFF ) hSocket );
|
||||
}
|
||||
|
||||
|
||||
static SOCKET hb_itemGetSocket( PHB_ITEM pItem )
|
||||
static HB_SOCKET_T hb_itemGetSocket( PHB_ITEM pSocket )
|
||||
{
|
||||
return HB_IS_POINTER( pItem ) ? ( SOCKET ) hb_itemGetPtr( pItem ) : INVALID_SOCKET;
|
||||
}
|
||||
|
||||
|
||||
static PHB_ITEM hb_itemPutSocket( PHB_ITEM pItem, SOCKET hSocket )
|
||||
{
|
||||
if( ! pItem )
|
||||
pItem = hb_itemNew( NULL );
|
||||
|
||||
if( hSocket == INVALID_SOCKET )
|
||||
hb_itemClear( pItem );
|
||||
if( pSocket && HB_IS_POINTER( pSocket ) )
|
||||
return ( HB_SOCKET_T ) ( HB_PTRDIFF ) hb_itemGetPtr( pSocket );
|
||||
else
|
||||
hb_itemPutPtr( pItem, ( void* ) hSocket );
|
||||
|
||||
return pItem;
|
||||
return HB_NO_SOCKET;
|
||||
}
|
||||
|
||||
|
||||
static void hb_itemGetSockaddr( PHB_ITEM pItem, struct sockaddr* sa )
|
||||
{
|
||||
memset( sa, 0, sizeof( struct sockaddr ) );
|
||||
|
||||
if( HB_IS_ARRAY( pItem ) )
|
||||
{
|
||||
sa->sa_family = hb_arrayGetNI( pItem, 1 );
|
||||
|
||||
if( sa->sa_family == AF_INET )
|
||||
{
|
||||
( ( struct sockaddr_in* ) sa)->sin_addr.s_addr = inet_addr( hb_arrayGetCPtr( pItem, 2 ) );
|
||||
( ( struct sockaddr_in* ) sa)->sin_port = htons( hb_arrayGetNI( pItem, 3 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
ULONG ulLen = hb_arrayGetCLen( pItem, 2 );
|
||||
|
||||
if( ulLen > sizeof( sa->sa_data ) )
|
||||
ulLen = sizeof( sa->sa_data );
|
||||
memcpy( sa->sa_data, hb_arrayGetCPtr( pItem, 2 ), ulLen );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static PHB_ITEM hb_itemPutSockaddr( PHB_ITEM pItem, const struct sockaddr* saddr )
|
||||
{
|
||||
pItem = hb_itemNew( pItem );
|
||||
|
||||
if( saddr->sa_family == AF_INET )
|
||||
{
|
||||
hb_arrayNew( pItem, 3 );
|
||||
hb_arraySetNI( pItem, 1, saddr->sa_family );
|
||||
hb_arraySetC( pItem, 2, inet_ntoa( ( ( struct sockaddr_in* ) saddr )->sin_addr ) );
|
||||
hb_arraySetNI( pItem, 3, ntohs( ( ( struct sockaddr_in* ) saddr )->sin_port ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
hb_arrayNew( pItem, 2 );
|
||||
hb_arraySetNI( pItem, 1, saddr->sa_family );
|
||||
hb_arraySetCL( pItem, 2, saddr->sa_data, sizeof( saddr->sa_data ) );
|
||||
}
|
||||
return pItem;
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_INIT )
|
||||
{
|
||||
#if defined( HB_OS_WIN )
|
||||
WSADATA wsad;
|
||||
|
||||
hb_retni( WSAStartup( hb_parnidef( 1, 257 ), &wsad ) );
|
||||
hb_storclen( (char*) &wsad, sizeof( WSADATA ), 2 );
|
||||
#else
|
||||
hb_retni( 0 );
|
||||
#endif
|
||||
hb_retni( hb_socketInit() );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_EXIT )
|
||||
{
|
||||
#if defined( HB_OS_WIN )
|
||||
hb_retni( WSACleanup() );
|
||||
#else
|
||||
hb_retni( 0 );
|
||||
#endif
|
||||
hb_socketCleanup();
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_ERROR )
|
||||
{
|
||||
#if defined( HB_OS_WIN )
|
||||
hb_retni( WSAGetLastError() );
|
||||
#else
|
||||
hb_retni( h_errno );
|
||||
#endif
|
||||
hb_retni( hb_socketGetError() );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_CREATE )
|
||||
{
|
||||
hb_retsocket( socket( hb_parnidef( 1, PF_INET ),
|
||||
hb_parnidef( 2, SOCK_STREAM ),
|
||||
hb_parnidef( 3, IPPROTO_TCP ) ) );
|
||||
hb_retsocket( hb_socketOpen( hb_parnidef( 1, HB_SOCK_PF_INET ),
|
||||
hb_parnidef( 2, HB_SOCK_STREAM ),
|
||||
hb_parnidef( 3, HB_SOCK_IPPROTO_TCP ) ) );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_CLOSE )
|
||||
{
|
||||
#if defined( HB_OS_WIN )
|
||||
hb_retni( closesocket( hb_parsocket( 1 ) ) );
|
||||
#else
|
||||
hb_retni( close( hb_parsocket( 1 ) ) );
|
||||
#endif
|
||||
hb_retni( hb_socketClose( hb_parsocket( 1 ) ) );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_BIND )
|
||||
{
|
||||
struct sockaddr sa;
|
||||
void * sa;
|
||||
unsigned len;
|
||||
|
||||
hb_itemGetSockaddr( hb_param( 2, HB_IT_ANY ), &sa );
|
||||
hb_retni( bind( hb_parsocket( 1 ), &sa, sizeof( struct sockaddr ) ) );
|
||||
if( hb_socketAddrFromItem( &sa, &len, hb_param( 2, HB_IT_ANY ) ) )
|
||||
{
|
||||
hb_retni( hb_socketBind( hb_parsocket( 1 ), sa, len ) );
|
||||
hb_xfree( sa );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_LISTEN )
|
||||
{
|
||||
hb_retni( listen( hb_parsocket( 1 ), hb_parnidef( 2, 10 ) ) );
|
||||
hb_retni( hb_socketListen( hb_parsocket( 1 ), hb_parnidef( 2, 10 ) ) );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_ACCEPT )
|
||||
{
|
||||
PHB_ITEM pItem;
|
||||
SOCKET socket = hb_parsocket( 1 );
|
||||
struct sockaddr saddr;
|
||||
socklen_t iSize = sizeof( struct sockaddr );
|
||||
|
||||
hb_vmUnlock();
|
||||
socket = accept( socket, &saddr, &iSize );
|
||||
hb_vmLock();
|
||||
|
||||
hb_retsocket( socket );
|
||||
if( HB_ISBYREF( 2 ) )
|
||||
{
|
||||
pItem = hb_itemPutSockaddr( NULL, &saddr );
|
||||
hb_itemParamStoreForward( 2, pItem );
|
||||
hb_itemRelease( pItem );
|
||||
}
|
||||
}
|
||||
void * sa;
|
||||
unsigned len;
|
||||
PHB_ITEM pItem;
|
||||
|
||||
hb_retsocket( hb_socketAccept( hb_parsocket( 1 ), &sa, &len,
|
||||
HB_ISNUM( 3 ) ? hb_parnint( 3 ) : -1 ) );
|
||||
pItem = hb_socketAddrToItem( sa, len );
|
||||
if( pItem )
|
||||
{
|
||||
hb_itemParamStoreForward( 2, pItem );
|
||||
hb_itemRelease( pItem );
|
||||
}
|
||||
else
|
||||
hb_stor( 2 );
|
||||
|
||||
if( sa )
|
||||
hb_xfree( sa );
|
||||
}
|
||||
else
|
||||
hb_retsocket( hb_socketAccept( hb_parsocket( 1 ), NULL, 0,
|
||||
HB_ISNUM( 3 ) ? hb_parnint( 3 ) : -1 ) );
|
||||
}
|
||||
|
||||
HB_FUNC( SOCKET_SHUTDOWN )
|
||||
{
|
||||
SOCKET socket = hb_parsocket( 1 );
|
||||
int i = hb_parnidef( 2, SHUT_RDWR );
|
||||
|
||||
hb_vmUnlock();
|
||||
i = shutdown( socket, i );
|
||||
hb_vmLock();
|
||||
hb_retni( i );
|
||||
hb_retni( hb_socketShutdown( hb_parsocket( 1 ),
|
||||
hb_parnidef( 2, HB_SOCK_SHUT_RDWR ) ) );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_RECV )
|
||||
{
|
||||
SOCKET socket = hb_parsocket( 1 );
|
||||
int iLen, iRet, iFlags = hb_parnidef( 4, 0 );
|
||||
char* pBuf;
|
||||
char * pBuf;
|
||||
long len;
|
||||
|
||||
iLen = hb_parni( 3 );
|
||||
|
||||
if( iLen > 65536 || iLen <= 0 )
|
||||
iLen = 4096;
|
||||
|
||||
pBuf = ( char* ) hb_xgrab( ( ULONG ) iLen );
|
||||
|
||||
hb_vmUnlock();
|
||||
iRet = recv( socket, pBuf, iLen, iFlags );
|
||||
hb_vmLock();
|
||||
|
||||
hb_retni( iRet );
|
||||
hb_storclen( pBuf, iRet > 0 ? iRet : 0, 2 );
|
||||
len = hb_parni( 3 );
|
||||
if( len <= 0 )
|
||||
len = 4096;
|
||||
pBuf = ( char* ) hb_xgrab( len + 1 );
|
||||
len = hb_socketRecv( hb_parsocket( 1 ), pBuf, len, hb_parni( 4 ),
|
||||
HB_ISNUM( 5 ) ? hb_parnint( 5 ) : -1 );
|
||||
hb_retni( len );
|
||||
hb_storclen( pBuf, len > 0 ? len : 0, 2 );
|
||||
hb_xfree( pBuf );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_SEND )
|
||||
{
|
||||
SOCKET socket = hb_parsocket( 1 );
|
||||
const char* pBuf = hb_parc( 2 );
|
||||
ULONG ulLen = hb_parclen( 2 );
|
||||
int iRet, iFlags = hb_parnidef( 3, 0 );
|
||||
|
||||
hb_vmUnlock();
|
||||
iRet = send( socket, pBuf, ulLen, iFlags );
|
||||
hb_vmLock();
|
||||
hb_retni( iRet );
|
||||
hb_retni( hb_socketSend( hb_parsocket( 1 ), hb_parc( 2 ), hb_parclen( 2 ),
|
||||
hb_parni( 4 ), HB_ISNUM( 5 ) ? hb_parnint( 5 ) : -1 ) );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_SELECT )
|
||||
{
|
||||
fd_set setread, setwrite, seterror;
|
||||
BOOL bRead = 0, bWrite = 0, bError = 0;
|
||||
struct timeval tv;
|
||||
SOCKET socket, maxsocket;
|
||||
PHB_ITEM pArray, pItem;
|
||||
ULONG ulLen, ulIndex, ulCount;
|
||||
LONG lTimeout;
|
||||
int iRet;
|
||||
|
||||
|
||||
FD_ZERO( &setread );
|
||||
FD_ZERO( &setwrite );
|
||||
FD_ZERO( &seterror );
|
||||
|
||||
maxsocket = (SOCKET) 0;
|
||||
|
||||
pArray = hb_param( 1, HB_IT_ARRAY );
|
||||
if( pArray )
|
||||
{
|
||||
ulLen = hb_arrayLen( pArray );
|
||||
for( ulIndex = 1; ulIndex <= ulLen; ulIndex++ )
|
||||
{
|
||||
socket = hb_itemGetSocket( hb_arrayGetItemPtr( pArray, ulIndex ) );
|
||||
if( socket != INVALID_SOCKET )
|
||||
{
|
||||
bRead = 1;
|
||||
FD_SET( socket, &setread );
|
||||
if( socket > maxsocket )
|
||||
maxsocket = socket;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pArray = hb_param( 2, HB_IT_ARRAY );
|
||||
if( pArray )
|
||||
{
|
||||
ulLen = hb_arrayLen( pArray );
|
||||
for( ulIndex = 1; ulIndex <= ulLen; ulIndex++ )
|
||||
{
|
||||
socket = hb_itemGetSocket( hb_arrayGetItemPtr( pArray, ulIndex ) );
|
||||
if( socket != INVALID_SOCKET )
|
||||
{
|
||||
bWrite = 1;
|
||||
FD_SET( socket, &setwrite );
|
||||
if( socket > maxsocket )
|
||||
maxsocket = socket;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pArray = hb_param( 3, HB_IT_ARRAY );
|
||||
if( pArray )
|
||||
{
|
||||
ulLen = hb_arrayLen( pArray );
|
||||
for( ulIndex = 1; ulIndex <= ulLen; ulIndex++ )
|
||||
{
|
||||
socket = hb_itemGetSocket( hb_arrayGetItemPtr( pArray, ulIndex ) );
|
||||
if( socket != INVALID_SOCKET )
|
||||
{
|
||||
bError = 1;
|
||||
FD_SET( socket, &seterror );
|
||||
if( socket > maxsocket )
|
||||
maxsocket = socket;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Default forever */
|
||||
lTimeout = HB_ISNUM( 4 ) ? hb_parnl( 4 ) : -1;
|
||||
|
||||
hb_vmUnlock();
|
||||
if( lTimeout == -1 )
|
||||
{
|
||||
iRet = select( maxsocket + 1, bRead ? &setread : NULL, bWrite ? &setwrite: NULL,
|
||||
bError ? &seterror : NULL, NULL );
|
||||
}
|
||||
else
|
||||
{
|
||||
tv.tv_sec = lTimeout / 1000;
|
||||
tv.tv_usec = ( lTimeout % 1000 ) * 1000;
|
||||
iRet = select( maxsocket + 1, bRead ? &setread : NULL, bWrite ? &setwrite: NULL,
|
||||
bError ? &seterror : NULL, &tv );
|
||||
}
|
||||
hb_vmLock();
|
||||
|
||||
pArray = hb_param( 1, HB_IT_ARRAY );
|
||||
if( pArray && HB_ISBYREF( 1 ) )
|
||||
{
|
||||
ulLen = hb_arrayLen( pArray );
|
||||
pItem = hb_itemNew( NULL );
|
||||
hb_arrayNew( pItem, ulLen );
|
||||
ulCount = 0;
|
||||
for( ulIndex = 1; ulIndex <= ulLen; ulIndex++ )
|
||||
{
|
||||
socket = hb_itemGetSocket( hb_arrayGetItemPtr( pArray, ulIndex ) );
|
||||
if( socket != INVALID_SOCKET )
|
||||
{
|
||||
if( FD_ISSET( socket, &setread ) )
|
||||
{
|
||||
hb_arraySetForward( pItem, ++ulCount, hb_itemPutSocket( NULL, socket ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
hb_itemParamStoreForward( 1, pItem );
|
||||
}
|
||||
|
||||
pArray = hb_param( 2, HB_IT_ARRAY );
|
||||
if( pArray && HB_ISBYREF( 2 ) )
|
||||
{
|
||||
ulLen = hb_arrayLen( pArray );
|
||||
pItem = hb_itemNew( NULL );
|
||||
hb_arrayNew( pItem, ulLen );
|
||||
ulCount = 0;
|
||||
for( ulIndex = 1; ulIndex <= ulLen; ulIndex++ )
|
||||
{
|
||||
socket = hb_itemGetSocket( hb_arrayGetItemPtr( pArray, ulIndex ) );
|
||||
if( socket != INVALID_SOCKET )
|
||||
{
|
||||
if( FD_ISSET( socket, &setwrite ) )
|
||||
{
|
||||
hb_arraySetForward( pItem, ++ulCount, hb_itemPutSocket( NULL, socket ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
hb_itemParamStoreForward( 2, pItem );
|
||||
}
|
||||
|
||||
pArray = hb_param( 3, HB_IT_ARRAY );
|
||||
if( pArray && HB_ISBYREF( 3 ) )
|
||||
{
|
||||
ulLen = hb_arrayLen( pArray );
|
||||
pItem = hb_itemNew( NULL );
|
||||
hb_arrayNew( pItem, ulLen );
|
||||
ulCount = 0;
|
||||
for( ulIndex = 1; ulIndex <= ulLen; ulIndex++ )
|
||||
{
|
||||
socket = hb_itemGetSocket( hb_arrayGetItemPtr( pArray, ulIndex ) );
|
||||
if( socket != INVALID_SOCKET )
|
||||
{
|
||||
if( FD_ISSET( socket, &seterror ) )
|
||||
{
|
||||
hb_arraySetForward( pItem, ++ulCount, hb_itemPutSocket( NULL, socket ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
hb_itemParamStoreForward( 3, pItem );
|
||||
}
|
||||
|
||||
hb_retni( iRet );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_GETSOCKNAME )
|
||||
{
|
||||
PHB_ITEM pItem;
|
||||
struct sockaddr saddr;
|
||||
socklen_t iSize = sizeof( struct sockaddr );
|
||||
void * sa;
|
||||
unsigned len;
|
||||
int iRet;
|
||||
|
||||
hb_retni( getsockname( hb_parsocket( 1 ), &saddr, &iSize ) );
|
||||
iRet = hb_socketGetSockName( hb_parsocket( 1 ), &sa, &len );
|
||||
hb_retni( iRet );
|
||||
if( HB_ISBYREF( 2 ) )
|
||||
{
|
||||
pItem = hb_itemPutSockaddr( NULL, &saddr );
|
||||
hb_itemParamStoreForward( 2, pItem );
|
||||
hb_itemRelease( pItem );
|
||||
PHB_ITEM pItem = hb_socketAddrToItem( sa, len );
|
||||
if( pItem )
|
||||
{
|
||||
hb_itemParamStoreForward( 2, pItem );
|
||||
hb_itemRelease( pItem );
|
||||
}
|
||||
else
|
||||
hb_stor( 2 );
|
||||
}
|
||||
if( sa )
|
||||
hb_xfree( sa );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_GETPEERNAME )
|
||||
{
|
||||
PHB_ITEM pItem;
|
||||
struct sockaddr saddr;
|
||||
socklen_t iSize = sizeof( struct sockaddr );
|
||||
void * sa;
|
||||
unsigned len;
|
||||
int iRet;
|
||||
|
||||
hb_retni( getpeername( hb_parsocket( 1 ), &saddr, &iSize ) );
|
||||
iRet = hb_socketGetPeerName( hb_parsocket( 1 ), &sa, &len );
|
||||
hb_retni( iRet );
|
||||
if( HB_ISBYREF( 2 ) )
|
||||
{
|
||||
pItem = hb_itemPutSockaddr( NULL, &saddr );
|
||||
hb_itemParamStoreForward( 2, pItem );
|
||||
hb_itemRelease( pItem );
|
||||
PHB_ITEM pItem = hb_socketAddrToItem( sa, len );
|
||||
if( pItem )
|
||||
{
|
||||
hb_itemParamStoreForward( 2, pItem );
|
||||
hb_itemRelease( pItem );
|
||||
}
|
||||
else
|
||||
hb_stor( 2 );
|
||||
}
|
||||
if( sa )
|
||||
hb_xfree( sa );
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( SOCKET_CONNECT )
|
||||
{
|
||||
SOCKET socket = hb_parsocket( 1 );
|
||||
struct sockaddr sa;
|
||||
int iRet;
|
||||
void * sa;
|
||||
unsigned len;
|
||||
|
||||
hb_itemGetSockaddr( hb_param( 2, HB_IT_ANY ), &sa );
|
||||
hb_vmUnlock();
|
||||
iRet = connect( socket, &sa, sizeof( struct sockaddr ) );
|
||||
hb_vmLock();
|
||||
hb_retni( iRet );
|
||||
if( hb_socketAddrFromItem( &sa, &len, hb_param( 2, HB_IT_ANY ) ) )
|
||||
{
|
||||
hb_retni( hb_socketConnect( hb_parsocket( 1 ), sa, len,
|
||||
HB_ISNUM( 3 ) ? hb_parnint( 3 ) : -1 ) );
|
||||
hb_xfree( sa );
|
||||
}
|
||||
}
|
||||
|
||||
HB_FUNC( SOCKET_SELECT )
|
||||
{
|
||||
hb_retni( hb_socketSelect( hb_param( 1, HB_IT_ARRAY ), HB_ISBYREF( 1 ),
|
||||
hb_param( 2, HB_IT_ARRAY ), HB_ISBYREF( 2 ),
|
||||
hb_param( 3, HB_IT_ARRAY ), HB_ISBYREF( 3 ),
|
||||
HB_ISNUM( 4 ) ? hb_parnint( 4 ) : -1,
|
||||
hb_itemGetSocket ) );
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ C_HEADERS=\
|
||||
hbapigt.h \
|
||||
hbapiitm.h \
|
||||
hbapilng.h \
|
||||
hbapinet.h \
|
||||
hbapirdd.h \
|
||||
hbassert.h \
|
||||
hbatomic.h \
|
||||
@@ -47,6 +46,7 @@ C_HEADERS=\
|
||||
hbregex.h \
|
||||
hbset.h \
|
||||
hbsetup.h \
|
||||
hbsocket.h \
|
||||
hbstack.h \
|
||||
hbsxfunc.h \
|
||||
hbthread.h \
|
||||
@@ -96,6 +96,7 @@ PRG_HEADERS=\
|
||||
hbpers.ch \
|
||||
hbsetup.ch \
|
||||
hbsix.ch \
|
||||
hbsocket.ch \
|
||||
hbstdgen.ch \
|
||||
hbthread.ch \
|
||||
hbusrrdd.ch \
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* Networking API
|
||||
*
|
||||
* Copyright 2009 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* www - http://www.harbour-project.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
||||
*
|
||||
* As a special exception, the Harbour Project gives permission for
|
||||
* additional uses of the text contained in its release of Harbour.
|
||||
*
|
||||
* The exception is that, if you link the Harbour libraries with other
|
||||
* files to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the Harbour library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the Harbour
|
||||
* Project under the name Harbour. If you copy code from other
|
||||
* Harbour Project or Free Software Foundation releases into a copy of
|
||||
* Harbour, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for Harbour, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HB_APINET_H_
|
||||
#define HB_APINET_H_
|
||||
|
||||
#include "hbapi.h"
|
||||
#include "hbapiitm.h"
|
||||
|
||||
#if ! defined( HB_OS_DOS )
|
||||
|
||||
#define HB_API_NET
|
||||
|
||||
HB_EXTERN_BEGIN
|
||||
|
||||
#if defined( HB_OS_WIN ) && ! defined( HB_OS_UNIX_COMPATIBLE )
|
||||
#define HB_SOCKET_T SOCKET
|
||||
|
||||
#define _WINSOCKAPI_ /* Prevents inclusion of winsock.h in windows.h */
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#define HB_SOCKET_T int
|
||||
|
||||
#include <errno.h>
|
||||
#if defined( HB_OS_OS2 )
|
||||
#if defined( __WATCOMC__ )
|
||||
#include <types.h>
|
||||
#include <nerrno.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/ioctl.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
typedef struct _HB_SOCKET
|
||||
{
|
||||
HB_SOCKET_T com;
|
||||
struct sockaddr_in remote;
|
||||
char szErrorText[ 128 ];
|
||||
const char * pszErrorText;
|
||||
int iErrorCode;
|
||||
int iCount;
|
||||
int iTimeout;
|
||||
int iTimeLimit;
|
||||
PHB_ITEM pPeriodicBlock;
|
||||
} HB_SOCKET, * PHB_SOCKET;
|
||||
|
||||
extern int hb_selectReadFD( HB_SOCKET_T fd, int iTimeout );
|
||||
extern int hb_selectWriteFD( HB_SOCKET_T fd, int iTimeout );
|
||||
extern int hb_selectReadSocket( PHB_SOCKET pSocket );
|
||||
extern int hb_selectWriteSocket( PHB_SOCKET pSocket );
|
||||
|
||||
HB_EXTERN_END
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* HB_APINET_H_ */
|
||||
@@ -1158,7 +1158,6 @@ EXTERNAL HB_REGEXSPLIT
|
||||
EXTERNAL HB_REGEXATX
|
||||
EXTERNAL HB_REGEXALL
|
||||
|
||||
#ifndef __PLATFORM__DOS
|
||||
EXTERNAL HB_INETINIT
|
||||
EXTERNAL HB_INETCLEANUP
|
||||
EXTERNAL HB_INETCREATE
|
||||
@@ -1201,8 +1200,6 @@ EXTERNAL HB_INETGETRCVBUFSIZE
|
||||
EXTERNAL HB_INETSETSNDBUFSIZE
|
||||
EXTERNAL HB_INETSETRCVBUFSIZE
|
||||
|
||||
#endif /* __PLATFORM__DOS */
|
||||
|
||||
EXTERNAL HB_ZLIBVERSION
|
||||
EXTERNAL HB_ZCOMPRESS
|
||||
EXTERNAL HB_ZCOMPRESSBOUND
|
||||
|
||||
191
harbour/include/hbsocket.ch
Normal file
191
harbour/include/hbsocket.ch
Normal file
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* socket related constant values
|
||||
*
|
||||
* Copyright 2009 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
|
||||
* www - http://www.harbour-project.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
||||
*
|
||||
* As a special exception, the Harbour Project gives permission for
|
||||
* additional uses of the text contained in its release of Harbour.
|
||||
*
|
||||
* The exception is that, if you link the Harbour libraries with other
|
||||
* files to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the Harbour library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the Harbour
|
||||
* Project under the name Harbour. If you copy code from other
|
||||
* Harbour Project or Free Software Foundation releases into a copy of
|
||||
* Harbour, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for Harbour, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HB_SOCK_CH_
|
||||
#define HB_SOCK_CH_
|
||||
|
||||
/* Harbour socket error codes */
|
||||
#define HB_SOCKET_ERR_PIPE 1
|
||||
#define HB_SOCKET_ERR_TIMEOUT 2
|
||||
#define HB_SOCKET_ERR_WRONGADDR 3
|
||||
#define HB_SOCKET_ERR_AFNOSUPPORT 4
|
||||
#define HB_SOCKET_ERR_PFNOSUPPORT 5
|
||||
#define HB_SOCKET_ERR_PROTONOSUPPORT 6
|
||||
#define HB_SOCKET_ERR_PARAMVALUE 7
|
||||
#define HB_SOCKET_ERR_NOSUPPORT 8
|
||||
#define HB_SOCKET_ERR_NORESOURCE 9
|
||||
#define HB_SOCKET_ERR_ACCESS 10
|
||||
#define HB_SOCKET_ERR_ADDRINUSE 11
|
||||
#define HB_SOCKET_ERR_INTERRUPT 12
|
||||
#define HB_SOCKET_ERR_ALREADYCONNECTED 13
|
||||
#define HB_SOCKET_ERR_CONNREFUSED 14
|
||||
#define HB_SOCKET_ERR_CONNABORTED 15
|
||||
#define HB_SOCKET_ERR_CONNRESET 16
|
||||
#define HB_SOCKET_ERR_NETUNREACH 17
|
||||
#define HB_SOCKET_ERR_NETDOWN 18
|
||||
#define HB_SOCKET_ERR_NETRESET 19
|
||||
#define HB_SOCKET_ERR_INPROGRESS 20
|
||||
#define HB_SOCKET_ERR_ALREADY 21
|
||||
#define HB_SOCKET_ERR_ADDRNOTAVAIL 22
|
||||
#define HB_SOCKET_ERR_READONLY 23
|
||||
#define HB_SOCKET_ERR_AGAIN 24
|
||||
#define HB_SOCKET_ERR_INVALIDHANDLE 25
|
||||
#define HB_SOCKET_ERR_INVAL 26
|
||||
#define HB_SOCKET_ERR_PROTO 27
|
||||
#define HB_SOCKET_ERR_PROTOTYPE 28
|
||||
#define HB_SOCKET_ERR_NOFILE 29
|
||||
#define HB_SOCKET_ERR_NOBUFS 30
|
||||
#define HB_SOCKET_ERR_NOMEM 31
|
||||
#define HB_SOCKET_ERR_FAULT 32
|
||||
#define HB_SOCKET_ERR_NAMETOOLONG 33
|
||||
#define HB_SOCKET_ERR_NOENT 34
|
||||
#define HB_SOCKET_ERR_NOTDIR 35
|
||||
#define HB_SOCKET_ERR_LOOP 36
|
||||
#define HB_SOCKET_ERR_MSGSIZE 37
|
||||
#define HB_SOCKET_ERR_DESTADDRREQ 38
|
||||
#define HB_SOCKET_ERR_NOPROTOOPT 39
|
||||
#define HB_SOCKET_ERR_NOTCONN 40
|
||||
#define HB_SOCKET_ERR_SHUTDOWN 41
|
||||
#define HB_SOCKET_ERR_TOOMANYREFS 42
|
||||
#define HB_SOCKET_ERR_RESTARTSYS 43
|
||||
#define HB_SOCKET_ERR_NOSR 44
|
||||
#define HB_SOCKET_ERR_HOSTDOWN 45
|
||||
#define HB_SOCKET_ERR_HOSTUNREACH 46
|
||||
#define HB_SOCKET_ERR_NOTEMPTY 47
|
||||
#define HB_SOCKET_ERR_USERS 48
|
||||
#define HB_SOCKET_ERR_DQUOT 49
|
||||
#define HB_SOCKET_ERR_STALE 50
|
||||
#define HB_SOCKET_ERR_REMOTE 51
|
||||
#define HB_SOCKET_ERR_PROCLIM 52
|
||||
#define HB_SOCKET_ERR_DISCON 53
|
||||
#define HB_SOCKET_ERR_NOMORE 54
|
||||
#define HB_SOCKET_ERR_CANCELLED 55
|
||||
#define HB_SOCKET_ERR_INVALIDPROCTABLE 56
|
||||
#define HB_SOCKET_ERR_INVALIDPROVIDER 57
|
||||
#define HB_SOCKET_ERR_PROVIDERFAILEDINIT 58
|
||||
#define HB_SOCKET_ERR_REFUSED 59
|
||||
#define HB_SOCKET_ERR_SYSNOTREADY 60
|
||||
#define HB_SOCKET_ERR_VERNOTSUPPORTED 61
|
||||
#define HB_SOCKET_ERR_NOTINITIALISED 62
|
||||
#define HB_SOCKET_ERR_TRYAGAIN 63
|
||||
#define HB_SOCKET_ERR_HOSTNOTFOUND 64
|
||||
#define HB_SOCKET_ERR_NORECOVERY 65
|
||||
#define HB_SOCKET_ERR_NODATA 66
|
||||
#define HB_SOCKET_ERR_SYSCALLFAILURE 67
|
||||
#define HB_SOCKET_ERR_SERVICENOTFOUND 68
|
||||
#define HB_SOCKET_ERR_TYPENOTFOUND 69
|
||||
#define HB_SOCKET_ERR_OTHER 70
|
||||
|
||||
|
||||
/* protocol family */
|
||||
#define HB_SOCK_PF_LOCAL 1
|
||||
#define HB_SOCK_PF_INET 2
|
||||
#define HB_SOCK_PF_IPX 4
|
||||
#define HB_SOCK_PF_INET6 10
|
||||
#define HB_SOCK_PF_PACKET 17
|
||||
|
||||
/* address familly */
|
||||
#define HB_SOCK_AF_LOCAL HB_SOCK_PF_LOCAL
|
||||
#define HB_SOCK_AF_INET HB_SOCK_PF_INET
|
||||
#define HB_SOCK_AF_IPX HB_SOCK_PF_IPX
|
||||
#define HB_SOCK_AF_INET6 HB_SOCK_PF_INET6
|
||||
#define HB_SOCK_AF_PACKET HB_SOCK_PF_PACKET
|
||||
|
||||
/* protocol type */
|
||||
#define HB_SOCK_STREAM 1
|
||||
#define HB_SOCK_DGRAM 2
|
||||
#define HB_SOCK_RAW 3
|
||||
#define HB_SOCK_RDM 4
|
||||
#define HB_SOCK_SEQPACKET 5
|
||||
|
||||
/* IP protocols */
|
||||
#define HB_SOCK_IPPROTO_IP 0 /* Dummy protocol for TCP */
|
||||
#define HB_SOCK_IPPROTO_ICMP 1 /* Internet Control Message Protocol */
|
||||
#define HB_SOCK_IPPROTO_IGMP 2 /* Internet Group Management Protocol */
|
||||
#define HB_SOCK_IPPROTO_IPIP 4 /* IPIP tunnels (older KA9Q tunnels use 94) */
|
||||
#define HB_SOCK_IPPROTO_TCP 6 /* Transmission Control Protocol */
|
||||
#define HB_SOCK_IPPROTO_EGP 8 /* Exterior Gateway Protocol */
|
||||
#define HB_SOCK_IPPROTO_PUP 12 /* PUP protocol */
|
||||
#define HB_SOCK_IPPROTO_UDP 17 /* User Datagram Protocol */
|
||||
#define HB_SOCK_IPPROTO_IDP 22 /* XNS IDP protocol */
|
||||
#define HB_SOCK_IPPROTO_DCCP 23 /* DCCP protocol */
|
||||
#define HB_SOCK_IPPROTO_RDP 29 /* RDP */
|
||||
#define HB_SOCK_IPPROTO_TP 29 /* SO Transport Protocol Class 4 */
|
||||
#define HB_SOCK_IPPROTO_IPV6 41 /* IPv6 header */
|
||||
#define HB_SOCK_IPPROTO_ROUTING 43 /* IPv6 routing header */
|
||||
#define HB_SOCK_IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */
|
||||
#define HB_SOCK_IPPROTO_RSVP 46 /* Reservation Protocol */
|
||||
#define HB_SOCK_IPPROTO_GRE 47 /* General Routing Encapsulation */
|
||||
#define HB_SOCK_IPPROTO_ESP 50 /* Encapsulating security payload */
|
||||
#define HB_SOCK_IPPROTO_AH 51 /* Authentication header */
|
||||
#define HB_SOCK_IPPROTO_ICMPV6 58 /* ICMP v6 */
|
||||
#define HB_SOCK_IPPROTO_NONE 59 /* IPv6 no next header */
|
||||
#define HB_SOCK_IPPROTO_DSTOPTS 60 /* IPv6 destination options */
|
||||
#define HB_SOCK_IPPROTO_ND 77 /* ND */
|
||||
#define HB_SOCK_IPPROTO_ICLFXBM 78 /* ICLFXBM */
|
||||
#define HB_SOCK_IPPROTO_EON 80 /* EON */
|
||||
#define HB_SOCK_IPPROTO_MTP 92 /* Multicast Transport Protocol */
|
||||
#define HB_SOCK_IPPROTO_ENCAP 98 /* Encapsulation Header */
|
||||
#define HB_SOCK_IPPROTO_PIM 103 /* Protocol Independent Multicast */
|
||||
#define HB_SOCK_IPPROTO_COMP 108 /* Compression Header Protocol */
|
||||
#define HB_SOCK_IPPROTO_PGM 113 /* PGM */
|
||||
#define HB_SOCK_IPPROTO_L2TP 115 /* L2TP */
|
||||
#define HB_SOCK_IPPROTO_SCTP 132 /* Stream Control Transmission Protocol */
|
||||
#define HB_SOCK_IPPROTO_RAW 255 /* Raw IP packets */
|
||||
|
||||
/* shutdown actions */
|
||||
#define HB_SOCK_SHUT_RD 0
|
||||
#define HB_SOCK_SHUT_WR 1
|
||||
#define HB_SOCK_SHUT_RDWR 2
|
||||
|
||||
|
||||
#endif /* HB_SOCK_CH_ */
|
||||
119
harbour/include/hbsocket.h
Normal file
119
harbour/include/hbsocket.h
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* socket C API
|
||||
*
|
||||
* Copyright 2009 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
|
||||
* www - http://www.harbour-project.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
||||
*
|
||||
* As a special exception, the Harbour Project gives permission for
|
||||
* additional uses of the text contained in its release of Harbour.
|
||||
*
|
||||
* The exception is that, if you link the Harbour libraries with other
|
||||
* files to produce an executable, this does not by itself cause the
|
||||
* resulting executable to be covered by the GNU General Public License.
|
||||
* Your use of that executable is in no way restricted on account of
|
||||
* linking the Harbour library code into it.
|
||||
*
|
||||
* This exception does not however invalidate any other reasons why
|
||||
* the executable file might be covered by the GNU General Public License.
|
||||
*
|
||||
* This exception applies only to the code released by the Harbour
|
||||
* Project under the name Harbour. If you copy code from other
|
||||
* Harbour Project or Free Software Foundation releases into a copy of
|
||||
* Harbour, as the General Public License permits, the exception does
|
||||
* not apply to the code that you add in this way. To avoid misleading
|
||||
* anyone as to the status of such modified files, you must delete
|
||||
* this exception notice from them.
|
||||
*
|
||||
* If you write modifications of your own for Harbour, it is your choice
|
||||
* whether to permit this exception to apply to your modifications.
|
||||
* If you do not wish that, delete this exception notice.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HB_SOCK_H_
|
||||
#define HB_SOCK_H_
|
||||
|
||||
#include "hbapi.h"
|
||||
#include "hbsocket.ch"
|
||||
|
||||
HB_EXTERN_BEGIN
|
||||
|
||||
#if defined( HB_OS_WIN ) && ! defined( HB_OS_UNIX_COMPATIBLE )
|
||||
typedef HB_PTRUINT HB_SOCKET_T;
|
||||
#else
|
||||
typedef int HB_SOCKET_T;
|
||||
#endif
|
||||
|
||||
typedef HB_SOCKET_T ( * HB_SOCK_FUNC )( PHB_ITEM );
|
||||
|
||||
#define HB_NO_SOCKET ( ( HB_SOCKET_T ) -1 )
|
||||
|
||||
HB_EXPORT extern int hb_socketInit( void );
|
||||
HB_EXPORT extern void hb_socketCleanup( void );
|
||||
HB_EXPORT extern int hb_socketGetError( void );
|
||||
HB_EXPORT extern int hb_socketGetOsError( void );
|
||||
HB_EXPORT extern const char * hb_socketErrorStr( int iError );
|
||||
HB_EXPORT extern int hb_socketGetAddrFamilly( const void * pSockAddr, unsigned len );
|
||||
HB_EXPORT extern BOOL hb_socketLocalAddr( void ** pSockAddr, unsigned * puiLen, const char * szAddr );
|
||||
HB_EXPORT extern BOOL hb_socketInetAddr( void ** pSockAddr, unsigned * puiLen, const char * szAddr, int iPort );
|
||||
HB_EXPORT extern BOOL hb_socketInet6Addr( void ** pSockAddr, unsigned * puiLen, const char * szAddr, int iPort );
|
||||
HB_EXPORT extern char * hb_socketAddrGetName( const void * pSockAddr, unsigned len );
|
||||
HB_EXPORT extern char * hb_socketResolveAddr( const char * szAddr, int af );
|
||||
HB_EXPORT extern PHB_ITEM hb_socketGetHosts( const char * szAddr, int af );
|
||||
HB_EXPORT extern PHB_ITEM hb_socketGetAliases( const char * szAddr, int af );
|
||||
HB_EXPORT extern int hb_socketAddrGetPort( const void * pSockAddr, unsigned len );
|
||||
HB_EXPORT extern BOOL hb_socketAddrFromItem( void ** pSockAddr, unsigned * puiLen, PHB_ITEM pAddrItm );
|
||||
HB_EXPORT extern PHB_ITEM hb_socketAddrToItem( const void * pSockAddr, unsigned len );
|
||||
HB_EXPORT extern int hb_socketGetSockName( HB_SOCKET_T sd, void ** pSockAddr, unsigned * puiLen );
|
||||
HB_EXPORT extern int hb_socketGetPeerName( HB_SOCKET_T sd, void ** pSockAddr, unsigned * puiLen );
|
||||
HB_EXPORT extern HB_SOCKET_T hb_socketOpen( int domain, int type, int protocol );
|
||||
HB_EXPORT extern int hb_socketClose( HB_SOCKET_T sd );
|
||||
HB_EXPORT extern int hb_socketShutdown( HB_SOCKET_T sd, int iMode );
|
||||
HB_EXPORT extern int hb_socketBind( HB_SOCKET_T sd, const void * pSockAddr, unsigned uiLen );
|
||||
HB_EXPORT extern int hb_socketListen( HB_SOCKET_T sd, int iBacklog );
|
||||
HB_EXPORT extern HB_SOCKET_T hb_socketAccept( HB_SOCKET_T sd, void ** pSockAddr, unsigned * puiLen, HB_LONG timeout );
|
||||
HB_EXPORT extern int hb_socketConnect( HB_SOCKET_T sd, const void * pSockAddr, unsigned uiLen, HB_LONG timeout );
|
||||
HB_EXPORT extern long hb_socketSend( HB_SOCKET_T sd, const void * data, long len, int flags, HB_LONG timeout );
|
||||
HB_EXPORT extern long hb_socketSendTo( HB_SOCKET_T sd, const void * data, long len, int flags, const void * pSockAddr, unsigned uiSockLen, HB_LONG timeout );
|
||||
HB_EXPORT extern long hb_socketRecv( HB_SOCKET_T sd, void * data, long len, int flags, HB_LONG timeout );
|
||||
HB_EXPORT extern long hb_socketRecvFrom( HB_SOCKET_T sd, void * data, long len, int flags, void ** pSockAddr, unsigned * puiSockLen, HB_LONG timeout );
|
||||
HB_EXPORT extern int hb_socketSetBlockingIO( HB_SOCKET_T sd, BOOL fBlocking );
|
||||
HB_EXPORT extern int hb_socketSetReuseAddr( HB_SOCKET_T sd, BOOL fReuse );
|
||||
HB_EXPORT extern int hb_socketSetKeepAlive( HB_SOCKET_T sd, BOOL fKeepAlive );
|
||||
HB_EXPORT extern int hb_socketSetBroadcast( HB_SOCKET_T sd, BOOL fBroadcast );
|
||||
HB_EXPORT extern int hb_socketSetSndBufSize( HB_SOCKET_T sd, int iSize );
|
||||
HB_EXPORT extern int hb_socketSetRcvBufSize( HB_SOCKET_T sd, int iSize );
|
||||
HB_EXPORT extern int hb_socketGetRcvBufSize( HB_SOCKET_T sd, int * piSize );
|
||||
HB_EXPORT extern int hb_socketGetSndBufSize( HB_SOCKET_T sd, int * piSize );
|
||||
HB_EXPORT extern int hb_socketSetMulticast( HB_SOCKET_T sd, int af, const char * szAddr );
|
||||
HB_EXPORT extern int hb_socketSelectRead( HB_SOCKET_T sd, HB_LONG timeout );
|
||||
HB_EXPORT extern int hb_socketSelectWrite( HB_SOCKET_T sd, HB_LONG timeout );
|
||||
HB_EXPORT extern int hb_socketSelectWriteEx( HB_SOCKET_T sd, HB_LONG timeout );
|
||||
HB_EXPORT extern int hb_socketSelect( PHB_ITEM pArrayRD, BOOL fSetRD,
|
||||
PHB_ITEM pArrayWR, BOOL fSetWR,
|
||||
PHB_ITEM pArrayEX, BOOL fSetEX,
|
||||
HB_LONG timeout, HB_SOCK_FUNC pFunc );
|
||||
|
||||
HB_EXTERN_END
|
||||
|
||||
#endif /* HB_SOCK_H_ */
|
||||
@@ -93,6 +93,8 @@ typedef struct
|
||||
USHORT uiFError;
|
||||
USHORT uiErrorLast;
|
||||
USHORT uiOsErrorLast;
|
||||
USHORT uiSocketError;
|
||||
int iSocketOsError;
|
||||
}
|
||||
HB_IOERRORS, * PHB_IOERRORS;
|
||||
|
||||
|
||||
@@ -789,7 +789,15 @@ static BOOL hb_pp_hasCommand( char * pBuffer, ULONG ulLen, ULONG * pulAt, int iC
|
||||
{
|
||||
while( ul < ulLen && HB_PP_ISBLANK( pBuffer[ ul ] ) )
|
||||
++ul;
|
||||
if( ul == ulLen || pBuffer[ ul ] == ';' )
|
||||
|
||||
if( ul + 1 < ulLen &&
|
||||
( pBuffer[ ul ] == '/' || pBuffer[ ul ] == '&' ) &&
|
||||
pBuffer[ ul ] == pBuffer[ ul + 1 ] )
|
||||
/* strip the rest of line with // or && comment */
|
||||
ul = ulLen;
|
||||
|
||||
if( ul == ulLen || pBuffer[ ul ] == ';' ||
|
||||
( ul + 1 < ulLen && pBuffer[ ul ] == '/' && pBuffer[ ul + 1 ] == '*' ) )
|
||||
{
|
||||
* pulAt = ul;
|
||||
return TRUE;
|
||||
|
||||
@@ -85,6 +85,7 @@ C_SOURCES=\
|
||||
hbsha1hm.c \
|
||||
hbsha2.c \
|
||||
hbsha2hm.c \
|
||||
hbsocket.c \
|
||||
hbstrfmt.c \
|
||||
hbstrsh.c \
|
||||
hbtoken.c \
|
||||
|
||||
@@ -584,8 +584,8 @@ static const char * hb_i18n_setcodepage( PHB_I18N_TRANS pI18N,
|
||||
{
|
||||
if( fTranslate && cdpage )
|
||||
{
|
||||
ULONG ulLen = hb_hashLen( pI18N->context_table ), ul;
|
||||
for( ul = 1; ul <= ulLen; ++ul )
|
||||
ULONG ulHashLen = hb_hashLen( pI18N->context_table ), ul;
|
||||
for( ul = 1; ul <= ulHashLen; ++ul )
|
||||
{
|
||||
PHB_ITEM pContext = hb_hashGetValueAt( pI18N->context_table, ul );
|
||||
ULONG ulCount = hb_hashLen( pContext ), ulLen, u;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
2736
harbour/source/rtl/hbsocket.c
Normal file
2736
harbour/source/rtl/hbsocket.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7499,8 +7499,8 @@ void hb_vmFreeSymbols( PHB_SYMBOLS pSymbols )
|
||||
if( pSymbol->pDynSym && pSymbol->pDynSym->pSymbol != pSymbol &&
|
||||
( pSymbol->scope.value & HB_FS_LOCAL ) == 0 )
|
||||
pSymbol->scope.value |= HB_FS_DEFERRED;
|
||||
pSymbol->scope.value &= ~( HB_FS_PCODEFUNC | HB_FS_DYNCODE );
|
||||
}
|
||||
pSymbol->scope.value &= ~( HB_FS_PCODEFUNC | HB_FS_DYNCODE );
|
||||
}
|
||||
pSymbols->hDynLib = NULL;
|
||||
pSymbols->fActive = FALSE;
|
||||
|
||||
Reference in New Issue
Block a user