Commit efaf6886 authored by Dan Fandrich's avatar Dan Fandrich
Browse files

Fixed ftp support with uClibc due to differing inet_ntoa_r() behaviour.

parent 9a5c21c1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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
+1 −10
Original line number Diff line number Diff line
@@ -65,10 +65,6 @@
#include <sys/sockio.h>
#endif

#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL)
#include "inet_ntoa_r.h"
#endif

#ifdef VMS
#include <inet.h>
#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);
  }
+13 −0
Original line number Diff line number Diff line
#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
+12 −1
Original line number Diff line number Diff line
@@ -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);

+4 −0
Original line number Diff line number Diff line
@@ -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 */
Loading