2009-07-31 12:29 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* source/rtl/hbinet.c
% Cleaned old error description handling logic. Now the error
desc is dynamically retrieved instead of being stored along
the error code.
This commit is contained in:
@@ -17,6 +17,12 @@
|
||||
past entries belonging to author(s): Viktor Szakats.
|
||||
*/
|
||||
|
||||
2009-07-31 12:29 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* source/rtl/hbinet.c
|
||||
% Cleaned old error description handling logic. Now the error
|
||||
desc is dynamically retrieved instead of being stored along
|
||||
the error code.
|
||||
|
||||
2009-07-31 11:58 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
|
||||
* harbour/source/rtl/hbinet.c
|
||||
! fixed typo in received bytes calculation. It was reported as warning
|
||||
|
||||
@@ -67,22 +67,26 @@
|
||||
#include "hbvm.h"
|
||||
#include "hbthread.h"
|
||||
|
||||
#define HB_INET_ERR_OK 0
|
||||
#define HB_INET_ERR_TIMEOUT ( -1 )
|
||||
#define HB_INET_ERR_CLOSEDCONN ( -2 )
|
||||
#define HB_INET_ERR_BUFFOVERRUN ( -3 )
|
||||
#define HB_INET_ERR_CLOSEDSOCKET ( -4 )
|
||||
|
||||
typedef struct
|
||||
{
|
||||
HB_SOCKET sd;
|
||||
void * remote;
|
||||
unsigned remotelen;
|
||||
char * buffer;
|
||||
long inbuffer;
|
||||
long posbuffer;
|
||||
long readahead;
|
||||
char szErrorText[ 128 ];
|
||||
const char * pszErrorText;
|
||||
int iErrorCode;
|
||||
int iCount;
|
||||
int iTimeout;
|
||||
int iTimeLimit;
|
||||
PHB_ITEM pPeriodicBlock;
|
||||
HB_SOCKET sd;
|
||||
void * remote;
|
||||
unsigned remotelen;
|
||||
char * buffer;
|
||||
long inbuffer;
|
||||
long posbuffer;
|
||||
long readahead;
|
||||
int iErrorCode;
|
||||
int iCount;
|
||||
int iTimeout;
|
||||
int iTimeLimit;
|
||||
PHB_ITEM pPeriodicBlock;
|
||||
} HB_SOCKET_STRUCT, * PHB_SOCKET_STRUCT;
|
||||
|
||||
#define HB_INET_BUFFER_LEN 256
|
||||
@@ -91,40 +95,16 @@ typedef struct
|
||||
|
||||
#define HB_PARSOCKET( n ) ( ( PHB_SOCKET_STRUCT ) hb_parptrGC( hb_inetSocketFinalize, n ) )
|
||||
|
||||
#define HB_SOCKET_ZERO_ERROR( s ) \
|
||||
do { \
|
||||
s->iErrorCode = 0; \
|
||||
s->pszErrorText = ""; \
|
||||
} while( 0 )
|
||||
|
||||
#define HB_SOCKET_SET_ERROR( s ) \
|
||||
do { \
|
||||
s->iErrorCode = hb_socketGetError(); \
|
||||
s->pszErrorText = hb_socketErrorStr( s->iErrorCode ); \
|
||||
} while( 0 )
|
||||
|
||||
#define HB_SOCKET_SET_ERROR1( s, code ) \
|
||||
do { \
|
||||
s->iErrorCode = code; \
|
||||
s->pszErrorText = hb_socketErrorStr( code ); \
|
||||
} while( 0 )
|
||||
|
||||
#define HB_SOCKET_SET_ERROR2( s, code, desc ) \
|
||||
do { \
|
||||
s->iErrorCode = code; \
|
||||
s->pszErrorText = desc; \
|
||||
} while( 0 )
|
||||
|
||||
#define HB_SOCKET_INIT( s, p ) \
|
||||
do { \
|
||||
HB_INET_INITIALIZE(); \
|
||||
s = ( PHB_SOCKET_STRUCT ) hb_gcAlloc( sizeof( HB_SOCKET_STRUCT ), hb_inetSocketFinalize ); \
|
||||
memset( s, '\0', sizeof( HB_SOCKET_STRUCT ) ); \
|
||||
memset( s, 0, sizeof( HB_SOCKET_STRUCT ) ); \
|
||||
s->sd = HB_NO_SOCKET; \
|
||||
s->readahead = HB_INET_BUFFER_LEN; \
|
||||
s->iTimeout = -1; \
|
||||
s->iTimeLimit = -1; \
|
||||
s->pszErrorText = ""; \
|
||||
s->iErrorCode = HB_INET_ERR_OK; \
|
||||
p = hb_itemPutPtrGC( p, s ); \
|
||||
} while( 0 )
|
||||
|
||||
@@ -154,7 +134,7 @@ static BOOL hb_inetIsOpen( PHB_SOCKET_STRUCT socket )
|
||||
{
|
||||
if( socket->sd == HB_NO_SOCKET )
|
||||
{
|
||||
HB_SOCKET_SET_ERROR2( socket, -4, "Closed socket" );
|
||||
socket->iErrorCode = HB_INET_ERR_CLOSEDSOCKET;
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
@@ -329,7 +309,17 @@ HB_FUNC( HB_INETERRORDESC )
|
||||
PHB_SOCKET_STRUCT socket = HB_PARSOCKET( 1 );
|
||||
|
||||
if( socket )
|
||||
hb_retc( socket->pszErrorText );
|
||||
{
|
||||
switch( socket->iErrorCode )
|
||||
{
|
||||
case HB_INET_ERR_OK : hb_retc_null(); return;
|
||||
case HB_INET_ERR_TIMEOUT : hb_retc_const( "Timeout" ); return;
|
||||
case HB_INET_ERR_CLOSEDCONN : hb_retc_const( "Connection closed" ); return;
|
||||
case HB_INET_ERR_CLOSEDSOCKET : hb_retc_const( "Closed socket" ); return;
|
||||
case HB_INET_ERR_BUFFOVERRUN : hb_retc_const( "Buffer overrun" ); return;
|
||||
default: hb_retc_const( hb_socketErrorStr( socket->iErrorCode ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
hb_inetErrRT();
|
||||
}
|
||||
@@ -339,7 +329,7 @@ HB_FUNC( HB_INETCLEARERROR )
|
||||
PHB_SOCKET_STRUCT socket = HB_PARSOCKET( 1 );
|
||||
|
||||
if( socket )
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
else
|
||||
hb_inetErrRT();
|
||||
}
|
||||
@@ -619,7 +609,7 @@ static void s_inetRecvInternal( int iMode )
|
||||
|
||||
iReceived = 0;
|
||||
iTimeElapsed = 0;
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
do
|
||||
{
|
||||
iLen = s_inetRecv( socket, buffer + iReceived, iMaxLen - iReceived, FALSE );
|
||||
@@ -649,13 +639,13 @@ static void s_inetRecvInternal( int iMode )
|
||||
socket->iCount = iReceived;
|
||||
|
||||
if( iLen == 0 )
|
||||
HB_SOCKET_SET_ERROR2( socket, -2, "Connection closed" );
|
||||
socket->iErrorCode = HB_INET_ERR_CLOSEDCONN;
|
||||
else if( iLen < 0 )
|
||||
{
|
||||
if( hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT )
|
||||
HB_SOCKET_SET_ERROR2( socket, -1, "Timeout" );
|
||||
socket->iErrorCode = HB_INET_ERR_TIMEOUT;
|
||||
else
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
hb_retni( iReceived > 0 ? iReceived : iLen );
|
||||
}
|
||||
@@ -707,7 +697,7 @@ static void s_inetRecvPattern( const char ** patterns, int * patternsizes,
|
||||
iBufferSize = pBufferSize ? hb_itemGetNI( pBufferSize ) : 80;
|
||||
iMax = pMaxSize ? hb_itemGetNI( pMaxSize ) : 0;
|
||||
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
|
||||
buffer = ( char * ) hb_xgrab( iBufferSize );
|
||||
iAllocated = iBufferSize;
|
||||
@@ -767,17 +757,17 @@ static void s_inetRecvPattern( const char ** patterns, int * patternsizes,
|
||||
else
|
||||
{
|
||||
if( iLen == 0 )
|
||||
HB_SOCKET_SET_ERROR2( socket, -2, "Connection closed" );
|
||||
socket->iErrorCode = HB_INET_ERR_CLOSEDCONN;
|
||||
else if( iLen < 0 )
|
||||
{
|
||||
if( hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT )
|
||||
HB_SOCKET_SET_ERROR2( socket, -1, "Timeout" );
|
||||
socket->iErrorCode = HB_INET_ERR_TIMEOUT;
|
||||
else
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
else
|
||||
{
|
||||
HB_SOCKET_SET_ERROR2( socket, -3, "Buffer overrun" );
|
||||
socket->iErrorCode = HB_INET_ERR_BUFFOVERRUN;
|
||||
iLen = -1;
|
||||
}
|
||||
if( pResult )
|
||||
@@ -874,14 +864,14 @@ HB_FUNC( HB_INETDATAREADY )
|
||||
hb_retni( -1 );
|
||||
else
|
||||
{
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
if( socket->inbuffer > 0 )
|
||||
iVal = 1;
|
||||
else
|
||||
{
|
||||
iVal = hb_socketSelectRead( socket->sd, HB_ISNUM( 2 ) ? hb_parnint( 2 ) : 0 );
|
||||
if( iVal < 0 )
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
hb_retni( iVal );
|
||||
}
|
||||
@@ -910,7 +900,7 @@ static void s_inetSendInternal( int iMode )
|
||||
iSend = iLen;
|
||||
}
|
||||
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
|
||||
iSent = iLen = 0;
|
||||
while( iSent < iSend )
|
||||
@@ -926,9 +916,9 @@ static void s_inetSendInternal( int iMode )
|
||||
else
|
||||
{
|
||||
if( iLen == -1 && hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT )
|
||||
HB_SOCKET_SET_ERROR2( socket, -1, "Timeout" );
|
||||
socket->iErrorCode = HB_INET_ERR_TIMEOUT;
|
||||
else
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1012,7 +1002,7 @@ HB_FUNC( HB_INETSERVER )
|
||||
hb_inetCloseSocket( socket );
|
||||
socket->sd = hb_socketOpen( HB_SOCKET_PF_INET, HB_SOCKET_PT_STREAM, 0 );
|
||||
if( socket->sd == HB_NO_SOCKET )
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
else
|
||||
{
|
||||
int iPort = hb_parni( 1 );
|
||||
@@ -1025,11 +1015,11 @@ HB_FUNC( HB_INETSERVER )
|
||||
hb_socketBind( socket->sd, socket->remote, socket->remotelen ) != 0 ||
|
||||
hb_socketListen( socket->sd, iListen ) != 0 )
|
||||
{
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
hb_inetCloseSocket( socket );
|
||||
}
|
||||
else
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
}
|
||||
if( pSocket )
|
||||
hb_itemReturnRelease( pSocket );
|
||||
@@ -1052,9 +1042,9 @@ HB_FUNC( HB_INETACCEPT )
|
||||
if( incoming == HB_NO_SOCKET )
|
||||
{
|
||||
if( hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT )
|
||||
HB_SOCKET_SET_ERROR2( socket, -1, "Timeout" );
|
||||
socket->iErrorCode = HB_INET_ERR_TIMEOUT;
|
||||
else
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1065,7 +1055,7 @@ HB_FUNC( HB_INETACCEPT )
|
||||
new_socket->remotelen = len;
|
||||
new_socket->sd = incoming;
|
||||
hb_itemReturnRelease( pSocket );
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1095,13 +1085,13 @@ static void hb_inetConnectInternal( BOOL fResolve )
|
||||
szHost = szAddr = hb_socketResolveAddr( szHost, HB_SOCKET_AF_INET );
|
||||
|
||||
if( fResolve && !szAddr )
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
else
|
||||
{
|
||||
/* Creates comm socket */
|
||||
socket->sd = hb_socketOpen( HB_SOCKET_PF_INET, HB_SOCKET_PT_STREAM, 0 );
|
||||
if( socket->sd == HB_NO_SOCKET )
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
else
|
||||
{
|
||||
if( socket->remote )
|
||||
@@ -1112,12 +1102,12 @@ static void hb_inetConnectInternal( BOOL fResolve )
|
||||
hb_socketSetKeepAlive( socket->sd, TRUE );
|
||||
if( hb_socketConnect( socket->sd, socket->remote, socket->remotelen,
|
||||
socket->iTimeout ) != 0 )
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
else
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
}
|
||||
else
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
if( szAddr )
|
||||
hb_xfree( szAddr );
|
||||
@@ -1163,7 +1153,7 @@ HB_FUNC( HB_INETDGRAMBIND )
|
||||
socket->sd = hb_socketOpen( HB_SOCKET_PF_INET, HB_SOCKET_PT_DGRAM, HB_SOCKET_IPPROTO_UDP );
|
||||
if( socket->sd == HB_NO_SOCKET )
|
||||
{
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
hb_itemReturnRelease( pSocket );
|
||||
return;
|
||||
}
|
||||
@@ -1179,13 +1169,13 @@ HB_FUNC( HB_INETDGRAMBIND )
|
||||
szAddress, iPort ) ||
|
||||
hb_socketBind( socket->sd, socket->remote, socket->remotelen ) != 0 )
|
||||
{
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
hb_inetCloseSocket( socket );
|
||||
}
|
||||
else if( hb_pcount() >= 4 )
|
||||
{
|
||||
if( hb_socketSetMulticast( socket->sd, HB_SOCKET_PF_INET, hb_parc( 4 ) ) != 0 )
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
|
||||
hb_itemReturnRelease( pSocket );
|
||||
@@ -1202,7 +1192,7 @@ HB_FUNC( HB_INETDGRAM )
|
||||
socket->sd = hb_socketOpen( HB_SOCKET_PF_INET, HB_SOCKET_PT_DGRAM, HB_SOCKET_IPPROTO_UDP );
|
||||
if( socket->sd == HB_NO_SOCKET )
|
||||
{
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
hb_itemReturnRelease( pSocket );
|
||||
return;
|
||||
}
|
||||
@@ -1237,7 +1227,7 @@ HB_FUNC( HB_INETDGRAMSEND )
|
||||
hb_xfree( socket->remote );
|
||||
if( !hb_socketInetAddr( &socket->remote, &socket->remotelen, szAddress, iPort ) )
|
||||
{
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
iLen = -1;
|
||||
}
|
||||
else
|
||||
@@ -1256,13 +1246,13 @@ HB_FUNC( HB_INETDGRAMSEND )
|
||||
if( iLen == -1 )
|
||||
{
|
||||
if( hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT )
|
||||
HB_SOCKET_SET_ERROR2( socket, -1, "Timeout" );
|
||||
socket->iErrorCode = HB_INET_ERR_TIMEOUT;
|
||||
else
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
else
|
||||
{
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
socket->iCount = iLen;
|
||||
}
|
||||
}
|
||||
@@ -1319,16 +1309,16 @@ HB_FUNC( HB_INETDGRAMRECV )
|
||||
while( fRepeat );
|
||||
|
||||
if( iMax == 0 )
|
||||
HB_SOCKET_SET_ERROR2( socket, -2, "Connection closed" );
|
||||
socket->iErrorCode = HB_INET_ERR_CLOSEDCONN;
|
||||
else if( iMax < 0 )
|
||||
{
|
||||
if( hb_socketGetError() == HB_SOCKET_ERR_TIMEOUT )
|
||||
HB_SOCKET_SET_ERROR2( socket, -1, "Timeout" );
|
||||
socket->iErrorCode = HB_INET_ERR_TIMEOUT;
|
||||
else
|
||||
HB_SOCKET_SET_ERROR( socket );
|
||||
socket->iErrorCode = hb_socketGetError();
|
||||
}
|
||||
else
|
||||
HB_SOCKET_ZERO_ERROR( socket );
|
||||
socket->iErrorCode = HB_INET_ERR_OK;
|
||||
hb_retni( iMax );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user