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:
Viktor Szakats
2009-07-31 10:30:43 +00:00
parent 352ca04d7b
commit c7da271ebe
2 changed files with 76 additions and 80 deletions

View File

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

View File

@@ -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 );
}
}