From efaf6886505cd29084af05aa06edc19fd71bdfe9 Mon Sep 17 00:00:00 2001 From: Dan Fandrich Date: Tue, 15 Mar 2005 21:00:46 +0000 Subject: [PATCH] Fixed ftp support with uClibc due to differing inet_ntoa_r() behaviour. --- lib/ftp.c | 4 ++-- lib/if2ip.c | 11 +---------- lib/inet_ntoa_r.h | 13 +++++++++++++ lib/inet_ntop.c | 13 ++++++++++++- lib/setup.h | 4 ++++ lib/url.c | 1 - 6 files changed, 32 insertions(+), 14 deletions(-) diff --git a/lib/ftp.c b/lib/ftp.c index 526ff56..79d03e9 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 db28e4a..9660325 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 7959c49..2c94a6a 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 6b15c02..293723a 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 d45d611..928eb34 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 bd5f2ed..e3e24a5 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" -- 2.7.4