Use inet_ntop, inet_pton and gethostbyname_r if available on system.

git-svn-id: http://voip.null.ro/svn/yate@2859 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2009-10-02 10:00:23 +00:00
parent 748e8b3ae6
commit 5eeab258d3
3 changed files with 45 additions and 3 deletions

View File

@ -197,6 +197,12 @@ LIBS="$SAVE_LIBS"
AC_LANG_RESTORE
AC_SUBST(MUTEX_HACK)
NETDB_FLAGS=""
AC_CHECK_FUNC([inet_ntop],[NETDB_FLAGS="$NETDB_FLAGS -DHAVE_NTOP"])
AC_CHECK_FUNC([inet_pton],[NETDB_FLAGS="$NETDB_FLAGS -DHAVE_PTON"])
AC_CHECK_FUNC([gethostbyname_r],[NETDB_FLAGS="$NETDB_FLAGS -DHAVE_GHBN_R"])
AC_SUBST(NETDB_FLAGS)
THREAD_KILL=""
AC_MSG_CHECKING([for pthread_kill_other_threads_np declaration])
AC_LANG_SAVE

View File

@ -88,7 +88,7 @@ DataFormat.o: @srcdir@/DataFormat.cpp $(MKDEPS) $(PINC)
$(COMPILE) -c $<
Socket.o: @srcdir@/Socket.cpp $(MKDEPS) $(CINC)
$(COMPILE) @FDSIZE_HACK@ @SCTP_FLAGS@ -c $<
$(COMPILE) @FDSIZE_HACK@ @NETDB_FLAGS@ @SCTP_FLAGS@ -c $<
Mutex.o: @srcdir@/Mutex.cpp $(MKDEPS) $(CINC)
$(COMPILE) @MUTEX_HACK@ -c $<

View File

@ -218,6 +218,15 @@ bool SocketAddr::host(const String& name)
{
in_addr_t a = inet_addr(name);
if (a == INADDR_NONE) {
#ifdef HAVE_GHBN_R
char buf[256];
struct hostent h;
struct hostent* he = 0;
int errn = 0;
if ((!gethostbyname_r(name,&h,buf,sizeof(buf),&he,&errn)) &&
he && (he->h_addrtype == AF_INET))
a = *((in_addr_t*)(he->h_addr_list[0]));
#else
if (s_mutex.lock(MAX_RESWAIT)) {
struct hostent* he = gethostbyname(name);
if (he && (he->h_addrtype == AF_INET))
@ -226,6 +235,7 @@ bool SocketAddr::host(const String& name)
}
else
Debug(DebugGoOn,"Resolver was busy, failing '%s'",name.c_str());
#endif // HAVE_GHBN_R
}
if (a != INADDR_NONE) {
((struct sockaddr_in*)m_address)->sin_addr.s_addr = a;
@ -235,8 +245,16 @@ bool SocketAddr::host(const String& name)
}
break;
#ifdef AF_INET6
// TODO: implement AF_INET6
case AF_INET6:
#ifdef HAVE_PTON
if (inet_pton(family(),name,&((struct sockaddr_in6*)m_address)->sin6_addr) > 0) {
stringify();
return true;
}
#endif
// TODO: implement AF_INET6 resolving
break;
#endif // AF_INET6
#ifdef HAS_AF_UNIX
case AF_UNIX:
if (name.length() >= (UNIX_PATH_MAX-1))
@ -253,13 +271,31 @@ void SocketAddr::stringify()
{
switch (family()) {
case AF_INET:
#ifdef HAVE_NTOP
{
char buf[16];
buf[0] = '\0';
m_host = inet_ntop(family(),&((struct sockaddr_in*)m_address)->sin_addr,
buf,sizeof(buf));
}
#else
s_mutex.lock();
m_host = inet_ntoa(((struct sockaddr_in*)m_address)->sin_addr);
s_mutex.unlock();
#endif
break;
#ifdef AF_INET6
// TODO: implement AF_INET6
case AF_INET6:
#ifdef HAVE_NTOP
{
char buf[48];
buf[0] = '\0';
m_host = inet_ntop(family(),&((struct sockaddr_in6*)m_address)->sin6_addr,
buf,sizeof(buf));
}
#endif
break;
#endif // AF_INET6
#ifdef HAS_AF_UNIX
case AF_UNIX:
m_host = ((struct sockaddr_un*)m_address)->sun_path;