diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 860f9e6c3e..a859a92ae6 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,10 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-08-17 14:28 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/rtl/hbsocket.c + * small cleanup + 2009-08-17 14:13 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * source/vm/itemapi.c * source/vm/extend.c diff --git a/harbour/source/rtl/hbsocket.c b/harbour/source/rtl/hbsocket.c index 187da1d290..c025008479 100644 --- a/harbour/source/rtl/hbsocket.c +++ b/harbour/source/rtl/hbsocket.c @@ -99,7 +99,7 @@ #define HB_HAS_SELECT_TIMER all implementations should use BSD compatible constant values but - if it's not guarantied then these two mactos can be used. + if it's not guarantied then these two macros can be used. protocol families have to be translated: #define HB_SOCKET_TRANSLATE_DOMAIN @@ -1172,6 +1172,136 @@ static void hb_socketSetOsError( int err ) pError->iSocketOsError = err; } +#if defined( HB_SOCKET_TRANSLATE_DOMAIN ) +static int hb_socketTransDomain( int domain, int *err ) +{ + switch( domain ) + { + case HB_SOCKET_PF_INET: +#if defined( PF_INET ) + domain = PF_INET; +#elif defined( AF_INET ) + domain = AF_INET; +#else + if( err ) + *err = HB_SOCKET_ERR_PFNOSUPPORT; +#endif + break; + + case HB_SOCKET_PF_INET6: +#if defined( PF_INET6 ) + domain = PF_INET6; +#elif defined( AF_INET6 ) + domain = AF_INET6; +#else + if( err ) + *err = HB_SOCKET_ERR_PFNOSUPPORT; +#endif + break; + + case HB_SOCKET_PF_LOCAL: +#if defined( PF_LOCAL ) + domain = PF_LOCAL; +#elif defined( AF_LOCAL ) + domain = AF_LOCAL; +#elif defined( PF_UNIX ) + domain = PF_UNIX; +#elif defined( AF_UNIX ) + domain = AF_UNIX; +#else + if( err ) + *err = HB_SOCKET_ERR_PFNOSUPPORT; +#endif + break; + + case HB_SOCKET_PF_PACKET: +#if defined( PF_PACKET ) + domain = PF_PACKET; +#elif defined( AF_PACKET ) + domain = AF_PACKET; +#else + if( err ) + *err = HB_SOCKET_ERR_PFNOSUPPORT; +#endif + break; + + case HB_SOCKET_PF_IPX: +#if defined( PF_IPX ) + domain = PF_IPX; +#elif defined( AF_IPX ) + domain = AF_IPX; +#else + if( err ) + *err = HB_SOCKET_ERR_PFNOSUPPORT; +#endif + break; + + default: + if( err ) + *err = HB_SOCKET_ERR_PFNOSUPPORT; + } + return domain; +} +#endif + +#if defined( HB_SOCKET_TRANSLATE_TYPE ) +static int hb_socketTransType( int type, int *err ) +{ + switch( type ) + { + case HB_SOCKET_PT_STREAM: +#if defined( SOCK_STREAM ) + type = SOCK_STREAM; +#else + if( err ) + *err = HB_SOCKET_ERR_PROTONOSUPPORT; +#endif + break; + + case HB_SOCKET_PT_DGRAM: +#if defined( SOCK_DGRAM ) + type = SOCK_DGRAM; +#else + if( err ) + *err = HB_SOCKET_ERR_PROTONOSUPPORT; +#endif + break; + + case HB_SOCKET_PT_SEQPACKET: +#if defined( SOCK_SEQPACKET ) + type = SOCK_SEQPACKET; +#else + if( err ) + *err = HB_SOCKET_ERR_PROTONOSUPPORT; +#endif + break; + + case HB_SOCKET_PT_RAW: +#if defined( SOCK_RAW ) + type = SOCK_RAW; +#else + if( err ) + *err = HB_SOCKET_ERR_PROTONOSUPPORT; +#endif + break; + + case HB_SOCKET_PT_RDM: +#if defined( SOCK_RDM ) + type = SOCK_RDM; +#else + if( err ) + *err = HB_SOCKET_ERR_PROTONOSUPPORT; +#endif + break; + + default: + if( err ) + *err = HB_SOCKET_ERR_PROTONOSUPPORT; + } + return type; +} +#endif + static int hb_socketSelectRD( HB_SOCKET sd, HB_LONG timeout ) { struct timeval tv, * ptv; @@ -1775,113 +1905,12 @@ HB_SOCKET hb_socketOpen( int domain, int type, int protocol ) int err = 0; #if defined( HB_SOCKET_TRANSLATE_DOMAIN ) - switch( domain ) - { - case HB_SOCKET_PF_INET: -#if defined( PF_INET ) - domain = PF_INET; -#elif defined( AF_INET ) - domain = AF_INET; -#else - err = HB_SOCKET_ERR_PFNOSUPPORT; -#endif - break; - - case HB_SOCKET_PF_INET6: -#if defined( PF_INET6 ) - domain = PF_INET6; -#elif defined( AF_INET6 ) - domain = AF_INET6; -#else - err = HB_SOCKET_ERR_PFNOSUPPORT; -#endif - break; - - case HB_SOCKET_PF_LOCAL: -#if defined( PF_LOCAL ) - domain = PF_LOCAL; -#elif defined( AF_LOCAL ) - domain = AF_LOCAL; -#elif defined( PF_UNIX ) - domain = PF_UNIX; -#elif defined( AF_UNIX ) - domain = AF_UNIX; -#else - err = HB_SOCKET_ERR_PFNOSUPPORT; -#endif - break; - - case HB_SOCKET_PF_PACKET: -#if defined( PF_PACKET ) - domain = PF_PACKET; -#elif defined( AF_PACKET ) - domain = AF_PACKET; -#else - err = HB_SOCKET_ERR_PFNOSUPPORT; -#endif - break; - - case HB_SOCKET_PF_IPX: -#if defined( PF_IPX ) - domain = PF_IPX; -#elif defined( AF_ ) - domain = AF_IPX; -#else - err = HB_SOCKET_ERR_PFNOSUPPORT; -#endif - break; - - default: - err = HB_SOCKET_ERR_PFNOSUPPORT; - } + domain = hb_socketTransDomain( domain, &err ); #endif #if defined( HB_SOCKET_TRANSLATE_TYPE ) - if( err == 0 ) switch( type ) - { - case HB_SOCKET_PT_STREAM: -#if defined( SOCK_STREAM ) - type = SOCK_STREAM; -#else - err = HB_SOCKET_ERR_PROTONOSUPPORT; -#endif - break; - - case HB_SOCKET_PT_DGRAM: -#if defined( SOCK_DGRAM ) - type = SOCK_DGRAM; -#else - err = HB_SOCKET_ERR_PROTONOSUPPORT; -#endif - break; - - case HB_SOCKET_PT_SEQPACKET: -#if defined( SOCK_SEQPACKET ) - type = SOCK_SEQPACKET; -#else - err = HB_SOCKET_ERR_PROTONOSUPPORT; -#endif - break; - - case HB_SOCKET_PT_RAW: -#if defined( SOCK_RAW ) - type = SOCK_RAW; -#else - err = HB_SOCKET_ERR_PROTONOSUPPORT; -#endif - break; - - case HB_SOCKET_PT_RDM: -#if defined( SOCK_RDM ) - type = SOCK_RDM; -#else - err = HB_SOCKET_ERR_PROTONOSUPPORT; -#endif - break; - - default: - err = HB_SOCKET_ERR_PROTONOSUPPORT; - } + if( err == 0 ) + type = hb_socketTransType( type, &err ); #endif if( err == 0 ) @@ -2502,71 +2531,23 @@ char * hb_socketResolveAddr( const char * szAddr, int af ) char * szResult = NULL; #ifdef HB_HAS_ADDRINFO + struct addrinfo hints, *res = NULL; + + hb_vmUnlock(); #if defined( HB_SOCKET_TRANSLATE_DOMAIN ) - switch( af ) + af = hb_socketTransDomain( af, NULL ); +#endif + + memset( &hints, 0, sizeof( hints ) ); + hints.ai_family = af; + if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 ) { - case HB_SOCKET_PF_INET: -#if defined( PF_INET ) - af = PF_INET; -#elif defined( AF_INET ) - af = AF_INET; -#endif - break; - - case HB_SOCKET_PF_INET6: -#if defined( PF_INET6 ) - af = PF_INET6; -#elif defined( AF_INET6 ) - af = AF_INET6; -#endif - break; - - case HB_SOCKET_PF_LOCAL: -#if defined( PF_LOCAL ) - af = PF_LOCAL; -#elif defined( AF_LOCAL ) - af = AF_LOCAL; -#elif defined( PF_UNIX ) - af = PF_UNIX; -#elif defined( AF_UNIX ) - af = AF_UNIX; -#endif - break; - - case HB_SOCKET_PF_PACKET: -#if defined( PF_PACKET ) - af = PF_PACKET; -#elif defined( AF_PACKET ) - af = AF_PACKET; -#endif - break; - - case HB_SOCKET_PF_IPX: -#if defined( PF_IPX ) - af = PF_IPX; -#elif defined( AF_ ) - af = AF_IPX; -#endif - break; + szResult = hb_socketAddrGetName( res->ai_addr, res->ai_addrlen ); + freeaddrinfo( res ); } -#endif - { - struct addrinfo hints, *res = NULL; - - hb_vmUnlock(); - - memset( &hints, 0, sizeof( hints ) ); - hints.ai_family = af; - if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 ) - { - szResult = hb_socketAddrGetName( res->ai_addr, res->ai_addrlen ); - freeaddrinfo( res ); - } - - hb_vmLock(); - } + hb_vmLock(); #else if( af == HB_SOCKET_PF_INET ) @@ -2621,107 +2602,58 @@ PHB_ITEM hb_socketGetHosts( const char * szAddr, int af ) PHB_ITEM pItem = NULL; #ifdef HB_HAS_ADDRINFO + struct addrinfo hints, *res = NULL, *ai; + int iResult; + hb_vmUnlock(); #if defined( HB_SOCKET_TRANSLATE_DOMAIN ) - switch( af ) + af = hb_socketTransDomain( af, NULL ); +#endif + memset( &hints, 0, sizeof( hints ) ); + hints.ai_family = af; + iResult = getaddrinfo( szAddr, NULL, &hints, &res ); + hb_vmLock(); + + if( iResult == 0 ) { - case HB_SOCKET_PF_INET: -#if defined( PF_INET ) - af = PF_INET; -#elif defined( AF_INET ) - af = AF_INET; -#endif - break; - - case HB_SOCKET_PF_INET6: -#if defined( PF_INET6 ) - af = PF_INET6; -#elif defined( AF_INET6 ) - af = AF_INET6; -#endif - break; - - case HB_SOCKET_PF_LOCAL: -#if defined( PF_LOCAL ) - af = PF_LOCAL; -#elif defined( AF_LOCAL ) - af = AF_LOCAL; -#elif defined( PF_UNIX ) - af = PF_UNIX; -#elif defined( AF_UNIX ) - af = AF_UNIX; -#endif - break; - - case HB_SOCKET_PF_PACKET: -#if defined( PF_PACKET ) - af = PF_PACKET; -#elif defined( AF_PACKET ) - af = AF_PACKET; -#endif - break; - - case HB_SOCKET_PF_IPX: -#if defined( PF_IPX ) - af = PF_IPX; -#elif defined( AF_ ) - af = AF_IPX; -#endif - break; - } -#endif - - { - struct addrinfo hints, *res = NULL, *ai; - int iResult; - - hb_vmUnlock(); - memset( &hints, 0, sizeof( hints ) ); - hints.ai_family = af; - iResult = getaddrinfo( szAddr, NULL, &hints, &res ); - hb_vmLock(); - - if( iResult == 0 ) + int iCount = 0, i; + ai = res; + while( ai ) { - int iCount = 0, i; + ++iCount; + ai = ai->ai_next; + } + if( iCount ) + { + pItem = hb_itemArrayNew( iCount ); ai = res; + iCount = 0; while( ai ) { - ++iCount; - ai = ai->ai_next; - } - if( iCount ) - { - pItem = hb_itemArrayNew( iCount ); - ai = res; - iCount = 0; - while( ai ) + char * szResult = hb_socketAddrGetName( res->ai_addr, res->ai_addrlen ); + if( szResult ) { - char * szResult = hb_socketAddrGetName( res->ai_addr, res->ai_addrlen ); - if( szResult ) + for( i = 1; i <= iCount; ++i ) { - for( i = 1; i <= iCount; ++i ) + if( strcmp( hb_arrayGetCPtr( pItem, i ), szResult ) == 0 ) { - if( strcmp( hb_arrayGetCPtr( pItem, i ), szResult ) == 0 ) - { - hb_xfree( szResult ); - szResult = NULL; - break; - } - } - if( szResult ) - { - ++iCount; - if( !hb_arraySetCLPtr( pItem, iCount, szResult, strlen( szResult ) ) ) - hb_xfree( szResult ); + hb_xfree( szResult ); + szResult = NULL; + break; } } - ai = ai->ai_next; + if( szResult ) + { + ++iCount; + if( !hb_arraySetCLPtr( pItem, iCount, szResult, strlen( szResult ) ) ) + hb_xfree( szResult ); + } } - hb_arraySize( pItem, iCount ); + ai = ai->ai_next; } - freeaddrinfo( res ); + hb_arraySize( pItem, iCount ); } + freeaddrinfo( res ); } #else