From c7da271ebe419320a0d0b855af38516cd0985af6 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Fri, 31 Jul 2009 10:30:43 +0000 Subject: [PATCH] 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. --- harbour/ChangeLog | 6 ++ harbour/source/rtl/hbinet.c | 150 +++++++++++++++++------------------- 2 files changed, 76 insertions(+), 80 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 7dd88f27a8..3a9fee324c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -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 diff --git a/harbour/source/rtl/hbinet.c b/harbour/source/rtl/hbinet.c index e062413770..a96e0d4d70 100644 --- a/harbour/source/rtl/hbinet.c +++ b/harbour/source/rtl/hbinet.c @@ -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 ); } }