diff --git a/lib/ftp.c b/lib/ftp.c index 526ff56ae34c7cd6c11f1386ac04c58d8f9ca1e9..79d03e9796dd934c04238e329713bcd8247c33ad 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -1524,7 +1524,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, &separator[2], &num, &separator[3])) { - char sep1 = separator[0]; + const char sep1 = separator[0]; int i; /* The four separators should be identical, or else this is an oddly @@ -1539,7 +1539,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, newport = num; /* use the same IP we are already connected to */ - snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str, newhost); + snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str); } } else diff --git a/lib/if2ip.c b/lib/if2ip.c index db28e4aad9a76e534e72d07d832d669a5e094797..9660325069c0b6a22270fa9139daf644aa8ed9b4 100644 --- a/lib/if2ip.c +++ b/lib/if2ip.c @@ -65,10 +65,6 @@ #include #endif -#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL) -#include "inet_ntoa_r.h" -#endif - #ifdef VMS #include #endif @@ -113,12 +109,7 @@ char *Curl_if2ip(const char *interface, char *buf, int buf_size) struct sockaddr_in *s = (struct sockaddr_in *)&req.ifr_dstaddr; memcpy(&in, &(s->sin_addr.s_addr), sizeof(in)); -#if defined(HAVE_INET_NTOA_R) - ip = inet_ntoa_r(in,buf,buf_size); -#else - ip = strncpy(buf,inet_ntoa(in),buf_size); - ip[buf_size - 1] = 0; -#endif + ip = Curl_inet_ntop(s->sin_family, &in, buf, buf_size); } sclose(dummy); } diff --git a/lib/inet_ntoa_r.h b/lib/inet_ntoa_r.h index 7959c49c2835acae87fdd75b5e2f5990fbe05e99..2c94a6a575ed7c18eb246498f65e3699f457078e 100644 --- a/lib/inet_ntoa_r.h +++ b/lib/inet_ntoa_r.h @@ -1,5 +1,16 @@ #ifndef __INET_NTOA_R_H #define __INET_NTOA_R_H + +#include "setup.h" + +#ifdef HAVE_INET_NTOA_R_2_ARGS +/* + * uClibc 0.9.26 (at least) doesn't define this prototype. The buffer + * must be at least 16 characters long. + */ +char *inet_ntoa_r(const struct in_addr in, char buffer[]); + +#else /* * My solaris 5.6 system running gcc 2.8.1 does *not* have this prototype * in any system include file! Isn't that weird? @@ -7,3 +18,5 @@ char *inet_ntoa_r(const struct in_addr in, char *buffer, int buflen); #endif + +#endif diff --git a/lib/inet_ntop.c b/lib/inet_ntop.c index 6b15c025fa2400dce9ea352f5ae3b0593f28870c..293723a7e464e2ffbc8729df3ee079ecd2652712 100644 --- a/lib/inet_ntop.c +++ b/lib/inet_ntop.c @@ -56,8 +56,19 @@ */ static const char *inet_ntop4 (const u_char *src, char *dst, size_t size) { -#ifdef HAVE_INET_NTOA_R +#if defined(HAVE_INET_NTOA_R_2_ARGS) + const char *ptr; + size_t len; + curlassert(size >= 16); + ptr = inet_ntoa_r(*(struct in_addr*)src, dst); + len = strlen(ptr); + memmove(dst, ptr, len); + dst[len] = 0; + return dst; + +#elif defined(HAVE_INET_NTOA_R) return inet_ntoa_r(*(struct in_addr*)src, dst, size); + #else const char *addr = inet_ntoa(*(struct in_addr*)src); diff --git a/lib/setup.h b/lib/setup.h index d45d61153fc8704b3cf8512c93d99c84671721ea..928eb34c7822b0bd2d142105e7edb4e0ebb2a7e4 100644 --- a/lib/setup.h +++ b/lib/setup.h @@ -276,4 +276,8 @@ typedef int curl_socket_t; #define LIBIDN_REQUIRED_VERSION "0.4.1" +#ifdef __UCLIBC_MAJOR__ +#define HAVE_INET_NTOA_R_2_ARGS 1 +#endif + #endif /* __CONFIG_H */ diff --git a/lib/url.c b/lib/url.c index bd5f2ed53672d6ecfcaaf352f3ceea587437e823..e3e24a5ce9fcfca57b62b6584bd49004d2b43c30 100644 --- a/lib/url.c +++ b/lib/url.c @@ -104,7 +104,6 @@ void idn_free (void *ptr); /* prototype from idn-free.h, not provided by #include "base64.h" #include "ssluse.h" #include "hostip.h" -#include "if2ip.h" #include "transfer.h" #include "sendf.h" #include "progress.h"