From 5eeab258d3bbcaa2709377dadfc1979c0852a59f Mon Sep 17 00:00:00 2001 From: paulc Date: Fri, 2 Oct 2009 10:00:23 +0000 Subject: [PATCH] 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 --- configure.in | 6 ++++++ engine/Makefile.in | 2 +- engine/Socket.cpp | 40 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/configure.in b/configure.in index 56309b7b..43ceedf2 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/engine/Makefile.in b/engine/Makefile.in index 645c4928..15d27941 100644 --- a/engine/Makefile.in +++ b/engine/Makefile.in @@ -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 $< diff --git a/engine/Socket.cpp b/engine/Socket.cpp index 364753ae..66ed54df 100644 --- a/engine/Socket.cpp +++ b/engine/Socket.cpp @@ -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;