diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/inet_ntop.c | 39 | 
1 files changed, 15 insertions, 24 deletions
| diff --git a/lib/inet_ntop.c b/lib/inet_ntop.c index 9501bfa6b..26867f4d2 100644 --- a/lib/inet_ntop.c +++ b/lib/inet_ntop.c @@ -42,12 +42,6 @@  #include "inet_ntop.h" -#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL) -/* this platform has a inet_ntoa_r() function, but no proto declared anywhere -   so we include our own proto to make compilers happy */ -#include "inet_ntoa_r.h" -#endif -  #define IN6ADDRSZ       16  #define INADDRSZ         4  #define INT16SZ          2 @@ -62,30 +56,26 @@   */  static char *inet_ntop4 (const unsigned char *src, char *dst, size_t size)  { -#if defined(HAVE_INET_NTOA_R_2_ARGS) -  const char *ptr; -  DEBUGASSERT(size >= 16); -  ptr = inet_ntoa_r(*(struct in_addr*)src, dst); -  return (char *)memmove(dst, ptr, strlen(ptr)+1); - -#elif defined(HAVE_INET_NTOA_R) +  char tmp[sizeof "255.255.255.255"]; +  size_t len; -#if defined(HAVE_INT_INET_NTOA_R) -  return inet_ntoa_r(*(struct in_addr*)src, dst, size)? NULL: dst; -#else -  return inet_ntoa_r(*(struct in_addr*)src, dst, size); -#endif +  DEBUGASSERT(size >= 16); -#else -  const char *addr = inet_ntoa(*(struct in_addr*)src); +  tmp[0] = '\0'; +  (void)snprintf(tmp, sizeof(tmp), "%d.%d.%d.%d", +          ((int)((unsigned char)src[0])) & 0xff, +          ((int)((unsigned char)src[1])) & 0xff, +          ((int)((unsigned char)src[2])) & 0xff, +          ((int)((unsigned char)src[3])) & 0xff); -  if(strlen(addr) >= size) +  len = strlen(tmp); +  if(len == 0 || len >= size)    {      SET_ERRNO(ENOSPC);      return (NULL);    } -  return strcpy(dst, addr); -#endif +  strcpy(dst, tmp); +  return dst;  }  #ifdef ENABLE_IPV6 @@ -192,7 +182,8 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)      SET_ERRNO(ENOSPC);      return (NULL);    } -  return strcpy (dst, tmp); +  strcpy(dst, tmp); +  return dst;  }  #endif  /* ENABLE_IPV6 */ | 
