2011-02-12 19:02 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/src/rtl/hbsocket.c
     * added HB_HAS_GETHOSTBYADDR to control access to gethostbyname()
       function
     * added alternative implementation of hb_socketGetHostName()
       function when gethostbyname() is not available
This commit is contained in:
Przemyslaw Czerpak
2011-02-12 18:02:31 +00:00
parent a5f9f1e748
commit 3e1909f6bc
2 changed files with 46 additions and 3 deletions

View File

@@ -16,6 +16,13 @@
The license applies to all entries newer than 2009-04-28.
*/
2011-02-12 19:02 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/src/rtl/hbsocket.c
* added HB_HAS_GETHOSTBYADDR to control access to gethostbyname()
function
* added alternative implementation of hb_socketGetHostName()
function when gethostbyname() is not available
2011-02-11 15:38 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbqt/qtcore/hbqt_init.cpp
* contrib/hbqt/qtgui/hbqt_init.cpp

View File

@@ -83,6 +83,9 @@
platform supports getnameinfo() function:
#define HB_HAS_NAMEINFO
platform supports gethostbyaddr function:
#define HB_HAS_GETHOSTBYADDR
platform uses sockaddr structure which contains sa_len member:
#define HB_HAS_SOCKADDR_SA_LEN
@@ -126,6 +129,7 @@
# define HB_HAS_SOCKADDR_STORAGE
# define HB_HAS_ADDRINFO
# define HB_HAS_NAMEINFO
# define HB_HAS_GETHOSTBYADDR
# endif
# if !defined( __WATCOMC__ ) && !defined( HB_OS_BEOS ) && !defined( HB_OS_MINIX )
# define HB_HAS_INET6
@@ -166,6 +170,7 @@
# define HB_HAS_SOCKADDR_STORAGE
# endif
# define HB_IS_INET_NTOA_MT_SAFE
# define HB_HAS_GETHOSTBYADDR
#elif defined( HB_OS_OS2 )
# if defined( __WATCOMC__ )
# define HB_HAS_INET_PTON
@@ -179,6 +184,7 @@
# define HB_HAS_SOCKADDR_SA_LEN
# endif
# endif
# define HB_HAS_GETHOSTBYADDR
#elif defined( HB_OS_DOS )
# define HB_HAS_INET_ATON
# define HB_HAS_INET_PTON
@@ -186,6 +192,7 @@
# define HB_HAS_SOCKADDR_STORAGE
# define HB_HAS_ADDRINFO
# define HB_HAS_NAMEINFO
# define HB_HAS_GETHOSTBYADDR
# define HB_HAS_INET6_ADDR_CONST
/* # define HB_HAS_INET6 */
#endif
@@ -2929,7 +2936,7 @@ PHB_ITEM hb_socketGetHosts( const char * szAddr, int af )
{
PHB_ITEM pItem = NULL;
#ifdef HB_HAS_ADDRINFO
#if defined( HB_HAS_ADDRINFO )
struct addrinfo hints, *res = NULL, *ai;
int iResult;
@@ -2995,7 +3002,8 @@ PHB_ITEM hb_socketGetHosts( const char * szAddr, int af )
/* gethostbyname() in Windows and OS2 does not accept direct IP
* addresses
*/
#if defined( HB_OS_WIN ) || defined( HB_OS_OS2 )
#if ( defined( HB_OS_WIN ) || defined( HB_OS_OS2 ) ) && \
defined( HB_HAS_GETHOSTBYADDR )
{
ULONG addr = inet_addr( szAddr );
if( addr != INADDR_NONE || strcmp( "255.255.255.255", szAddr ) == 0 )
@@ -3072,17 +3080,45 @@ char * hb_socketGetHostName( const void * pSockAddr, unsigned len )
hb_vmLock();
if( iResult == 0 )
szResult = hb_strdup( szHost );
#elif defined( HB_HAS_ADDRINFO ) && !defined( HB_HAS_GETHOSTBYADDR )
char * szAddr = hb_socketAddrGetName( pSockAddr, len );
if( szAddr )
{
struct addrinfo hints, *res = NULL;
hb_vmUnlock();
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = af;
hints.ai_flags = AI_CANONNAME;
if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 )
{
if( res->ai_canonname )
szResult = hb_strdup( res->ai_canonname );
freeaddrinfo( res );
}
hb_vmLock();
}
#else
struct hostent * he = NULL;
if( af == AF_INET )
{
#if defined( HB_HAS_GETHOSTBYADDR )
const struct sockaddr_in * sa = ( const struct sockaddr_in * ) pSockAddr;
hb_vmUnlock();
he = gethostbyaddr( ( const char * ) &sa->sin_addr, sizeof( sa->sin_addr ), af );
hb_vmLock();
#else
char * szAddr = hb_socketAddrGetName( pSockAddr, len );
if( szAddr )
{
hb_vmUnlock();
he = gethostbyname( szAddr );
hb_vmLock();
}
#endif
}
#if defined( HB_HAS_INET6 )
#if defined( HB_HAS_INET6 ) && defined( HB_HAS_GETHOSTBYADDR )
else if( af == AF_INET6 )
{
const struct sockaddr_in6 * sa = ( const struct sockaddr_in6 * ) pSockAddr;