From: Arkadiusz Miśkiewicz Date: Mon, 15 Apr 2019 11:23:19 +0000 (+0200) Subject: - up to 3.2.6; ipv6 is gone (not supported by upstream and by other projects) X-Git-Tag: auto/th/ncftp-3.2.6-1 X-Git-Url: http://git.pld-linux.org/gitweb.cgi?a=commitdiff_plain;ds=sidebyside;h=68a4b1e984510930b1d6a778cbcfb6d51c050727;p=packages%2Fncftp.git - up to 3.2.6; ipv6 is gone (not supported by upstream and by other projects) --- diff --git a/ncftp-ac.patch b/ncftp-ac.patch deleted file mode 100644 index 2e28ca5..0000000 --- a/ncftp-ac.patch +++ /dev/null @@ -1,57 +0,0 @@ ---- ncftp-3.2.5/configure.in.orig 2011-03-27 15:57:04.305737273 +0200 -+++ ncftp-3.2.5/configure.in 2011-03-27 16:00:02.729737273 +0200 -@@ -42,7 +42,7 @@ - - dnl Try to use PATH rather than hardcode the installation path, if possible. - if test "${prefix-NONE}" != "NONE" && test "$prefix" != "/usr/local" && test "$prefix" != "/usr"; then -- AC_DEFINE_UNQUOTED(PREFIX_BINDIR, "$prefix/bin") -+ AC_DEFINE_UNQUOTED(PREFIX_BINDIR, "$prefix/bin", [bin directory]) - fi - - -@@ -152,7 +152,7 @@ - ipv6=no - ;; - *) AC_MSG_RESULT(yes) -- AC_DEFINE(ENABLE_IPV6) -+ AC_DEFINE(ENABLE_IPV6,,[Define if you want IPv6 support.]) - ipv6=yes - ;; - esac ], -@@ -179,13 +179,13 @@ - )) - - AC_CHECK_FUNC(getaddrinfo, [ -- AC_DEFINE(HAVE_GETADDRINFO)], [ -+ AC_DEFINE(HAVE_GETADDRINFO,,[Define if you have the getaddrinfo function.])], [ - AC_LIBOBJ([getaddrinfo]) - LIBSOBJS="$LIBSOBJS getaddrinfo.so" - ]) - - AC_CHECK_FUNC(getnameinfo, [ -- AC_DEFINE(HAVE_GETNAMEINFO)], [ -+ AC_DEFINE(HAVE_GETNAMEINFO,,[Define if you have the getaddrname function.])], [ - AC_LIBOBJ([getnameinfo]) - LIBSOBJS="$LIBSOBJS getnameinfo.so" - ]) -@@ -197,7 +197,7 @@ - [struct sockaddr x; - x.sa_len = 0;], - AC_MSG_RESULT(yes) -- AC_DEFINE(HAVE_SOCKADDR_SA_LEN), -+ AC_DEFINE(HAVE_SOCKADDR_SA_LEN,,[Define if sockaddr has sa_len member]), - AC_MSG_RESULT(no)) - - # check if sockaddr_storage has ss_family member -@@ -207,9 +207,9 @@ - [struct sockaddr_storage x; - x.__ss_family = 0;], - AC_MSG_RESULT(yes) -- AC_DEFINE(HAVE_SOCKADDR_STORAGE_SS_FAMILY), -+ AC_DEFINE(HAVE_SOCKADDR_STORAGE_SS_FAMILY,,[Define if sockaddr_storage has ss_family member]), - AC_MSG_RESULT(no) -- AC_DEFINE(HAVE_SOCKADDR_STORAGE___SS_FAMILY) -+ AC_DEFINE(HAVE_SOCKADDR_STORAGE___SS_FAMILY,,[Define if sockaddr_storage has __ss_family member]) - CPPFLAGS="$CPPFLAGS -D__ss_family=ss_family -D__ss_len=ss_len") - - CPPFLAGS="-I$MAINDIR $CPPFLAGS" diff --git a/ncftp-ac25x.patch b/ncftp-ac25x.patch deleted file mode 100644 index 8d0ed95..0000000 --- a/ncftp-ac25x.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- ncftp-3.2.1/configure.in.orig 2007-08-12 13:27:12.609525915 +0200 -+++ ncftp-3.2.1/configure.in 2007-08-12 13:40:36.431333110 +0200 -@@ -146,13 +146,13 @@ - - AC_CHECK_FUNC(getaddrinfo, [ - AC_DEFINE(HAVE_GETADDRINFO)], [ -- LIBOBJS="$LIBOBJS getaddrinfo.o" -+ AC_LIBOBJ([getaddrinfo]) - LIBSOBJS="$LIBSOBJS getaddrinfo.so" - ]) - - AC_CHECK_FUNC(getnameinfo, [ - AC_DEFINE(HAVE_GETNAMEINFO)], [ -- LIBOBJS="$LIBOBJS getnameinfo.o" -+ AC_LIBOBJ([getnameinfo]) - LIBSOBJS="$LIBSOBJS getnameinfo.so" - ]) - -@@ -323,7 +323,6 @@ - AC_SUBST(Z30) - AC_SUBST(Z31) - AC_SUBST(LIBSET) --AC_SUBST(LIBOBJS) - AC_SUBST(LIBSOBJS) - AC_SUBST(MAINDIR) - AC_SUBST(NCFTP_VERSION) diff --git a/ncftp-kame-v6.patch b/ncftp-kame-v6.patch deleted file mode 100644 index 03b2ef5..0000000 --- a/ncftp-kame-v6.patch +++ /dev/null @@ -1,2977 +0,0 @@ -Index: ncftp3/README.v6 -diff -u /dev/null ncftp3/README.v6:1.1 ---- /dev/null Mon Nov 9 21:52:32 2009 -+++ ncftp3/README.v6 Tue Aug 6 14:06:35 2002 -@@ -0,0 +1,2 @@ -+If you have problem/trouble/suggestion for IPv6 related code, -+Please contact to core@kame.net -Index: ncftp3/configure.in -diff -u ncftp3/configure.in:1.1.1.17 ncftp3/configure.in:1.28 ---- ncftp3/configure.in:1.1.1.17 Thu Nov 5 16:20:41 2009 -+++ ncftp3/configure.in Thu Nov 5 16:47:08 2009 -@@ -13,8 +13,6 @@ - wi_ARG_ENABLE_SSP - wi_ARG_DISABLE_MACOSX_UNIVERSAL - -- -- - dnl --------------------------------------------------------------------------- - dnl Environment and compiler settings. - dnl --------------------------------------------------------------------------- -@@ -113,6 +111,81 @@ - wi_HEADER_SYS_SELECT_H dnl # sio - - -+dnl --------------------------------------------------------------------------- -+dnl Checks for IPv6. -+dnl --------------------------------------------------------------------------- -+dnl -+AC_MSG_CHECKING([whether to enable ipv6]) -+AC_ARG_ENABLE(ipv6, -+[ --enable-ipv6 Enable ipv6 (with ipv4) support -+ --disable-ipv6 Disable ipv6 support], -+[ case "$enableval" in -+ no) -+ AC_MSG_RESULT(no) -+ ipv6=no -+ ;; -+ *) AC_MSG_RESULT(yes) -+ AC_DEFINE(ENABLE_IPV6) -+ ipv6=yes -+ ;; -+ esac ], -+ -+ AC_TRY_RUN([ /* AF_INET6 avalable check */ -+#define INET6 -+#include -+#include -+main() -+{ -+ if (socket(AF_INET6, SOCK_STREAM, 0) < 0) -+ exit(1); -+ else -+ exit(0); -+} -+], -+ AC_MSG_RESULT(yes) -+ AC_DEFINE(ENABLE_IPV6) -+ ipv6=yes, -+ AC_MSG_RESULT(no) -+ ipv6=no, -+ AC_MSG_RESULT(no) -+ ipv6=no -+)) -+ -+AC_CHECK_FUNC(getaddrinfo, [ -+ AC_DEFINE(HAVE_GETADDRINFO)], [ -+ LIBOBJS="$LIBOBJS getaddrinfo.o" -+ LIBSOBJS="$LIBSOBJS getaddrinfo.so" -+]) -+ -+AC_CHECK_FUNC(getnameinfo, [ -+ AC_DEFINE(HAVE_GETNAMEINFO)], [ -+ LIBOBJS="$LIBOBJS getnameinfo.o" -+ LIBSOBJS="$LIBSOBJS getnameinfo.so" -+]) -+ -+# check if sockaddr has sa_len member -+AC_MSG_CHECKING(if sockaddr has sa_len member) -+AC_TRY_COMPILE([#include -+#include ], -+[struct sockaddr x; -+x.sa_len = 0;], -+ AC_MSG_RESULT(yes) -+ AC_DEFINE(HAVE_SOCKADDR_SA_LEN), -+ AC_MSG_RESULT(no)) -+ -+# check if sockaddr_storage has ss_family member -+AC_MSG_CHECKING(if sockaddr_storage has ss_family member) -+AC_TRY_COMPILE([#include -+#include ], -+[struct sockaddr_storage x; -+x.__ss_family = 0;], -+ AC_MSG_RESULT(yes) -+ AC_DEFINE(HAVE_SOCKADDR_STORAGE_SS_FAMILY), -+ AC_MSG_RESULT(no) -+ AC_DEFINE(HAVE_SOCKADDR_STORAGE___SS_FAMILY) -+ CPPFLAGS="$CPPFLAGS -D__ss_family=ss_family -D__ss_len=ss_len") -+ -+CPPFLAGS="-I$MAINDIR $CPPFLAGS" - - dnl --------------------------------------------------------------------------- - dnl Checks for library functions. -@@ -258,6 +331,8 @@ - AC_SUBST(Z30) - AC_SUBST(Z31) - AC_SUBST(LIBSET) -+AC_SUBST(LIBOBJS) -+AC_SUBST(LIBSOBJS) - AC_SUBST(MAINDIR) - AC_SUBST(NCFTP_VERSION) - AC_SUBST(LIBNCFTP_VERSION) -Index: ncftp3/Strn/tester -Index: ncftp3/libncftp/addrinfo.h -diff -u /dev/null ncftp3/libncftp/addrinfo.h:1.2 ---- /dev/null Mon Nov 9 21:52:32 2009 -+++ ncftp3/libncftp/addrinfo.h Tue Nov 20 02:53:11 2001 -@@ -0,0 +1,104 @@ -+/* -+ * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. Neither the name of the project nor the names of its contributors -+ * may be used to endorse or promote products derived from this software -+ * without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND -+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE -+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -+ * SUCH DAMAGE. -+ */ -+ -+#ifndef HAVE_GETADDRINFO -+ -+/* -+ * Error return codes from getaddrinfo() -+ */ -+#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ -+#define EAI_AGAIN 2 /* temporary failure in name resolution */ -+#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ -+#define EAI_FAIL 4 /* non-recoverable failure in name resolution */ -+#define EAI_FAMILY 5 /* ai_family not supported */ -+#define EAI_MEMORY 6 /* memory allocation failure */ -+#define EAI_NODATA 7 /* no address associated with hostname */ -+#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ -+#define EAI_SERVICE 9 /* servname not supported for ai_socktype */ -+#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ -+#define EAI_SYSTEM 11 /* system error returned in errno */ -+#define EAI_BADHINTS 12 -+#define EAI_PROTOCOL 13 -+#define EAI_MAX 14 -+ -+/* -+ * Flag values for getaddrinfo() -+ */ -+#define AI_PASSIVE 0x00000001 /* get address to use bind() */ -+#define AI_CANONNAME 0x00000002 /* fill ai_canonname */ -+#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */ -+/* valid flags for addrinfo */ -+#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST) -+ -+#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */ -+#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */ -+#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */ -+#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */ -+/* special recommended flags for getipnodebyname */ -+#define AI_DEFAULT (AI_V4MAPPED_CFG | AI_ADDRCONFIG) -+ -+/* -+ * Constants for getnameinfo() -+ */ -+#define NI_MAXHOST 1025 -+#define NI_MAXSERV 32 -+ -+/* -+ * Flag values for getnameinfo() -+ */ -+#define NI_NOFQDN 0x00000001 -+#define NI_NUMERICHOST 0x00000002 -+#define NI_NAMEREQD 0x00000004 -+#define NI_NUMERICSERV 0x00000008 -+#define NI_DGRAM 0x00000010 -+ -+struct addrinfo { -+ int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ -+ int ai_family; /* PF_xxx */ -+ int ai_socktype; /* SOCK_xxx */ -+ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ -+ size_t ai_addrlen; /* length of ai_addr */ -+ char *ai_canonname; /* canonical name for hostname */ -+ struct sockaddr *ai_addr; /* binary address */ -+ struct addrinfo *ai_next; /* next structure in linked list */ -+}; -+ -+struct sockaddr_storage { -+#ifdef HAVE_SOCKADDR_SA_LEN -+ u_int8_t ss_len; /* address length */ -+ u_int8_t ss_family; /* address family */ -+#else -+ u_int16_t ss_family; -+#endif -+ u_int8_t fill[126]; -+}; -+ -+extern void freehostent __P((struct hostent *)); -+extern char *gai_strerror __P((int)); -+#endif ---- ncftp-3.2.5/libncftp/ftp.c.orig 2009-10-24 01:31:22.000000000 +0200 -+++ ncftp-3.2.5/libncftp/ftp.c 2011-03-27 15:36:20.209737273 +0200 -@@ -50,6 +50,18 @@ - # define DisposeSocket(a) close(a) - #endif - -+#ifndef HAVE_SOCKADDR_SA_LEN -+#ifndef SA_LEN -+#ifdef ENABLE_IPV6 -+#define SA_LEN(x) (((x)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) \ -+ : (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) \ -+ : -1)) -+#else /* ENABLE_IPV6 */ -+#define SA_LEN(x) (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : -1) -+#endif /* ENABLE_IPV6 */ -+#endif /* SA_LEN */ -+#endif /* HAVE_SOCKADDR_SA_LEN */ -+ - static const char *gPrivateNetworks[] = { - "192.168.", - "10.", -@@ -101,9 +113,9 @@ - - - static int --GetSocketAddress(const FTPCIPtr cip, int sockfd, struct sockaddr_in *saddr) -+GetSocketAddress(const FTPCIPtr cip, int sockfd, struct sockaddr *saddr) - { -- sockaddr_size_t len = (sockaddr_size_t) sizeof (struct sockaddr_in); -+ sockaddr_size_t len = (sockaddr_size_t) sizeof (struct sockaddr_storage); - int result = 0; - - if (getsockname(sockfd, (struct sockaddr *)saddr, &len) < 0) { -@@ -138,16 +150,16 @@ - OpenControlConnection(const FTPCIPtr cip, char *host, unsigned int port) - { - struct sockaddr_in localAddr; -- struct in_addr ip_address; - int err = 0; - int result; - int oerrno; - volatile int sockfd = -1; - volatile int sock2fd = -1; - ResponsePtr rp = NULL; -- char **volatile curaddr; -- int hpok, hprc; -- struct hostent hp; -+ struct addrinfo hints; -+ struct addrinfo *res, *res0; -+ int error; -+ char buf[NI_MAXHOST]; - char *volatile fhost; - unsigned int fport; - #ifndef NO_SIGNALS -@@ -181,35 +193,17 @@ - cip->cin = NULL; - cip->cout = NULL; - -- /* Make sure we use network byte-order. */ -- fport = (unsigned int) htons((unsigned short) fport); -- -- cip->servCtlAddr.sin_port = (unsigned short) fport; -- -- hprc = GetHostEntry(&hp, fhost, &ip_address, cip->buf, cip->bufSize); -- if (hprc != 0) { -- hpok = 0; -- /* Okay, no Host entry, but maybe we have a numeric address -- * in ip_address we can try. -- */ --#ifdef DNSSEC_LOCAL_VALIDATION -- if (hprc == -2) { -- FTPLogError(cip, kDontPerror, "%s: untrusted DNS response.\n", fhost); -- cip->errNo = kErrHostUnknown; -- return (kErrHostUnknown); -- } --#endif -- if (ip_address.s_addr == INADDR_NONE) { -- FTPLogError(cip, kDontPerror, "%s: unknown host.\n", fhost); -- cip->errNo = kErrHostUnknown; -- return (kErrHostUnknown); -- } -- cip->servCtlAddr.sin_family = AF_INET; -- cip->servCtlAddr.sin_addr.s_addr = ip_address.s_addr; -- } else { -- hpok = 1; -- cip->servCtlAddr.sin_family = hp.h_addrtype; -- /* We'll fill in the rest of the structure below. */ -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_flags = AI_CANONNAME; -+ hints.ai_family = PF_UNSPEC; -+ hints.ai_socktype = SOCK_STREAM; -+ hints.ai_protocol = IPPROTO_TCP; -+ sprintf(buf, "%d\0", fport); -+ error = getaddrinfo(fhost, buf, &hints, &res0); -+ if (error) { -+ FTPLogError(cip, kDontPerror, "%s: %s.\n", fhost, gai_strerror(error)); -+ cip->errNo = kErrHostUnknown; -+ return (kErrHostUnknown); - } - - /* After obtaining a socket, try to connect it to a remote -@@ -218,23 +212,24 @@ - * every address in the list from the host entry. - */ - -- if (hpok == 0) { -- /* Since we're given a single raw address, and not a host entry, -- * we can only try this one address and not any other addresses -- * that could be present for a site with a host entry. -- */ -- -- if ((sockfd = socket(cip->servCtlAddr.sin_family, SOCK_STREAM, 0)) < 0) { -+ /* We can try each address in the list. We'll quit when we -+ * run out of addresses to try or get a successful connection. -+ */ -+ for (res = res0; res; res = res->ai_next) { -+ (void) memcpy(&cip->servCtlAddr, res->ai_addr, (size_t)res->ai_addrlen); -+ if ((sockfd = socket(cip->servCtlAddr.ss_family, SOCK_STREAM, 0)) < 0) { -+ if (res0->ai_next) -+ continue; - FTPLogError(cip, kDoPerror, "Could not get a socket.\n"); - cip->errNo = kErrNewStreamSocket; - return (kErrNewStreamSocket); - } - - /* On rare occasions, the user may specify a local IP address to use. */ -- if (cip->preferredLocalAddr.sin_family != 0) { -+ if (cip->preferredLocalAddr.sin_family == AF_INET) { - localAddr = cip->preferredLocalAddr; - localAddr.sin_port = 0; -- if (BindToEphemeralPortNumber(sockfd, &localAddr, (int) cip->ephemLo, (int) cip->ephemHi) < 0) { -+ if (BindToEphemeralPortNumber(sockfd, (struct sockaddr *)&localAddr, (int) cip->ephemLo, (int) cip->ephemHi) < 0) { - FTPLogError(cip, kDoPerror, "Could not bind the control socket"); - result = kErrBindCtrlSocket; - cip->errNo = kErrBindCtrlSocket; -@@ -251,14 +246,14 @@ - (void) SetSocketBufSize(sockfd, cip->ctrlSocketRBufSize, cip->ctrlSocketSBufSize); - - #ifdef NO_SIGNALS -- err = SConnect(sockfd, &cip->servCtlAddr, (int) cip->connTimeout); -+ err = SConnect(sockfd, (struct sockaddr *)&cip->servCtlAddr, (int) cip->connTimeout); - -- if (err < 0) { -- oerrno = errno; -- (void) SClose(sockfd, 3); -- errno = oerrno; -- sockfd = -1; -- } -+ if (err == 0) -+ break; -+ oerrno = errno; -+ (void) SClose(sockfd, 3); -+ errno = oerrno; -+ sockfd = -1; - #else /* NO_SIGNALS */ - osigint = (volatile FTPSigProc) signal(SIGINT, CancelConnect); - if (cip->connTimeout > 0) { -@@ -287,6 +282,8 @@ - Error(vcip, kDontPerror, "Connection attempt canceled.\n"); - (void) kill(getpid(), SIGINT); - } else if (gGotSig == SIGALRM) { -+ if (res0->ai_next) -+ continue; - result = vcip->errNo = kErrConnectRetryableErr; - Error(vcip, kDontPerror, "Connection attempt timed-out.\n"); - (void) kill(getpid(), SIGALRM); -@@ -297,7 +294,12 @@ - return (result); - } else { - err = connect(sockfd, (struct sockaddr *) &cip->servCtlAddr, -- (int) sizeof (cip->servCtlAddr)); -+#ifdef HAVE_SOCKADDR_SA_LEN -+ cip->servCtlAddr.ss_len -+#else -+ SA_LEN((struct sockaddr *)&cip->servCtlAddr) -+#endif -+ ); - if (cip->connTimeout > 0) { - (void) alarm(0); - (void) signal(SIGALRM, (FTPSigProc) osigalrm); -@@ -311,106 +313,7 @@ - errno = oerrno; - sockfd = -1; - } --#endif /* NO_SIGNALS */ -- } else { -- /* We can try each address in the list. We'll quit when we -- * run out of addresses to try or get a successful connection. -- */ -- for (curaddr = hp.h_addr_list; *curaddr != NULL; curaddr++) { -- if ((sockfd = socket(cip->servCtlAddr.sin_family, SOCK_STREAM, 0)) < 0) { -- FTPLogError(cip, kDoPerror, "Could not get a socket.\n"); -- cip->errNo = kErrNewStreamSocket; -- return (kErrNewStreamSocket); -- } -- /* This could overwrite the address field in the structure, -- * but this is okay because the structure has a junk field -- * just for this purpose. -- */ -- (void) memcpy(&cip->servCtlAddr.sin_addr, *curaddr, (size_t) hp.h_length); -- -- /* On rare occasions, the user may specify a local IP address to use. */ -- if (cip->preferredLocalAddr.sin_family != 0) { -- localAddr = cip->preferredLocalAddr; -- localAddr.sin_port = 0; -- if (BindToEphemeralPortNumber(sockfd, &localAddr, (int) cip->ephemLo, (int) cip->ephemHi) < 0) { -- FTPLogError(cip, kDoPerror, "Could not bind the control socket"); -- result = kErrBindCtrlSocket; -- cip->errNo = kErrBindCtrlSocket; -- (void) SClose(sockfd, 3); -- return (kErrBindCtrlSocket); -- } -- } -- -- /* This doesn't do anything if you left these -- * at their defaults (zero). Otherwise it -- * tries to set the buffer size to the -- * size specified. -- */ -- (void) SetSocketBufSize(sockfd, cip->ctrlSocketRBufSize, cip->ctrlSocketSBufSize); -- --#ifdef NO_SIGNALS -- err = SConnect(sockfd, &cip->servCtlAddr, (int) cip->connTimeout); -- -- if (err == 0) -- break; -- oerrno = errno; -- (void) SClose(sockfd, 3); -- errno = oerrno; -- sockfd = -1; --#else /* NO_SIGNALS */ -- -- osigint = (volatile FTPSigProc) signal(SIGINT, CancelConnect); -- if (cip->connTimeout > 0) { -- osigalrm = (volatile FTPSigProc) signal(SIGALRM, CancelConnect); -- (void) alarm(cip->connTimeout); -- } -- -- vcip = cip; --#ifdef HAVE_SIGSETJMP -- sj = sigsetjmp(gCancelConnectJmp, 1); --#else -- sj = setjmp(gCancelConnectJmp); --#endif /* HAVE_SIGSETJMP */ -- -- if (sj != 0) { -- /* Interrupted by a signal. */ -- (void) DisposeSocket(sockfd); -- (void) signal(SIGINT, (FTPSigProc) osigint); -- if (vcip->connTimeout > 0) { -- (void) alarm(0); -- (void) signal(SIGALRM, (FTPSigProc) osigalrm); -- } -- if (gGotSig == SIGINT) { -- result = vcip->errNo = kErrConnectMiscErr; -- Error(vcip, kDontPerror, "Connection attempt canceled.\n"); -- (void) kill(getpid(), SIGINT); -- } else if (gGotSig == SIGALRM) { -- result = vcip->errNo = kErrConnectRetryableErr; -- Error(vcip, kDontPerror, "Connection attempt timed-out.\n"); -- (void) kill(getpid(), SIGALRM); -- } else { -- result = vcip->errNo = kErrConnectMiscErr; -- Error(vcip, kDontPerror, "Connection attempt failed due to an unexpected signal (%d).\n", gGotSig); -- } -- return (result); -- } else { -- err = connect(sockfd, (struct sockaddr *) &cip->servCtlAddr, -- (int) sizeof (cip->servCtlAddr)); -- if (cip->connTimeout > 0) { -- (void) alarm(0); -- (void) signal(SIGALRM, (FTPSigProc) osigalrm); -- } -- (void) signal(SIGINT, (FTPSigProc) osigint); -- } -- -- if (err == 0) -- break; -- oerrno = errno; -- (void) DisposeSocket(sockfd); -- errno = oerrno; -- sockfd = -1; - #endif /* NO_SIGNALS */ -- } - } - - if (err < 0) { -@@ -469,7 +372,7 @@ - } - - /* Get our end of the socket address for later use. */ -- if ((result = GetSocketAddress(cip, sockfd, &cip->ourCtlAddr)) < 0) -+ if ((result = GetSocketAddress(cip, sockfd, (struct sockaddr *)&cip->ourCtlAddr)) < 0) - goto fatal; - - /* We want Out-of-band data to appear in the regular stream, -@@ -540,11 +443,20 @@ - #endif - #endif /* NO_SIGNALS */ - -- InetNtoA(cip->ip, &cip->servCtlAddr.sin_addr, sizeof(cip->ip)); -- if ((hpok == 0) || (hp.h_name == NULL)) -+ getnameinfo((struct sockaddr*)&cip->servCtlAddr, -+#ifdef HAVE_SOCKADDR_SA_LEN -+ cip->servCtlAddr.ss_len, -+#else -+ SA_LEN((struct sockaddr *)&cip->servCtlAddr), -+#endif -+ buf, sizeof(buf), NULL, 0, NI_NUMERICHOST); -+ (void) STRNCPY(cip->ip, buf); -+ if ((res0 == NULL) || (res0->ai_canonname == NULL)) - (void) STRNCPY(cip->actualHost, fhost); - else -- (void) STRNCPY(cip->actualHost, (char *) hp.h_name); -+ (void) STRNCPY(cip->actualHost, (char *) res0->ai_canonname); -+ freeaddrinfo(res0); -+ res0 = NULL; - - /* Read the startup message from the server. */ - rp = InitResponse(); -@@ -648,6 +560,10 @@ - CloseFile(&cip->cout); - cip->ctrlSocketR = kClosedFileDescriptor; - cip->ctrlSocketW = kClosedFileDescriptor; -+ if (res0) { -+ freeaddrinfo(res0); -+ res0 = NULL; -+ } - return (result); - } /* OpenControlConnection */ - -@@ -741,11 +657,15 @@ - - - int --FTPSendPort(const FTPCIPtr cip, struct sockaddr_in *saddr) -+FTPSendPort(const FTPCIPtr cip, struct sockaddr *saddr) - { - char *a, *p; - int result; - ResponsePtr rp; -+ struct sockaddr_in *saddr4; -+#ifdef ENABLE_IPV6 -+ struct sockaddr_in6 *saddr6; -+#endif - - rp = InitResponse(); - if (rp == NULL) { -@@ -754,16 +674,46 @@ - return (cip->errNo); - } - -- /* These will point to data in network byte order. */ -- a = (char *) &saddr->sin_addr; -- p = (char *) &saddr->sin_port; - #define UC(x) (int) (((int) x) & 0xff) -+#ifdef ENABLE_IPV6 -+ if (saddr->sa_family == AF_INET6) { -+ char host[NI_MAXHOST]; -+ char port[NI_MAXSERV]; -+ -+ getnameinfo(saddr, sizeof(struct sockaddr_in6), host, sizeof(host), -+ port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); -+ -+ saddr6 = (struct sockaddr_in6 *)saddr; -+ /* These will point to data in network byte order. */ -+ a = (char *) &saddr6->sin6_addr; -+ p = (char *) &saddr6->sin6_port; -+ /* Need to tell the other side which host (the address) and -+ * which process (port) on that host to send data to. -+ */ -+ result = RCmd(cip, rp, "EPRT |2|%s|%s|", host, port); -+ if (result != 2) { -+ result = RCmd(cip, rp, "LPRT 6,16,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,2,%d,%d", -+ UC(a[ 0]), UC(a[ 1]), UC(a[ 2]), UC(a[ 3]), -+ UC(a[ 4]), UC(a[ 5]), UC(a[ 6]), UC(a[ 7]), -+ UC(a[ 8]), UC(a[ 9]), UC(a[10]), UC(a[11]), -+ UC(a[12]), UC(a[13]), UC(a[14]), UC(a[15]), -+ UC(p[0]), UC(p[1])); -+ } -+ } else { -+#endif -+ saddr4 = (struct sockaddr_in *)saddr; -+ /* These will point to data in network byte order. */ -+ a = (char *) &saddr4->sin_addr; -+ p = (char *) &saddr4->sin_port; - -- /* Need to tell the other side which host (the address) and -- * which process (port) on that host to send data to. -- */ -- result = RCmd(cip, rp, "PORT %d,%d,%d,%d,%d,%d", -- UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1])); -+ /* Need to tell the other side which host (the address) and -+ * which process (port) on that host to send data to. -+ */ -+ result = RCmd(cip, rp, "PORT %d,%d,%d,%d,%d,%d", -+ UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1])); -+#ifdef ENABLE_IPV6 -+ } -+#endif - - DoneWithResponse(cip, rp); - if (result < 0) { -@@ -780,13 +730,18 @@ - - - int --FTPSendPassive(const FTPCIPtr cip, struct sockaddr_in *saddr, int *weird) -+FTPSendPassive(const FTPCIPtr cip, struct sockaddr *saddr, int *weird) - { - ResponsePtr rp; -- int i[6], j; -- unsigned char n[6]; -+ int i[18], j; -+ unsigned char n[18]; - char *cp; - int result; -+ struct sockaddr_in *saddr4 = (struct sockaddr_in *)saddr; -+#ifdef ENABLE_IPV6 -+ struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)saddr; -+#endif -+ unsigned short port; - - rp = InitResponse(); - if (rp == NULL) { -@@ -795,56 +750,162 @@ - return (cip->errNo); - } - -- result = RCmd(cip, rp, "PASV"); -- if (result < 0) -- goto done; -- -- if (rp->codeType != 2) { -- /* Didn't understand or didn't want passive port selection. */ -- cip->errNo = result = kErrPASVFailed; -- goto done; -- } -- -- /* The other side returns a specification in the form of -- * an internet address as the first four integers (each -- * integer stands for 8-bits of the real 32-bit address), -- * and two more integers for the port (16-bit port). -- * -- * It should give us something like: -- * "Entering Passive Mode (129,93,33,1,10,187)", so look for -- * digits with sscanf() starting 24 characters down the string. -- */ -+ result = RCmd(cip, rp, "EPSV"); -+ if (result != 2) -+ goto next; -+ -+ if (rp->codeType != 2) -+ goto next; -+ - for (cp = rp->msg.first->line; ; cp++) { - if (*cp == '\0') { -- FTPLogError(cip, kDontPerror, "Cannot parse PASV response: %s\n", rp->msg.first->line); -- goto done; -+ FTPLogError(cip, kDontPerror, "Cannot parse EPSV response: %s\n", rp->msg.first->line); -+ goto next; - } - if (isdigit((int) *cp)) - break; - } -+ if (sscanf(cp, "%hd|", &port) != 1) { -+ FTPLogError(cip, kDontPerror, "Cannot parse EPSV response: %s\n", rp->msg.first->line); -+ goto next; -+ } -+ - -- if (sscanf(cp, "%d,%d,%d,%d,%d,%d", -- &i[0], &i[1], &i[2], &i[3], &i[4], &i[5]) != 6) { -- FTPLogError(cip, kDontPerror, "Cannot parse PASV response: %s\n", rp->msg.first->line); -- goto done; -+#ifdef ENABLE_IPV6 -+ if (saddr->sa_family == AF_INET6) { -+ saddr6->sin6_addr = -+ ((struct sockaddr_in6 *)&cip->servCtlAddr)->sin6_addr; -+ saddr6->sin6_port = htons(port); -+ } else { -+#endif -+ saddr4->sin_addr = -+ ((struct sockaddr_in *)&cip->servCtlAddr)->sin_addr; -+ saddr4->sin_port = htons(port); -+#ifdef ENABLE_IPV6 - } -+#endif -+ goto done; - -- if (weird != (int *) 0) -- *weird = 0; -- -- for (j=0; j<6; j++) { -- /* Some ftp servers return bogus port octets, such as -- * boombox.micro.umn.edu. Let the caller know if we got a -- * weird looking octet. -- */ -- if (((i[j] < 0) || (i[j] > 255)) && (weird != (int *) 0)) -- *weird = *weird + 1; -- n[j] = (unsigned char) (i[j] & 0xff); -+ next: -+ rp = InitResponse(); -+ if (rp == NULL) { -+ FTPLogError(cip, kDontPerror, "Malloc failed.\n"); -+ cip->errNo = kErrMallocFailed; -+ return (cip->errNo); - } - -- (void) memcpy(&saddr->sin_addr, &n[0], (size_t) 4); -- (void) memcpy(&saddr->sin_port, &n[4], (size_t) 2); -+#ifdef ENABLE_IPV6 -+ if (saddr->sa_family == AF_INET6) { -+ int af, hal, pal; -+ -+ result = RCmd(cip, rp, "LPSV"); -+ if (result < 0) -+ goto done; -+ -+ if (rp->codeType != 2) { -+ /* Didn't understand or didn't want passive port selection. */ -+ cip->errNo = result = kErrPASVFailed; -+ goto done; -+ } -+ -+ /* The other side returns a specification in the form of -+ * an internet address as the first four integers (each -+ * integer stands for 8-bits of the real 32-bit address), -+ * and two more integers for the port (16-bit port). -+ * -+ * It should give us something like: -+ * "Entering Passive Mode (129,93,33,1,10,187)", so look for -+ * digits with sscanf() starting 24 characters down the string. -+ */ -+ for (cp = rp->msg.first->line; ; cp++) { -+ if (*cp == '\0') { -+ FTPLogError(cip, kDontPerror, "Cannot parse LPSV response: %s\n", rp->msg.first->line); -+ goto done; -+ } -+ if (isdigit((int) *cp)) -+ break; -+ } - -+ if (sscanf(cp, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", -+ &af, &hal, -+ &i[ 0], &i[ 1], &i[ 2], &i[ 3], -+ &i[ 4], &i[ 5], &i[ 6], &i[ 7], -+ &i[ 8], &i[ 9], &i[10], &i[11], -+ &i[12], &i[13], &i[14], &i[15], -+ &pal, -+ &i[16], &i[17]) != 21) { -+ FTPLogError(cip, kDontPerror, "Cannot parse LPSV response: %s\n", rp->msg.first->line); -+ goto done; -+ } -+ if (af != 6 || hal != 16 || pal != 2) { -+ FTPLogError(cip, kDontPerror, "Cannot parse LPSV response: %s\n", rp->msg.first->line); -+ goto done; -+ } -+ -+ for (j=0, *weird = 0; j<18; j++) { -+ /* Some ftp servers return bogus port octets, such as -+ * boombox.micro.umn.edu. Let the caller know if we got a -+ * weird looking octet. -+ */ -+ if ((i[j] < 0) || (i[j] > 255)) -+ *weird = *weird + 1; -+ n[j] = (unsigned char) (i[j] & 0xff); -+ } -+ (void) memcpy(&saddr6->sin6_addr, &n[ 0], (size_t) 16); -+ (void) memcpy(&saddr6->sin6_port, &n[16], (size_t) 2); -+ } else { -+#endif -+ result = RCmd(cip, rp, "PASV"); -+ if (result < 0) -+ goto done; -+ -+ if (rp->codeType != 2) { -+ /* Didn't understand or didn't want passive port selection. */ -+ cip->errNo = result = kErrPASVFailed; -+ goto done; -+ } -+ -+ /* The other side returns a specification in the form of -+ * an internet address as the first four integers (each -+ * integer stands for 8-bits of the real 32-bit address), -+ * and two more integers for the port (16-bit port). -+ * -+ * It should give us something like: -+ * "Entering Passive Mode (129,93,33,1,10,187)", so look for -+ * digits with sscanf() starting 24 characters down the string. -+ */ -+ for (cp = rp->msg.first->line; ; cp++) { -+ if (*cp == '\0') { -+ FTPLogError(cip, kDontPerror, "Cannot parse PASV response: %s\n", rp->msg.first->line); -+ goto done; -+ } -+ if (isdigit((int) *cp)) -+ break; -+ } -+ -+ if (sscanf(cp, "%d,%d,%d,%d,%d,%d", -+ &i[0], &i[1], &i[2], &i[3], &i[4], &i[5]) != 6) { -+ FTPLogError(cip, kDontPerror, "Cannot parse PASV response: %s\n", rp->msg.first->line); -+ goto done; -+ } -+ -+ if (weird != (int *) 0) -+ *weird = 0; -+ -+ for (j=0; j<6; j++) { -+ /* Some ftp servers return bogus port octets, such as -+ * boombox.micro.umn.edu. Let the caller know if we got a -+ * weird looking octet. -+ */ -+ if (((i[j] < 0) || (i[j] > 255)) && (weird != (int *) 0)) -+ *weird = *weird + 1; -+ n[j] = (unsigned char) (i[j] & 0xff); -+ } -+ (void) memcpy(&saddr4->sin_addr, &n[0], (size_t) 4); -+ (void) memcpy(&saddr4->sin_port, &n[4], (size_t) 2); -+#ifdef ENABLE_IPV6 -+ } -+#endif - result = kNoErr; - done: - DoneWithResponse(cip, rp); -@@ -861,8 +922,8 @@ - char maybePrivateAddrStr[64]; - char knownNonPrivateAddrToUseIfNeededStr[64]; - -- AddrToAddrStr(maybePrivateAddrStr, sizeof(maybePrivateAddrStr), maybePrivateAddr, 0, "%h"); -- AddrToAddrStr(knownNonPrivateAddrToUseIfNeededStr, sizeof(knownNonPrivateAddrToUseIfNeededStr), knownNonPrivateAddrToUseIfNeeded, 0, "%h"); -+ AddrToAddrStr(maybePrivateAddrStr, sizeof(maybePrivateAddrStr), (struct sockaddr *)maybePrivateAddr, 0, "%h"); -+ AddrToAddrStr(knownNonPrivateAddrToUseIfNeededStr, sizeof(knownNonPrivateAddrToUseIfNeededStr), (struct sockaddr *)knownNonPrivateAddrToUseIfNeeded, 0, "%h"); - - if (strcmp(maybePrivateAddrStr, knownNonPrivateAddrToUseIfNeededStr) == 0) - return (0); /* Assume if we could reach the Ctl, we can reach Data. */ -@@ -892,10 +953,10 @@ - char servDataAddrStr[64]; - char newDataAddrStr[64]; - -- memcpy(&oldServDataAddr, &cip->servDataAddr, sizeof(oldServDataAddr)); -- if (FTPFixPrivateAddr(&cip->servDataAddr, &cip->servCtlAddr)) { -- AddrToAddrStr(servDataAddrStr, sizeof(servDataAddrStr), &oldServDataAddr, 0, NULL); -- AddrToAddrStr(newDataAddrStr, sizeof(newDataAddrStr), &cip->servDataAddr, 0, NULL); -+ memcpy(&oldServDataAddr, (struct sockaddr_in *)&cip->servDataAddr, sizeof(oldServDataAddr)); -+ if (FTPFixPrivateAddr((struct sockaddr_in *)&cip->servDataAddr, (struct sockaddr_in *)&cip->servCtlAddr)) { -+ AddrToAddrStr(servDataAddrStr, sizeof(servDataAddrStr), (struct sockaddr *)&oldServDataAddr, 0, NULL); -+ AddrToAddrStr(newDataAddrStr, sizeof(newDataAddrStr), (struct sockaddr *)&cip->servDataAddr, 0, NULL); - PrintF(cip, "Fixing bogus PASV data address from %s to %s.\n", servDataAddrStr, newDataAddrStr); - } - } /* FTPFixServerDataAddr */ -@@ -914,11 +975,11 @@ - return; - - memcpy(&oldClientDataAddr, &cip->ourDataAddr, sizeof(oldClientDataAddr)); -- if (FTPFixPrivateAddr(&cip->ourDataAddr, &cip->clientKnownExternalAddr)) { -+ if (FTPFixPrivateAddr((struct sockaddr_in *)&cip->ourDataAddr, (struct sockaddr_in *)&cip->clientKnownExternalAddr)) { - memcpy(&newClientDataAddr, &cip->clientKnownExternalAddr, sizeof(newClientDataAddr)); -- newClientDataAddr.sin_port = cip->ourDataAddr.sin_port; -- AddrToAddrStr(ourDataAddrStr, sizeof(ourDataAddrStr), &oldClientDataAddr, 0, NULL); -- AddrToAddrStr(newDataAddrStr, sizeof(newDataAddrStr), &newClientDataAddr, 0, NULL); -+ newClientDataAddr.sin_port = ((struct sockaddr_in *)&cip->ourDataAddr)->sin_port; -+ AddrToAddrStr(ourDataAddrStr, sizeof(ourDataAddrStr), (struct sockaddr *)&oldClientDataAddr, 0, NULL); -+ AddrToAddrStr(newDataAddrStr, sizeof(newDataAddrStr), (struct sockaddr *)&newClientDataAddr, 0, NULL); - PrintF(cip, "Fixing what would have been a bogus PORT data address from %s to %s.\n", ourDataAddrStr, newDataAddrStr); - } - } /* FTPFixClientDataAddr */ -@@ -927,30 +988,45 @@ - - - int --BindToEphemeralPortNumber(const int sockfd, struct sockaddr_in *const addrp, const int ephemLo, const int ephemHi) -+BindToEphemeralPortNumber(const int sockfd, struct sockaddr *const addrp, const int ephemLo, const int ephemHi) - { - int i; - int result; - int rangesize; - unsigned short port; - -- addrp->sin_family = AF_INET; - if (((int) ephemLo == 0) || ((int) ephemLo >= (int) ephemHi)) { - /* Do it the normal way. System will - * pick one, typically in the range - * of 1024-4999. - */ -- addrp->sin_port = 0; /* Let system pick one. */ -- -- result = bind(sockfd, (struct sockaddr *) addrp, sizeof(struct sockaddr_in)); -+#ifdef ENABLE_IPV6 -+ if (addrp->sa_family == AF_INET6) -+ ((struct sockaddr_in6 *)addrp)->sin6_port = 0; /* Let system pick one. */ -+ else -+#endif -+ ((struct sockaddr_in *)addrp)->sin_port = 0; /* Let system pick one. */ -+#ifdef HAVE_SOCKADDR_SA_LEN -+ result = bind(sockfd, addrp, addrp->sa_len); -+#else -+ result = bind(sockfd, addrp, SA_LEN(addrp)); -+#endif - } else { - rangesize = (int) ((int) ephemHi - (int) ephemLo); - result = 0; - for (i=0; i<10; i++) { - port = (unsigned short) (((int) rand() % rangesize) + (int) ephemLo); -- addrp->sin_port = htons(port); -- -- result = bind(sockfd, (struct sockaddr *) addrp, sizeof(struct sockaddr_in)); -+#ifdef ENABLE_IPV6 -+ if (addrp->sa_family == AF_INET6) -+ ((struct sockaddr_in6 *)addrp)->sin6_port = htons(port); -+ else -+#endif -+ ((struct sockaddr_in *)addrp)->sin_port = htons(port); -+#ifdef HAVE_SOCKADDR_SA_LEN -+ result = bind(sockfd, addrp, addrp->sa_len); -+#else -+ result = bind(sockfd, addrp, SA_LEN(addrp)); -+#endif - if (result == 0) - break; - sleep(1); -@@ -989,7 +1065,11 @@ - result = 0; - CloseDataConnection(cip); /* In case we didn't before... */ - -+#ifdef ENABLE_IPV6 -+ dataSocket = socket(cip->ourCtlAddr.ss_family, SOCK_STREAM, 0); -+#else - dataSocket = socket(AF_INET, SOCK_STREAM, 0); -+#endif - if (dataSocket < 0) { - FTPLogError(cip, kDoPerror, "Could not get a data socket.\n"); - result = kErrNewStreamSocket; -@@ -1023,7 +1103,6 @@ - * which may have been set to something explicitly. - */ - cip->ourDataAddr = cip->ourCtlAddr; -- cip->ourDataAddr.sin_family = AF_INET; - - #ifdef HAVE_LIBSOCKS - cip->ourDataAddr.sin_port = 0; -@@ -1031,7 +1110,7 @@ - (int) sizeof (cip->ourDataAddr), - cip->servCtlAddr.sin_addr.s_addr) < 0) - #else -- if (BindToEphemeralPortNumber(dataSocket, &cip->ourDataAddr, (int) cip->ephemLo, (int) cip->ephemHi) < 0) -+ if (BindToEphemeralPortNumber(dataSocket, (struct sockaddr *)&cip->ourDataAddr, (int) cip->ephemLo, (int) cip->ephemHi) < 0) - #endif - { - FTPLogError(cip, kDoPerror, "Could not bind the data socket"); -@@ -1043,7 +1122,7 @@ - /* Need to do this so we can figure out which port the system - * gave to us. - */ -- if ((result = GetSocketAddress(cip, dataSocket, &cip->ourDataAddr)) < 0) -+ if ((result = GetSocketAddress(cip, dataSocket, (struct sockaddr *)&cip->ourDataAddr)) < 0) - goto bad; - - if (listen(dataSocket, 1) < 0) { -@@ -1053,8 +1132,9 @@ - goto bad; - } - -- FTPFixClientDataAddr(cip); -- if ((result = FTPSendPort(cip, &cip->ourDataAddr)) < 0) -+ if (cip->ourDataAddr.ss_family == AF_INET) -+ FTPFixClientDataAddr(cip); -+ if ((result = FTPSendPort(cip, (struct sockaddr *)&cip->ourDataAddr)) < 0) - goto bad; - - cip->dataPortMode = kSendPortMode; -@@ -1063,11 +1143,9 @@ - - while (--passiveAttemptsRemaining >= 0) { - cip->servDataAddr = cip->servCtlAddr; -- cip->servDataAddr.sin_family = AF_INET; - cip->ourDataAddr = cip->ourCtlAddr; -- cip->ourDataAddr.sin_family = AF_INET; - -- if (FTPSendPassive(cip, &cip->servDataAddr, &weirdPort) < 0) { -+ if (FTPSendPassive(cip, (struct sockaddr *)&cip->servDataAddr, &weirdPort) < 0) { - FTPLogError(cip, kDontPerror, "Passive mode refused.\n"); - cip->hasPASV = kCommandNotAvailable; - -@@ -1084,7 +1162,8 @@ - cip->errNo = kErrPassiveModeFailed; - goto bad; - } -- FTPFixServerDataAddr(cip); -+ if (cip->servDataAddr.ss_family == AF_INET) -+ FTPFixServerDataAddr(cip); - - #ifdef HAVE_LIBSOCKS - cip->ourDataAddr.sin_port = 0; -@@ -1092,7 +1171,7 @@ - (int) sizeof (cip->ourDataAddr), - cip->servCtlAddr.sin_addr.s_addr) < 0) - #else -- if (BindToEphemeralPortNumber(dataSocket, &cip->ourDataAddr, (int) cip->ephemLo, (int) cip->ephemHi) < 0) -+ if (BindToEphemeralPortNumber(dataSocket, (struct sockaddr *)&cip->ourDataAddr, (int) cip->ephemLo, (int) cip->ephemHi) < 0) - #endif - { - FTPLogError(cip, kDoPerror, "Could not bind the data socket"); -@@ -1100,8 +1179,13 @@ - cip->errNo = kErrBindDataSocket; - goto bad; - } -- -- result = SConnect(dataSocket, &cip->servDataAddr, (int) cip->connTimeout); -+ -+ /* Need to do this so we can figure out which port the system -+ * gave to us. -+ */ -+ if ((result = GetSocketAddress(cip, dataSocket, (struct sockaddr *)&cip->ourDataAddr)) < 0) -+ goto bad; -+ result = SConnect(dataSocket, (struct sockaddr *)&cip->servDataAddr, (int) cip->connTimeout); - - if (result == kTimeoutErr) { - if (mode == kFallBackToSendPortMode) { -@@ -1164,7 +1248,7 @@ - if (dataSocket != kClosedFileDescriptor) - (void) DisposeSocket(dataSocket); - -- dataSocket = socket(AF_INET, SOCK_STREAM, 0); -+ dataSocket = socket(cip->ourCtlAddr.ss_family, SOCK_STREAM, 0); - if (dataSocket < 0) { - FTPLogError(cip, kDoPerror, "Could not get a data socket.\n"); - result = kErrNewStreamSocket; -@@ -1180,7 +1264,7 @@ - /* Need to do this so we can figure out which port the system - * gave to us. - */ -- if ((result = GetSocketAddress(cip, dataSocket, &cip->ourDataAddr)) < 0) -+ if ((result = GetSocketAddress(cip, dataSocket, (struct sockaddr *) &cip->ourDataAddr)) < 0) - goto bad; - - cip->hasPASV = kCommandAvailable; -@@ -1225,9 +1309,9 @@ - memset(&cip->servDataAddr, 0, sizeof(cip->servDataAddr)); - - #ifdef NO_SIGNALS -- newSocket = SAccept(cip->dataSocket, &cip->servDataAddr, (int) cip->connTimeout); -+ newSocket = SAccept(cip->dataSocket, (struct sockaddr *)&cip->servDataAddr, (int) cip->connTimeout); - #else /* NO_SIGNALS */ -- len = (int) sizeof(cip->servDataAddr); -+ len = (int) sizeof(struct sockaddr_storage); - if (cip->connTimeout > 0) - (void) alarm(cip->connTimeout); - newSocket = accept(cip->dataSocket, (struct sockaddr *) &cip->servDataAddr, &len); -@@ -1242,11 +1326,10 @@ - cip->errNo = kErrAcceptDataSocket; - return (kErrAcceptDataSocket); - } -- - if (cip->allowProxyForPORT == 0) { -- if (memcmp(&cip->servDataAddr.sin_addr.s_addr, &cip->servCtlAddr.sin_addr.s_addr, sizeof(cip->servDataAddr.sin_addr.s_addr)) != 0) { -- AddrToAddrStr(ctrlAddrStr, sizeof(ctrlAddrStr), &cip->servCtlAddr, 0, NULL); -- AddrToAddrStr(dataAddrStr, sizeof(dataAddrStr), &cip->servDataAddr, 0, NULL); -+ AddrToAddrStr(ctrlAddrStr, sizeof(ctrlAddrStr), (struct sockaddr *)&cip->servCtlAddr, 0, "%h"); -+ AddrToAddrStr(dataAddrStr, sizeof(dataAddrStr), (struct sockaddr *)&cip->servDataAddr, 0, "%h"); -+ if (strcmp(ctrlAddrStr, dataAddrStr) != 0) { - FTPLogError(cip, kDontPerror, "Data connection from %s did not originate from remote server %s!\n", dataAddrStr, ctrlAddrStr); - (void) DisposeSocket(newSocket); - cip->dataSocket = kClosedFileDescriptor; -@@ -1254,21 +1337,57 @@ - return (kErrProxyDataConnectionsDisabled); - } - } -- - if (cip->require20 != 0) { -- remoteDataPort = ntohs(cip->servDataAddr.sin_port); -- remoteCtrlPort = ntohs(cip->servCtlAddr.sin_port); -- if ((int) remoteDataPort != ((int) remoteCtrlPort - 1)) { -- FTPLogError(cip, kDontPerror, "Data connection did not originate on correct port (expecting %d, got %d)!\n", (int) remoteCtrlPort - 1, (int) remoteDataPort); -- (void) DisposeSocket(newSocket); -- cip->dataSocket = kClosedFileDescriptor; -- cip->errNo = kErrDataConnOriginatedFromBadPort; -- return (kErrDataConnOriginatedFromBadPort); -+#ifdef ENABLE_IPV6 -+ if (cip->servDataAddr.ss_family == AF_INET6) { -+ struct sockaddr_in6 *servDataAddr = -+ (struct sockaddr_in6 *) &cip->servDataAddr; -+ struct sockaddr_in6 *servCtlAddr = -+ (struct sockaddr_in6 *) &cip->servCtlAddr; -+ -+ remoteDataPort = ntohs(servDataAddr->sin6_port); -+ remoteCtrlPort = ntohs(servCtlAddr->sin6_port); -+ if ((int) remoteDataPort != ((int) remoteCtrlPort - 1)) { -+ FTPLogError(cip, kDontPerror, "Data connection did not originate on correct port!\n"); -+ (void) DisposeSocket(newSocket); -+ cip->dataSocket = kClosedFileDescriptor; -+ cip->errNo = kErrAcceptDataSocket; -+ return (kErrAcceptDataSocket); -+ } else if (memcmp(&servDataAddr->sin6_addr, &servCtlAddr->sin6_addr, sizeof(servDataAddr->sin6_addr)) != 0) { -+ FTPLogError(cip, kDontPerror, "Data connection did not originate from remote server!\n"); -+ (void) DisposeSocket(newSocket); -+ cip->dataSocket = kClosedFileDescriptor; -+ cip->errNo = kErrAcceptDataSocket; -+ return (kErrAcceptDataSocket); -+ } -+ } else { -+#endif -+ struct sockaddr_in *servDataAddr = -+ (struct sockaddr_in *) &cip->servDataAddr; -+ struct sockaddr_in *servCtlAddr = -+ (struct sockaddr_in *) &cip->servCtlAddr; -+ -+ remoteDataPort = ntohs(servDataAddr->sin_port); -+ remoteCtrlPort = ntohs(servCtlAddr->sin_port); -+ if ((int) remoteDataPort != ((int) remoteCtrlPort - 1)) { -+ FTPLogError(cip, kDontPerror, "Data connection did not originate on correct port!\n"); -+ (void) DisposeSocket(newSocket); -+ cip->dataSocket = kClosedFileDescriptor; -+ cip->errNo = kErrAcceptDataSocket; -+ return (kErrAcceptDataSocket); -+ } else if (memcmp(&servDataAddr->sin_addr.s_addr, &servCtlAddr->sin_addr.s_addr, sizeof(servDataAddr->sin_addr.s_addr)) != 0) { -+ FTPLogError(cip, kDontPerror, "Data connection did not originate on correct port (expecting %d, got %d)!\n", (int) remoteCtrlPort - 1, (int) remoteDataPort); -+ (void) DisposeSocket(newSocket); -+ cip->errNo = kErrDataConnOriginatedFromBadPort; -+ cip->errNo = kErrAcceptDataSocket; -+ return (kErrDataConnOriginatedFromBadPort); -+ } -+#ifdef ENABLE_IPV6 - } -+#endif - } - cip->dataSocket = newSocket; - } -- - return (0); - } /* AcceptDataConnection */ - -Index: ncftp3/libncftp/getaddrinfo.c -diff -u /dev/null ncftp3/libncftp/getaddrinfo.c:1.1 ---- /dev/null Mon Nov 9 21:52:32 2009 -+++ ncftp3/libncftp/getaddrinfo.c Tue Nov 6 23:50:46 2001 -@@ -0,0 +1,607 @@ -+/* -+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. Neither the name of the project nor the names of its contributors -+ * may be used to endorse or promote products derived from this software -+ * without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND -+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE -+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -+ * SUCH DAMAGE. -+ */ -+ -+/* -+ * "#ifdef FAITH" part is local hack for supporting IPv4-v6 translator. -+ * -+ * Issues to be discussed: -+ * - Thread safe-ness must be checked. -+ * - Return values. There are nonstandard return values defined and used -+ * in the source code. This is because RFC2133 is silent about which error -+ * code must be returned for which situation. -+ * - PF_UNSPEC case would be handled in getipnodebyname() with the AI_ALL flag. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "addrinfo.h" -+ -+#if defined(__KAME__) && defined(INET6) -+# define FAITH -+#endif -+ -+#define SUCCESS 0 -+#define ANY 0 -+#define YES 1 -+#define NO 0 -+ -+#ifdef FAITH -+static int translate = NO; -+static struct in6_addr faith_prefix = IN6ADDR_ANY_INIT; -+#endif -+ -+static const char in_addrany[] = { 0, 0, 0, 0 }; -+static const char in6_addrany[] = { -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -+}; -+static const char in_loopback[] = { 127, 0, 0, 1 }; -+static const char in6_loopback[] = { -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -+}; -+ -+struct sockinet { -+ u_char si_len; -+ u_char si_family; -+ u_short si_port; -+}; -+ -+static struct afd { -+ int a_af; -+ int a_addrlen; -+ int a_socklen; -+ int a_off; -+ const char *a_addrany; -+ const char *a_loopback; -+} afdl [] = { -+#ifdef INET6 -+#define N_INET6 0 -+ {PF_INET6, sizeof(struct in6_addr), -+ sizeof(struct sockaddr_in6), -+ offsetof(struct sockaddr_in6, sin6_addr), -+ in6_addrany, in6_loopback}, -+#define N_INET 1 -+#else -+#define N_INET 0 -+#endif -+ {PF_INET, sizeof(struct in_addr), -+ sizeof(struct sockaddr_in), -+ offsetof(struct sockaddr_in, sin_addr), -+ in_addrany, in_loopback}, -+ {0, 0, 0, 0, NULL, NULL}, -+}; -+ -+#ifdef INET6 -+#define PTON_MAX 16 -+#else -+#define PTON_MAX 4 -+#endif -+ -+ -+static int get_name __P((const char *, struct afd *, -+ struct addrinfo **, char *, struct addrinfo *, -+ int)); -+static int get_addr __P((const char *, int, struct addrinfo **, -+ struct addrinfo *, int)); -+static int str_isnumber __P((const char *)); -+ -+static char *ai_errlist[] = { -+ "success.", -+ "address family for hostname not supported.", /* EAI_ADDRFAMILY */ -+ "temporary failure in name resolution.", /* EAI_AGAIN */ -+ "invalid value for ai_flags.", /* EAI_BADFLAGS */ -+ "non-recoverable failure in name resolution.", /* EAI_FAIL */ -+ "ai_family not supported.", /* EAI_FAMILY */ -+ "memory allocation failure.", /* EAI_MEMORY */ -+ "no address associated with hostname.", /* EAI_NODATA */ -+ "hostname nor servname provided, or not known.",/* EAI_NONAME */ -+ "servname not supported for ai_socktype.", /* EAI_SERVICE */ -+ "ai_socktype not supported.", /* EAI_SOCKTYPE */ -+ "system error returned in errno.", /* EAI_SYSTEM */ -+ "invalid value for hints.", /* EAI_BADHINTS */ -+ "resolved protocol is unknown.", /* EAI_PROTOCOL */ -+ "unknown error.", /* EAI_MAX */ -+}; -+ -+#define GET_CANONNAME(ai, str) \ -+if (pai->ai_flags & AI_CANONNAME) {\ -+ if (((ai)->ai_canonname = (char *)malloc(strlen(str) + 1)) != NULL) {\ -+ strcpy((ai)->ai_canonname, (str));\ -+ } else {\ -+ error = EAI_MEMORY;\ -+ goto free;\ -+ }\ -+} -+ -+#define GET_AI(ai, afd, addr, port) {\ -+ char *p;\ -+ if (((ai) = (struct addrinfo *)malloc(sizeof(struct addrinfo) +\ -+ ((afd)->a_socklen)))\ -+ == NULL) goto free;\ -+ memcpy(ai, pai, sizeof(struct addrinfo));\ -+ (ai)->ai_addr = (struct sockaddr *)((ai) + 1);\ -+ memset((ai)->ai_addr, 0, (afd)->a_socklen);\ -+ (ai)->ai_addr->sa_len = (ai)->ai_addrlen = (afd)->a_socklen;\ -+ (ai)->ai_addr->sa_family = (ai)->ai_family = (afd)->a_af;\ -+ ((struct sockinet *)(ai)->ai_addr)->si_port = port;\ -+ p = (char *)((ai)->ai_addr);\ -+ memcpy(p + (afd)->a_off, (addr), (afd)->a_addrlen);\ -+} -+ -+#define ERR(err) { error = (err); goto bad; } -+ -+char * -+gai_strerror(ecode) -+ int ecode; -+{ -+ if (ecode < 0 || ecode > EAI_MAX) -+ ecode = EAI_MAX; -+ return ai_errlist[ecode]; -+} -+ -+void -+freeaddrinfo(ai) -+ struct addrinfo *ai; -+{ -+ struct addrinfo *next; -+ -+ do { -+ next = ai->ai_next; -+ if (ai->ai_canonname) -+ free(ai->ai_canonname); -+ /* no need to free(ai->ai_addr) */ -+ free(ai); -+ } while ((ai = next) != NULL); -+} -+ -+static int -+str_isnumber(p) -+ const char *p; -+{ -+ char *q = (char *)p; -+ while (*q) { -+ if (! isdigit(*q)) -+ return NO; -+ q++; -+ } -+ return YES; -+} -+ -+int -+getaddrinfo(hostname, servname, hints, res) -+ const char *hostname, *servname; -+ const struct addrinfo *hints; -+ struct addrinfo **res; -+{ -+ struct addrinfo sentinel; -+ struct addrinfo *top = NULL; -+ struct addrinfo *cur; -+ int i, error = 0; -+ char pton[PTON_MAX]; -+ struct addrinfo ai; -+ struct addrinfo *pai; -+ u_short port; -+ -+#ifdef FAITH -+ static int firsttime = 1; -+ -+ if (firsttime) { -+ /* translator hack */ -+ { -+ char *q = getenv("GAI"); -+ if (q && inet_pton(AF_INET6, q, &faith_prefix) == 1) -+ translate = YES; -+ } -+ firsttime = 0; -+ } -+#endif -+ -+ /* initialize file static vars */ -+ sentinel.ai_next = NULL; -+ cur = &sentinel; -+ pai = &ai; -+ pai->ai_flags = 0; -+ pai->ai_family = PF_UNSPEC; -+ pai->ai_socktype = ANY; -+ pai->ai_protocol = ANY; -+ pai->ai_addrlen = 0; -+ pai->ai_canonname = NULL; -+ pai->ai_addr = NULL; -+ pai->ai_next = NULL; -+ port = ANY; -+ -+ if (hostname == NULL && servname == NULL) -+ return EAI_NONAME; -+ if (hints) { -+ /* error check for hints */ -+ if (hints->ai_addrlen || hints->ai_canonname || -+ hints->ai_addr || hints->ai_next) -+ ERR(EAI_BADHINTS); /* xxx */ -+ if (hints->ai_flags & ~AI_MASK) -+ ERR(EAI_BADFLAGS); -+ switch (hints->ai_family) { -+ case PF_UNSPEC: -+ case PF_INET: -+#ifdef INET6 -+ case PF_INET6: -+#endif -+ break; -+ default: -+ ERR(EAI_FAMILY); -+ } -+ memcpy(pai, hints, sizeof(*pai)); -+ switch (pai->ai_socktype) { -+ case ANY: -+ switch (pai->ai_protocol) { -+ case ANY: -+ break; -+ case IPPROTO_UDP: -+ pai->ai_socktype = SOCK_DGRAM; -+ break; -+ case IPPROTO_TCP: -+ pai->ai_socktype = SOCK_STREAM; -+ break; -+ default: -+ pai->ai_socktype = SOCK_RAW; -+ break; -+ } -+ break; -+ case SOCK_RAW: -+ break; -+ case SOCK_DGRAM: -+ if (pai->ai_protocol != IPPROTO_UDP && -+ pai->ai_protocol != ANY) -+ ERR(EAI_BADHINTS); /*xxx*/ -+ pai->ai_protocol = IPPROTO_UDP; -+ break; -+ case SOCK_STREAM: -+ if (pai->ai_protocol != IPPROTO_TCP && -+ pai->ai_protocol != ANY) -+ ERR(EAI_BADHINTS); /*xxx*/ -+ pai->ai_protocol = IPPROTO_TCP; -+ break; -+ default: -+ ERR(EAI_SOCKTYPE); -+ break; -+ } -+ } -+ -+ /* -+ * service port -+ */ -+ if (servname) { -+ if (str_isnumber(servname)) { -+ if (pai->ai_socktype == ANY) { -+ /* caller accept *ANY* socktype */ -+ pai->ai_socktype = SOCK_DGRAM; -+ pai->ai_protocol = IPPROTO_UDP; -+ } -+ port = htons(atoi(servname)); -+ } else { -+ struct servent *sp; -+ char *proto; -+ -+ proto = NULL; -+ switch (pai->ai_socktype) { -+ case ANY: -+ proto = NULL; -+ break; -+ case SOCK_DGRAM: -+ proto = "udp"; -+ break; -+ case SOCK_STREAM: -+ proto = "tcp"; -+ break; -+ default: -+ fprintf(stderr, "panic!\n"); -+ break; -+ } -+ if ((sp = getservbyname(servname, proto)) == NULL) -+ ERR(EAI_SERVICE); -+ port = sp->s_port; -+ if (pai->ai_socktype == ANY) -+ if (strcmp(sp->s_proto, "udp") == 0) { -+ pai->ai_socktype = SOCK_DGRAM; -+ pai->ai_protocol = IPPROTO_UDP; -+ } else if (strcmp(sp->s_proto, "tcp") == 0) { -+ pai->ai_socktype = SOCK_STREAM; -+ pai->ai_protocol = IPPROTO_TCP; -+ } else -+ ERR(EAI_PROTOCOL); /*xxx*/ -+ } -+ } -+ -+ /* -+ * hostname == NULL. -+ * passive socket -> anyaddr (0.0.0.0 or ::) -+ * non-passive socket -> localhost (127.0.0.1 or ::1) -+ */ -+ if (hostname == NULL) { -+ struct afd *afd; -+ -+ for (afd = &afdl[0]; afd->a_af; afd++) { -+ if (!(pai->ai_family == PF_UNSPEC -+ || pai->ai_family == afd->a_af)) { -+ continue; -+ } -+ -+ if (pai->ai_flags & AI_PASSIVE) { -+ GET_AI(cur->ai_next, afd, afd->a_addrany, port); -+ /* xxx meaningless? -+ * GET_CANONNAME(cur->ai_next, "anyaddr"); -+ */ -+ } else { -+ GET_AI(cur->ai_next, afd, afd->a_loopback, -+ port); -+ /* xxx meaningless? -+ * GET_CANONNAME(cur->ai_next, "localhost"); -+ */ -+ } -+ cur = cur->ai_next; -+ } -+ top = sentinel.ai_next; -+ if (top) -+ goto good; -+ else -+ ERR(EAI_FAMILY); -+ } -+ -+ /* hostname as numeric name */ -+ for (i = 0; afdl[i].a_af; i++) { -+ if (inet_pton(afdl[i].a_af, hostname, pton)) { -+ u_long v4a; -+ u_char pfx; -+ -+ switch (afdl[i].a_af) { -+ case AF_INET: -+ v4a = ((struct in_addr *)pton)->s_addr; -+ if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a)) -+ pai->ai_flags &= ~AI_CANONNAME; -+ v4a >>= IN_CLASSA_NSHIFT; -+ if (v4a == 0 || v4a == IN_LOOPBACKNET) -+ pai->ai_flags &= ~AI_CANONNAME; -+ break; -+#ifdef INET6 -+ case AF_INET6: -+ pfx = ((struct in6_addr *)pton)->s6_addr8[0]; -+ if (pfx == 0 || pfx == 0xfe || pfx == 0xff) -+ pai->ai_flags &= ~AI_CANONNAME; -+ break; -+#endif -+ } -+ -+ if (pai->ai_family == afdl[i].a_af || -+ pai->ai_family == PF_UNSPEC) { -+ if (! (pai->ai_flags & AI_CANONNAME)) { -+ GET_AI(top, &afdl[i], pton, port); -+ goto good; -+ } -+ /* -+ * if AI_CANONNAME and if reverse lookup -+ * fail, return ai anyway to pacify -+ * calling application. -+ * -+ * XXX getaddrinfo() is a name->address -+ * translation function, and it looks strange -+ * that we do addr->name translation here. -+ */ -+ get_name(pton, &afdl[i], &top, pton, pai, port); -+ goto good; -+ } else -+ ERR(EAI_FAMILY); /*xxx*/ -+ } -+ } -+ -+ if (pai->ai_flags & AI_NUMERICHOST) -+ ERR(EAI_NONAME); -+ -+ /* hostname as alphabetical name */ -+ error = get_addr(hostname, pai->ai_family, &top, pai, port); -+ if (error == 0) { -+ if (top) { -+ good: -+ *res = top; -+ return SUCCESS; -+ } else -+ error = EAI_FAIL; -+ } -+ free: -+ if (top) -+ freeaddrinfo(top); -+ bad: -+ *res = NULL; -+ return error; -+} -+ -+static int -+get_name(addr, afd, res, numaddr, pai, port0) -+ const char *addr; -+ struct afd *afd; -+ struct addrinfo **res; -+ char *numaddr; -+ struct addrinfo *pai; -+ int port0; -+{ -+ u_short port = port0 & 0xffff; -+ struct hostent *hp; -+ struct addrinfo *cur; -+ int error = 0, h_error; -+ -+#ifdef INET6 -+ hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error); -+#else -+ hp = gethostbyaddr(addr, afd->a_addrlen, AF_INET); -+#endif -+ if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { -+ GET_AI(cur, afd, hp->h_addr_list[0], port); -+ GET_CANONNAME(cur, hp->h_name); -+ } else -+ GET_AI(cur, afd, numaddr, port); -+ -+#ifdef INET6 -+ if (hp) -+ freehostent(hp); -+#endif -+ *res = cur; -+ return SUCCESS; -+ free: -+ if (cur) -+ freeaddrinfo(cur); -+#ifdef INET6 -+ if (hp) -+ freehostent(hp); -+#endif -+ /* bad: */ -+ *res = NULL; -+ return error; -+} -+ -+static int -+get_addr(hostname, af, res, pai, port0) -+ const char *hostname; -+ int af; -+ struct addrinfo **res; -+ struct addrinfo *pai; -+ int port0; -+{ -+ u_short port = port0 & 0xffff; -+ struct addrinfo sentinel; -+ struct hostent *hp; -+ struct addrinfo *top, *cur; -+ struct afd *afd; -+ int i, error = 0, h_error; -+ char *ap; -+#ifndef INET6 -+ extern int h_errno; -+#endif -+ -+ top = NULL; -+ sentinel.ai_next = NULL; -+ cur = &sentinel; -+#ifdef INET6 -+ if (af == AF_UNSPEC) { -+ hp = getipnodebyname(hostname, AF_INET6, -+ AI_ADDRCONFIG|AI_ALL|AI_V4MAPPED, &h_error); -+ } else -+ hp = getipnodebyname(hostname, af, AI_ADDRCONFIG, &h_error); -+#else -+ hp = gethostbyname(hostname); -+ h_error = h_errno; -+#endif -+ if (hp == NULL) { -+ switch (h_error) { -+ case HOST_NOT_FOUND: -+ case NO_DATA: -+ error = EAI_NODATA; -+ break; -+ case TRY_AGAIN: -+ error = EAI_AGAIN; -+ break; -+ case NO_RECOVERY: -+ default: -+ error = EAI_FAIL; -+ break; -+ } -+ goto bad; -+ } -+ -+ if ((hp->h_name == NULL) || (hp->h_name[0] == 0) || -+ (hp->h_addr_list[0] == NULL)) -+ ERR(EAI_FAIL); -+ -+ for (i = 0; (ap = hp->h_addr_list[i]) != NULL; i++) { -+ switch (af) { -+#ifdef INET6 -+ case AF_INET6: -+ afd = &afdl[N_INET6]; -+ break; -+#endif -+#ifndef INET6 -+ default: /* AF_UNSPEC */ -+#endif -+ case AF_INET: -+ afd = &afdl[N_INET]; -+ break; -+#ifdef INET6 -+ default: /* AF_UNSPEC */ -+ if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ap)) { -+ ap += sizeof(struct in6_addr) - -+ sizeof(struct in_addr); -+ afd = &afdl[N_INET]; -+ } else -+ afd = &afdl[N_INET6]; -+ break; -+#endif -+ } -+#ifdef FAITH -+ if (translate && afd->a_af == AF_INET) { -+ struct in6_addr *in6; -+ -+ GET_AI(cur->ai_next, &afdl[N_INET6], ap, port); -+ in6 = &((struct sockaddr_in6 *)cur->ai_next->ai_addr)->sin6_addr; -+ memcpy(&in6->s6_addr32[0], &faith_prefix, -+ sizeof(struct in6_addr) - sizeof(struct in_addr)); -+ memcpy(&in6->s6_addr32[3], ap, sizeof(struct in_addr)); -+ } else -+#endif /* FAITH */ -+ GET_AI(cur->ai_next, afd, ap, port); -+ if (cur == &sentinel) { -+ top = cur->ai_next; -+ GET_CANONNAME(top, hp->h_name); -+ } -+ cur = cur->ai_next; -+ } -+#ifdef INET6 -+ freehostent(hp); -+#endif -+ *res = top; -+ return SUCCESS; -+ free: -+ if (top) -+ freeaddrinfo(top); -+#ifdef INET6 -+ if (hp) -+ freehostent(hp); -+#endif -+ bad: -+ *res = NULL; -+ return error; -+} -Index: ncftp3/libncftp/getnameinfo.c -diff -u /dev/null ncftp3/libncftp/getnameinfo.c:1.1 ---- /dev/null Mon Nov 9 21:52:32 2009 -+++ ncftp3/libncftp/getnameinfo.c Tue Nov 6 23:50:47 2001 -@@ -0,0 +1,203 @@ -+/* -+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. Neither the name of the project nor the names of its contributors -+ * may be used to endorse or promote products derived from this software -+ * without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND -+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE -+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -+ * SUCH DAMAGE. -+ */ -+ -+/* -+ * Issues to be discussed: -+ * - Thread safe-ness must be checked -+ * - Return values. There seems to be no standard for return value (RFC2133) -+ * but INRIA implementation returns EAI_xxx defined for getaddrinfo(). -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "addrinfo.h" -+ -+#define SUCCESS 0 -+#define ANY 0 -+#define YES 1 -+#define NO 0 -+ -+static struct afd { -+ int a_af; -+ int a_addrlen; -+ int a_socklen; -+ int a_off; -+} afdl [] = { -+#ifdef INET6 -+ {PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6), -+ offsetof(struct sockaddr_in6, sin6_addr)}, -+#endif -+ {PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in), -+ offsetof(struct sockaddr_in, sin_addr)}, -+ {0, 0, 0}, -+}; -+ -+struct sockinet { -+ u_char si_len; -+ u_char si_family; -+ u_short si_port; -+}; -+ -+#define ENI_NOSOCKET 0 -+#define ENI_NOSERVNAME 1 -+#define ENI_NOHOSTNAME 2 -+#define ENI_MEMORY 3 -+#define ENI_SYSTEM 4 -+#define ENI_FAMILY 5 -+#define ENI_SALEN 6 -+ -+int -+getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) -+ const struct sockaddr *sa; -+ size_t salen; -+ char *host; -+ size_t hostlen; -+ char *serv; -+ size_t servlen; -+ int flags; -+{ -+ struct afd *afd; -+ struct servent *sp; -+ struct hostent *hp; -+ u_short port; -+ int family, len, i; -+ char *addr, *p; -+ u_long v4a; -+ u_char pfx; -+ int h_error; -+ char numserv[512]; -+ char numaddr[512]; -+ -+ if (sa == NULL) -+ return ENI_NOSOCKET; -+ -+ len = sa->sa_len; -+ if (len != salen) return ENI_SALEN; -+ -+ family = sa->sa_family; -+ for (i = 0; afdl[i].a_af; i++) -+ if (afdl[i].a_af == family) { -+ afd = &afdl[i]; -+ goto found; -+ } -+ return ENI_FAMILY; -+ -+ found: -+ if (len != afd->a_socklen) return ENI_SALEN; -+ -+ port = ((struct sockinet *)sa)->si_port; /* network byte order */ -+ addr = (char *)sa + afd->a_off; -+ -+ if (serv == NULL || servlen == 0) { -+ /* what we should do? */ -+ } else if (flags & NI_NUMERICSERV) { -+ snprintf(numserv, sizeof(numserv), "%d", ntohs(port)); -+ if (strlen(numserv) > servlen) -+ return ENI_MEMORY; -+ strcpy(serv, numserv); -+ } else { -+ sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp"); -+ if (sp) { -+ if (strlen(sp->s_name) > servlen) -+ return ENI_MEMORY; -+ strcpy(serv, sp->s_name); -+ } else -+ return ENI_NOSERVNAME; -+ } -+ -+ switch (sa->sa_family) { -+ case AF_INET: -+ v4a = ((struct sockaddr_in *)sa)->sin_addr.s_addr; -+ if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a)) -+ flags |= NI_NUMERICHOST; -+ v4a >>= IN_CLASSA_NSHIFT; -+ if (v4a == 0 || v4a == IN_LOOPBACKNET) -+ flags |= NI_NUMERICHOST; -+ break; -+#ifdef INET6 -+ case AF_INET6: -+ pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr8[0]; -+ if (pfx == 0 || pfx == 0xfe || pfx == 0xff) -+ flags |= NI_NUMERICHOST; -+ break; -+#endif -+ } -+ if (host == NULL || hostlen == 0) { -+ /* what should we do? */ -+ } else if (flags & NI_NUMERICHOST) { -+ if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr)) -+ == NULL) -+ return ENI_SYSTEM; -+ if (strlen(numaddr) > hostlen) -+ return ENI_MEMORY; -+ strcpy(host, numaddr); -+ } else { -+#ifdef INET6 -+ hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error); -+#else -+ hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af); -+ h_error = h_errno; -+#endif -+ -+ if (hp) { -+ if (flags & NI_NOFQDN) { -+ p = strchr(hp->h_name, '.'); -+ if (p) *p = '\0'; -+ } -+ if (strlen(hp->h_name) > hostlen) { -+#ifdef INET6 -+ freehostent(hp); -+#endif -+ return ENI_MEMORY; -+ } -+ strcpy(host, hp->h_name); -+#ifdef INET6 -+ freehostent(hp); -+#endif -+ } else { -+ if (flags & NI_NAMEREQD) -+ return ENI_NOHOSTNAME; -+ if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr)) -+ == NULL) -+ return ENI_NOHOSTNAME; -+ if (strlen(numaddr) > hostlen) -+ return ENI_MEMORY; -+ strcpy(host, numaddr); -+ } -+ } -+ return SUCCESS; -+} -Index: ncftp3/libncftp/ncftp.h -diff -u ncftp3/libncftp/ncftp.h:1.1.1.23 ncftp3/libncftp/ncftp.h:1.28 ---- ncftp3/libncftp/ncftp.h:1.1.1.23 Thu Nov 5 16:20:41 2009 -+++ ncftp3/libncftp/ncftp.h Thu Nov 5 16:47:09 2009 -@@ -378,11 +378,10 @@ - int mlsFeatures; /* Do not modify this field. */ - int STATfileParamWorks; /* Do not modify this field. */ - int NLSTfileParamWorks; /* Do not modify this field. */ -- -- struct sockaddr_in servCtlAddr; /* Do not modify this field. */ -- struct sockaddr_in servDataAddr; /* Do not modify this field. */ -- struct sockaddr_in ourCtlAddr; /* Do not modify this field. */ -- struct sockaddr_in ourDataAddr; /* Do not modify this field. */ -+ struct sockaddr_storage servCtlAddr; /* Do not modify this field. */ -+ struct sockaddr_storage servDataAddr; /* Do not modify this field. */ -+ struct sockaddr_storage ourCtlAddr; /* Do not modify this field. */ -+ struct sockaddr_storage ourDataAddr; /* Do not modify this field. */ - int netMode; /* Do not use or modify. */ - char *buf; /* Do not modify this field. */ - size_t bufSize; /* Do not modify this field. */ -@@ -997,8 +996,8 @@ - - /* Everything else below are private routines, or stuff for testing */ - int FTPInitConnectionInfo2(const FTPLIPtr lip, const FTPCIPtr cip, char *const buf, size_t bufSize); --int FTPSendPort(const FTPCIPtr cip, struct sockaddr_in *saddr); --int FTPSendPassive(const FTPCIPtr cip, struct sockaddr_in *saddr, int *weird); -+int FTPSendPort(const FTPCIPtr cip, struct sockaddr *saddr); -+int FTPSendPassive(const FTPCIPtr cip, struct sockaddr *saddr, int *weird); - int FTPSetStartOffset(const FTPCIPtr cip, longest_int restartPt); - void FTPCloseControlConnection(const FTPCIPtr cip); - int FTPSendCommandStr(const FTPCIPtr cip, char *const command, const size_t siz); -@@ -1060,7 +1059,7 @@ - int FTPFileExists2(const FTPCIPtr cip, const char *const file, const int tryMDTM, const int trySIZE, const int tryMLST, const int trySTAT, const int tryNLST); - - void FTPGetDateStr(time_t t, const char *fmt, char *const ltstr1, const size_t ltstr1size, char *const gtstr1, const size_t gtstr1size); --int BindToEphemeralPortNumber(const int sockfd, struct sockaddr_in *const addrp, const int ephemLo, const int ephemHi); -+int BindToEphemeralPortNumber(const int sockfd, struct sockaddr *const addrp, const int ephemLo, const int ephemHi); - int BufferGets(char *, size_t, int, char *, char **, char **, size_t); - void DisposeFileInfoListContents(FTPFileInfoListPtr); - void InitFileInfoList(FTPFileInfoListPtr); -Index: ncftp3/libncftp/syshdrs.h -diff -u ncftp3/libncftp/syshdrs.h:1.1.1.15 ncftp3/libncftp/syshdrs.h:1.14 ---- ncftp3/libncftp/syshdrs.h:1.1.1.15 Thu Nov 5 16:20:41 2009 -+++ ncftp3/libncftp/syshdrs.h Thu Nov 5 16:47:09 2009 -@@ -24,6 +24,10 @@ - # define _WIN32_WINNT 0x0400 - # endif - # include /* includes if _WIN32_WINNT >= 0x400 */ -+# ifdef ENABLE_IPV6 -+# include -+# define INET6_ADDRSTRLEN 46 -+# endif /* ENABLE_IPV6 */ - # include - # include - # include -@@ -164,6 +168,9 @@ - # include - # endif - -+# ifndef HAVE_GETADDRINFO -+# include "addrinfo.h" -+# endif - # ifdef CAN_USE_SYS_SELECT_H - # include - # endif ---- ncftp-3.2.5/ncftp/cmds.c.orig 2010-04-05 21:33:21.000000000 +0200 -+++ ncftp-3.2.5/ncftp/cmds.c 2011-03-27 15:37:19.813736435 +0200 -@@ -2580,8 +2580,7 @@ - return (-1); - } - #endif -- (void) STRNCPY(gConn.host, ipstr); -- OpenMsg("Connecting to %s...", ipstr); -+ OpenMsg("Connecting to %s...", gConn.host); - } else { - OpenMsg("Connecting to %s via %s...", gConn.host, gConn.firewallHost); - Trace(0, "Fw: %s Type: %d User: %s Pass: %s Port: %u\n", -@@ -3784,8 +3783,8 @@ - char preferredLocalAddrStr[64]; - - preferredLocalAddrStr[0] = '\0'; -- if (gConn.preferredLocalAddr.sin_family != 0) -- AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), &gConn.preferredLocalAddr, 0, "%h"); -+ if (gConn.preferredLocalAddr.sin_family == AF_INET) -+ AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), (struct sockaddr *)&gConn.preferredLocalAddr, 0, "%h"); - - if (ftwip->depth >= 50) { - Trace(-1, "Aborting -- recursion depth is %u.\nPerhaps an infinite loop exists on the remote filesystem?", (unsigned int) ftwip->depth); -@@ -3952,8 +3951,8 @@ - char preferredLocalAddrStr[64]; - - preferredLocalAddrStr[0] = '\0'; -- if (gConn.preferredLocalAddr.sin_family != 0) -- AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), &gConn.preferredLocalAddr, 0, "%h"); -+ if (gConn.preferredLocalAddr.sin_family == AF_INET) -+ AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), (struct sockaddr *)&gConn.preferredLocalAddr, 0, "%h"); - - cinfo.xtype = gBm.xferType; - cinfo.deleteFlag = kDeleteNo; -@@ -4160,8 +4159,8 @@ - char preferredLocalAddrStr[64]; - - preferredLocalAddrStr[0] = '\0'; -- if (gConn.preferredLocalAddr.sin_family != 0) -- AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), &gConn.preferredLocalAddr, 0, "%h"); -+ if (gConn.preferredLocalAddr.sin_family == AF_INET) -+ AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), (struct sockaddr *)&gConn.preferredLocalAddr, 0, "%h"); - - cinfop = (SpoolCmdInfo *) ftwip->userdata; - /* rerpath = ftwip->curPath + ftwip->startPathLen + 1; */ -@@ -4321,8 +4320,8 @@ - char preferredLocalAddrStr[64]; - - preferredLocalAddrStr[0] = '\0'; -- if (gConn.preferredLocalAddr.sin_family != 0) -- AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), &gConn.preferredLocalAddr, 0, "%h"); -+ if (gConn.preferredLocalAddr.sin_family == AF_INET) -+ AddrToAddrStr(preferredLocalAddrStr, sizeof(preferredLocalAddrStr), (struct sockaddr *)&gConn.preferredLocalAddr, 0, "%h"); - - cinfo.xtype = gBm.xferType; - cinfo.deleteFlag = kDeleteNo; -Index: ncftp3/ncftp/syshdrs.h -diff -u ncftp3/ncftp/syshdrs.h:1.1.1.15 ncftp3/ncftp/syshdrs.h:1.13 ---- ncftp3/ncftp/syshdrs.h:1.1.1.15 Thu Nov 5 16:20:41 2009 -+++ ncftp3/ncftp/syshdrs.h Thu Nov 5 16:47:09 2009 -@@ -33,6 +33,9 @@ - # define _WIN32_WINNT 0x0400 - # endif - # include /* includes if _WIN32_WINNT >= 0x400 */ -+#ifdef ENABLE_IPV6 -+# include -+#endif /* ENABLE_IPV6 */ - # include - # include - # include -@@ -174,6 +177,9 @@ - # include - # include - # include -+# ifndef HAVE_GETADDRINFO -+# include "addrinfo.h" -+# endif - # if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H) - # include - # include ---- ncftp-3.2.5/ncftp/util.c.orig 2010-10-30 23:34:25.000000000 +0200 -+++ ncftp-3.2.5/ncftp/util.c 2011-03-27 15:41:18.901729730 +0200 -@@ -666,47 +666,29 @@ - int - MyGetHostByName(char *const volatile dst, size_t dsize, const char *const hn, int t) - { -+ struct addrinfo hints; -+ struct addrinfo *res; -+ int error; - #if (defined(WIN32) || defined(_WINDOWS)) && !defined(__CYGWIN__) -- struct hostent *hp; -- struct in_addr ina; -- -- if (inet_addr(hn) != (unsigned long) 0xFFFFFFFF) { -- /* Address is an IP address string, which is what we want. */ -- (void) Strncpy(dst, hn, dsize); -- return (0); -- } -- -- hp = gethostbyname(hn); -- if (hp != NULL) { -- (void) memcpy(&ina.s_addr, hp->h_addr_list[0], (size_t) hp->h_length); -- InetNtoA(dst, ((struct in_addr **) hp->h_addr_list)[0], dsize); -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_family = PF_UNSPEC; -+ hints.ai_socktype = SOCK_STREAM; -+ error = getaddrinfo(hn, NULL, &hints, &res); -+ -+ if (error == 0) { -+ char buf[NI_MAXHOST]; -+ -+ getnameinfo(res->ai_addr, res->ai_addrlen, -+ buf, sizeof(buf), -+ NULL, 0, NI_NUMERICHOST); -+ (void) Strncpy(dst, buf, dsize); -+ freeaddrinfo(res); - return (0); - } - - #else - int sj; - vsigproc_t osigpipe, osigint, osigalrm; -- struct hostent *hp; --#ifdef HAVE_INET_ATON -- struct in_addr ina; --#endif --#ifdef DNSSEC_LOCAL_VALIDATION -- val_status_t val_status; --#endif -- --#ifdef HAVE_INET_ATON -- if (inet_aton(hn, &ina) != 0) { -- /* Address is an IP address string, which is what we want. */ -- (void) Strncpy(dst, hn, dsize); -- return (0); -- } --#else -- if (inet_addr(hn) != (unsigned long) 0xFFFFFFFF) { -- /* Address is an IP address string, which is what we want. */ -- (void) Strncpy(dst, hn, dsize); -- return (0); -- } --#endif - - #ifdef HAVE_SIGSETJMP - osigpipe = osigint = osigalrm = (sigproc_t) 0; -@@ -731,30 +713,27 @@ - osigalrm = NcSignal(SIGALRM, CancelGetHostByName); - if (t > 0) - (void) alarm((unsigned int) t); --#ifndef DNSSEC_LOCAL_VALIDATION -- hp = gethostbyname(hn); --#else -- hp = val_gethostbyname(NULL, hn, &val_status); --#endif -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_flags = 0; -+ hints.ai_family = PF_UNSPEC; -+ hints.ai_socktype = SOCK_STREAM; -+ hints.ai_protocol = 0; -+ error = getaddrinfo(hn, NULL, &hints, &res); - if (t > 0) - (void) alarm(0); - (void) NcSignal(SIGPIPE, osigpipe); - (void) NcSignal(SIGINT, osigint); - (void) NcSignal(SIGALRM, osigalrm); --#ifdef DNSSEC_LOCAL_VALIDATION -- /* -- * It would be nice to pass a little more information back, -- * but that would mean an API change to MyGetHostByName. -- */ -- if ((hp != NULL) && ! val_istrusted(val_status)) { -- *dst = '\0'; -- return (-2); -- } --#endif -- if (hp != NULL) { -- InetNtoA(dst, ((struct in_addr **) hp->h_addr_list)[0], dsize); -- return (0); -- } -+ if (error == 0) { -+ char buf[NI_MAXHOST]; -+ -+ getnameinfo(res->ai_addr, res->ai_addrlen, -+ buf, sizeof(buf), -+ NULL, 0, NI_NUMERICHOST); -+ (void) Strncpy(dst, buf, dsize); -+ freeaddrinfo(res); -+ return (0); -+ } - } - #endif /* !Windows */ - -Index: ncftp3/sh_util/ncftpbatch.c -diff -u ncftp3/sh_util/ncftpbatch.c:1.1.1.20 ncftp3/sh_util/ncftpbatch.c:1.2 ---- ncftp3/sh_util/ncftpbatch.c:1.1.1.20 Thu Nov 5 16:20:41 2009 -+++ ncftp3/sh_util/ncftpbatch.c Mon Nov 9 21:51:14 2009 -@@ -1203,7 +1203,7 @@ - } - - if (gSourceAddrStr[0] != '\0') -- (void) AddrStrToAddr(gSourceAddrStr, &gConn.preferredLocalAddr, 21); -+ (void) AddrStrToAddr(gSourceAddrStr, (struct sockaddr *)&gConn.preferredLocalAddr, 21); - - gConn.connTimeout = 30; - gConn.ctrlTimeout = 135; -Index: ncftp3/sh_util/ncftpget.c -diff -u ncftp3/sh_util/ncftpget.c:1.1.1.19 ncftp3/sh_util/ncftpget.c:1.2 ---- ncftp3/sh_util/ncftpget.c:1.1.1.19 Thu Nov 5 16:20:41 2009 -+++ ncftp3/sh_util/ncftpget.c Mon Nov 9 21:51:14 2009 -@@ -371,7 +371,7 @@ - ftpcat = 2; - break; - case 'I': -- if (AddrStrToAddr(opt.arg, &fi.preferredLocalAddr, 21) < 0) { -+ if (AddrStrToAddr(opt.arg, (struct sockaddr *)&fi.preferredLocalAddr, 21) < 0) { - fprintf(stderr, "Bad IP address (\"%s\") used with -I.\n", opt.arg); - Usage(); - } -Index: ncftp3/sh_util/ncftpls.c -diff -u ncftp3/sh_util/ncftpls.c:1.1.1.16 ncftp3/sh_util/ncftpls.c:1.2 ---- ncftp3/sh_util/ncftpls.c:1.1.1.16 Thu Nov 5 16:20:41 2009 -+++ ncftp3/sh_util/ncftpls.c Mon Nov 9 21:51:14 2009 -@@ -489,7 +489,7 @@ - do_listings = 0; - break; - case 'I': -- if (AddrStrToAddr(opt.arg, &fi.preferredLocalAddr, 21) < 0) { -+ if (AddrStrToAddr(opt.arg, (struct sockaddr *)&fi.preferredLocalAddr, 21) < 0) { - fprintf(stderr, "Bad IP address (\"%s\") used with -I.\n", opt.arg); - Usage(); - } -Index: ncftp3/sh_util/ncftpput.c -diff -u ncftp3/sh_util/ncftpput.c:1.1.1.18 ncftp3/sh_util/ncftpput.c:1.2 ---- ncftp3/sh_util/ncftpput.c:1.1.1.18 Thu Nov 5 16:20:41 2009 -+++ ncftp3/sh_util/ncftpput.c Mon Nov 9 21:51:14 2009 -@@ -388,7 +388,7 @@ - STRNCAT(postcmd, "\n"); - break; - case 'I': -- if (AddrStrToAddr(opt.arg, &fi.preferredLocalAddr, 21) < 0) { -+ if (AddrStrToAddr(opt.arg, (struct sockaddr *)&fi.preferredLocalAddr, 21) < 0) { - fprintf(stderr, "Bad IP address (\"%s\") used with -I.\n", opt.arg); - Usage(); - } -Index: ncftp3/sh_util/syshdrs.h -diff -u ncftp3/sh_util/syshdrs.h:1.1.1.11 ncftp3/sh_util/syshdrs.h:1.11 ---- ncftp3/sh_util/syshdrs.h:1.1.1.11 Thu Nov 5 16:20:41 2009 -+++ ncftp3/sh_util/syshdrs.h Thu Nov 5 16:47:09 2009 -@@ -33,6 +33,9 @@ - # define _WIN32_WINNT 0x0400 - # endif - # include /* includes if _WIN32_WINNT >= 0x400 */ -+#ifdef ENABLE_IPV6 -+# include -+#endif /* ENABLE_IPV6 */ - # include - # include - # include -@@ -167,6 +170,9 @@ - # include - # include - # include -+# ifndef HAVE_GETADDRINFO -+# include "addrinfo.h" -+# endif - # ifdef HAVE_LOCALE_H - # include - # endif -Index: ncftp3/sio/SAccept.c -diff -u ncftp3/sio/SAccept.c:1.1.1.1 ncftp3/sio/SAccept.c:1.4 ---- ncftp3/sio/SAccept.c:1.1.1.1 Thu Jan 8 19:51:19 2004 -+++ ncftp3/sio/SAccept.c Wed Aug 25 21:33:11 2004 -@@ -3,8 +3,20 @@ - # pragma hdrstop - #endif - -+#ifndef HAVE_SOCKADDR_SA_LEN -+#ifndef SA_LEN -+#ifdef ENABLE_IPV6 -+#define SA_LEN(x) (((x)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) \ -+ : (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) \ -+ : -1)) -+#else /* ENABLE_IPV6 */ -+#define SA_LEN(x) (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : -1) -+#endif /* ENABLE_IPV6 */ -+#endif /* SA_LEN */ -+#endif /* HAVE_SOCKADDR_SA_LEN */ -+ - int --SAccept(int sfd, struct sockaddr_in *const addr, int tlen) -+SAccept(int sfd, struct sockaddr *const addr, int tlen) - { - int result; - fd_set ss; -@@ -22,7 +34,7 @@ - if (tlen <= 0) { - errno = 0; - for (;;) { -- size = (sockaddr_size_t) sizeof(struct sockaddr_in); -+ size = (sockaddr_size_t) sizeof(struct sockaddr_storage); - result = accept(sfd, (struct sockaddr *) addr, &size); - if ((result >= 0) || (errno != EINTR)) { - RESTORE_SIGPIPE -@@ -61,7 +73,7 @@ - } - - do { -- size = (sockaddr_size_t) sizeof(struct sockaddr_in); -+ size = (sockaddr_size_t) sizeof(struct sockaddr_storage); - result = accept(sfd, (struct sockaddr *) addr, &size); - } while ((result < 0) && (errno == EINTR)); - -Index: ncftp3/sio/SConnect.c -diff -u ncftp3/sio/SConnect.c:1.1.1.10 ncftp3/sio/SConnect.c:1.18 ---- ncftp3/sio/SConnect.c:1.1.1.10 Thu Nov 5 16:20:41 2009 -+++ ncftp3/sio/SConnect.c Thu Nov 5 16:47:09 2009 -@@ -3,14 +3,30 @@ - # pragma hdrstop - #endif - --int _SConnect(const int sfd, const struct sockaddr_in *const addr, const size_t saddrsiz, const int tlen); -+int _SConnect(const int sfd, const struct sockaddr *const addr, const size_t saddrsiz, const int tlen); -+ -+#ifndef HAVE_SOCKADDR_SA_LEN -+#ifndef SA_LEN -+#ifdef ENABLE_IPV6 -+#define SA_LEN(x) (((x)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) \ -+ : (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) \ -+ : -1)) -+#else /* ENABLE_IPV6 */ -+#define SA_LEN(x) (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : -1) -+#endif /* ENABLE_IPV6 */ -+#endif /* SA_LEN */ -+#endif /* HAVE_SOCKADDR_SA_LEN */ - - int --SConnect(int sfd, const struct sockaddr_in *const addr, int tlen) -+SConnect(int sfd, const struct sockaddr *const addr, int tlen) - { - int result; - -- result = _SConnect(sfd, addr, (size_t) sizeof(struct sockaddr_in), tlen); -+#ifdef HAVE_SOCKADDR_SA_LEN -+ result = _SConnect(sfd, addr, addr->sa_len, tlen); -+#else -+ result = _SConnect(sfd, addr, SA_LEN(addr), tlen); -+#endif - return (result); - } /* SConnect */ - -@@ -54,7 +70,7 @@ - - - int --_SConnect(const int sfd, const struct sockaddr_in *const addr, const size_t saddrsiz, const int tlen) -+_SConnect(const int sfd, const struct sockaddr *const addr, const size_t saddrsiz, const int tlen) - { - fd_set ss, xx; - struct timeval tv; -Index: ncftp3/sio/SConnectByName.c -diff -u ncftp3/sio/SConnectByName.c:1.1.1.3 ncftp3/sio/SConnectByName.c:1.3 ---- ncftp3/sio/SConnectByName.c:1.1.1.3 Thu Jan 8 19:51:16 2004 -+++ ncftp3/sio/SConnectByName.c Thu Jan 8 20:09:33 2004 -@@ -7,15 +7,15 @@ - SConnectByName(int sfd, const char * const addrStr, const int tlen) - { - int result; -- struct sockaddr_in remoteAddr; -+ struct sockaddr_storage remoteAddr; - - if (addrStr == NULL) { - errno = EINVAL; - return (-1); - } - -- if ((result = AddrStrToAddr(addrStr, &remoteAddr, -1)) == 0) { -- result = SConnect(sfd, &remoteAddr, tlen); -+ if ((result = AddrStrToAddr(addrStr, (struct sockaddr *)&remoteAddr, -1)) == 0) { -+ result = SConnect(sfd, (struct sockaddr *)&remoteAddr, tlen); - } - return (result); - } /* SConnectByName */ -Index: ncftp3/sio/SRecvfrom.c -diff -u ncftp3/sio/SRecvfrom.c:1.1.1.5 ncftp3/sio/SRecvfrom.c:1.4 ---- ncftp3/sio/SRecvfrom.c:1.1.1.5 Thu Jan 8 19:51:18 2004 -+++ ncftp3/sio/SRecvfrom.c Thu Jan 8 20:09:33 2004 -@@ -4,7 +4,7 @@ - #endif - - int --SRecvfrom(int sfd, char *const buf, size_t size, int fl, struct sockaddr_in *const fromAddr, int tlen) -+SRecvfrom(int sfd, char *const buf, size_t size, int fl, struct sockaddr *const fromAddr, int tlen) - { - recv_return_t nread; - int tleft; -@@ -56,7 +56,7 @@ - - IGNORE_SIGPIPE - nread = recvfrom(sfd, buf, (recv_size_t) size, fl, -- (struct sockaddr *) fromAddr, &alen); -+ fromAddr, &alen); - RESTORE_SIGPIPE - - if (nread >= 0) -Index: ncftp3/sio/SSendto.c -diff -u ncftp3/sio/SSendto.c:1.1.1.5 ncftp3/sio/SSendto.c:1.5 ---- ncftp3/sio/SSendto.c:1.1.1.5 Thu Jan 8 19:51:18 2004 -+++ ncftp3/sio/SSendto.c Thu Jan 8 20:09:33 2004 -@@ -3,8 +3,21 @@ - # pragma hdrstop - #endif - -+#ifndef HAVE_SOCKADDR_SA_LEN -+#ifndef SA_LEN -+#ifdef ENABLE_IPV6 -+#define SA_LEN(x) (((x)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) \ -+ : (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) \ -+ : -1)) -+#else /* ENABLE_IPV6 */ -+#define SA_LEN(x) (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : -1) -+#endif /* ENABLE_IPV6 */ -+#endif /* SA_LEN */ -+#endif /* HAVE_SOCKADDR_SA_LEN */ -+ -+ - int --SSendto(int sfd, const char *const buf, size_t size, int fl, const struct sockaddr_in *const toAddr, int tlen) -+SSendto(int sfd, const char *const buf, size_t size, int fl, const struct sockaddr *const toAddr, int tlen) - { - send_return_t nwrote; - int tleft; -@@ -58,9 +71,15 @@ - } - - IGNORE_SIGPIPE -+#ifdef HAVE_SOCKADDR_SA_LEN -+ nwrote = sendto(sfd, buf, (send_size_t) size, fl, -+ toAddr, -+ toAddr->sa_len); -+#else - nwrote = sendto(sfd, buf, (send_size_t) size, fl, -- (const struct sockaddr *) toAddr, -- (sockaddr_size_t) sizeof(struct sockaddr_in)); -+ toAddr, -+ SA_LEN(toAddr)); -+#endif - RESTORE_SIGPIPE - - if (nwrote >= 0) -@@ -77,7 +96,7 @@ - - - int --Sendto(int sfd, const char *const buf, size_t size, const struct sockaddr_in *const toAddr) -+Sendto(int sfd, const char *const buf, size_t size, const struct sockaddr *toAddr) - { - int result; - DECL_SIGPIPE_VARS -@@ -89,9 +108,15 @@ - - IGNORE_SIGPIPE - do { -+#ifdef HAVE_SOCKADDR_SA_LEN -+ result = (int) sendto(sfd, buf, (send_size_t) size, 0, -+ toAddr, -+ toAddr->sa_len); -+#else - result = (int) sendto(sfd, buf, (send_size_t) size, 0, -- (const struct sockaddr *) toAddr, -- (sockaddr_size_t) sizeof(struct sockaddr_in)); -+ toAddr, -+ SA_LEN(toAddr)); -+#endif - } while ((result < 0) && (errno == EINTR)); - RESTORE_SIGPIPE - return (result); -Index: ncftp3/sio/SSendtoByName.c -diff -u ncftp3/sio/SSendtoByName.c:1.1.1.5 ncftp3/sio/SSendtoByName.c:1.4 ---- ncftp3/sio/SSendtoByName.c:1.1.1.5 Thu Jan 8 19:51:18 2004 -+++ ncftp3/sio/SSendtoByName.c Thu Jan 8 20:09:33 2004 -@@ -11,7 +11,7 @@ - time_t done, now; - fd_set ss; - struct timeval tv; -- struct sockaddr_in toAddr; -+ struct sockaddr_storage toAddr; - DECL_SIGPIPE_VARS - - if ((buf == NULL) || (size == 0) || (toAddrStr == NULL) || (toAddrStr[0] == '\0') || (tlen <= 0)) { -@@ -19,7 +19,7 @@ - return (-1); - } - -- if ((result = AddrStrToAddr(toAddrStr, &toAddr, -1)) < 0) { -+ if ((result = AddrStrToAddr(toAddrStr, (struct sockaddr *)&toAddr, -1)) < 0) { - return (result); - } - -@@ -81,7 +81,7 @@ - SendtoByName(int sfd, const char *const buf, size_t size, const char *const toAddrStr) - { - int result; -- struct sockaddr_in toAddr; -+ struct sockaddr_storage toAddr; - DECL_SIGPIPE_VARS - - if ((buf == NULL) || (size == 0) || (toAddrStr == NULL)) { -@@ -89,8 +89,7 @@ - return (-1); - } - -- -- if ((result = AddrStrToAddr(toAddrStr, &toAddr, -1)) < 0) { -+ if ((result = AddrStrToAddr(toAddrStr, (struct sockaddr *)&toAddr, -1)) < 0) { - return (result); - } - ---- ncftp-3.2.5/sio/StrAddr.c.orig 2009-10-24 01:31:23.000000000 +0200 -+++ ncftp-3.2.5/sio/StrAddr.c 2011-03-27 15:42:56.665738111 +0200 -@@ -6,6 +6,19 @@ - # pragma hdrstop - #endif - -+#ifndef HAVE_SOCKADDR_SA_LEN -+#ifndef SA_LEN -+#ifdef ENABLE_IPV6 -+#define SA_LEN(x) (((x)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) \ -+ : (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) \ -+ : -1)) -+#else /* ENABLE_IPV6 */ -+#define SA_LEN(x) (((x)->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : -1) -+#endif /* ENABLE_IPV6 */ -+#endif /* SA_LEN */ -+#endif /* HAVE_SOCKADDR_SA_LEN */ -+ -+ - #ifndef INADDR_ANY - # define INADDR_ANY ((unsigned long int) 0x00000000) - #endif -@@ -25,14 +38,10 @@ - { - char str[64]; - char *cp; --#if defined(HAVE_GETSERVBYNAME_R) && (defined(AIX) || defined(TRU64UNIX) || defined(DIGITAL_UNIX)) -- struct servent *sp; --#elif defined(HAVE_GETSERVBYNAME_R) && (defined(LINUX) || defined(SOLARIS) || defined(IRIX) || defined(BSDOS)) -- struct servent se, *sp; -- char spbuf[256]; --#else -- struct servent *sp; --#endif -+ struct addrinfo hints, *res; -+ int error; -+ unsigned int port; -+ - strncpy(str, s, sizeof(str) - 1); - str[sizeof(str) - 1] = '\0'; - cp = str; -@@ -49,55 +58,29 @@ - } - *cp = '\0'; - -- sp = NULL; --#if defined(HAVE_GETSERVBYNAME_R) && (defined(SOLARIS) || defined(IRIX) || defined(BSDOS)) -- if ((sp == NULL) && ((proto == 0) || (proto == 't'))) { -- memset(spbuf, 0, sizeof(spbuf)); -- sp = getservbyname_r(str, "tcp", &se, spbuf, sizeof(spbuf)); -- } -- if ((sp == NULL) && ((proto == 0) || (proto == 'u'))) { -- memset(spbuf, 0, sizeof(spbuf)); -- sp = getservbyname_r(str, "udp", &se, spbuf, sizeof(spbuf)); -- } --#elif defined(HAVE_GETSERVBYNAME_R) && defined(LINUX) -- if ((sp == NULL) && ((proto == 0) || (proto == 't'))) { -- memset(spbuf, 0, sizeof(spbuf)); -- if (getservbyname_r(str, "tcp", &se, spbuf, sizeof(spbuf), &sp) != 0) -- sp = NULL; -- } -- if ((sp == NULL) && ((proto == 0) || (proto == 'u'))) { -- memset(spbuf, 0, sizeof(spbuf)); -- if (getservbyname_r(str, "udp", &se, spbuf, sizeof(spbuf), &sp) != 0) -- sp = NULL; -- } --#elif defined(HAVE_GETSERVBYNAME_R) && defined(AIX) -- { -- struct servent_data sed; -- if ((sp == NULL) && ((proto == 0) || (proto == 't'))) { -- memset(&sed, 0, sizeof(sed)); -- if (getservbyname_r(str, "tcp", sp, &sed) != 0) -- sp = NULL; -- } -- if ((sp == NULL) && ((proto == 0) || (proto == 'u'))) { -- memset(&sed, 0, sizeof(sed)); -- if (getservbyname_r(str, "udp", sp, &sed) != 0) -- sp = NULL; -- } -- } --#else -- /* Note: getservbyname is already threadsafe on: HP-UX, Tru64 */ -- if ((sp == NULL) && ((proto == 0) || (proto == 't'))) { -- sp = getservbyname(str, "tcp"); -- } -- if ((sp == NULL) && ((proto == 0) || (proto == 'u'))) { -- sp = getservbyname(str, "udp"); -- } --#endif -- -- if (sp != NULL) { -- return ((unsigned int) ntohs((unsigned short) sp->s_port)); -+ error = 1; -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_family = PF_UNSPEC; -+ if ((error != 0) && ((proto == 0) || (proto == 't'))) { -+ hints.ai_socktype = SOCK_STREAM; -+ error = getaddrinfo(NULL, str, &hints, &res); -+ } -+ if ((error != 0) && ((proto == 0) || (proto == 'u'))) { -+ hints.ai_socktype = SOCK_DGRAM; -+ error = getaddrinfo(NULL, str, &hints, &res); -+ } -+ if (error != 0) { -+ return (0); /* error */ -+ } -+ if (res->ai_addr->sa_family == AF_INET) { -+ port = ((struct sockaddr_in *)res->ai_addr)->sin_port; -+ } else if (res->ai_addr->sa_family == AF_INET6) { -+ port = ((struct sockaddr_in6 *)res->ai_addr)->sin6_port; -+ } else { -+ port = 0; /* error */ - } -- return (0); /* error */ -+ freeaddrinfo(res); -+ return ((unsigned int) ntohs((unsigned short) port)); - } /* ServiceNameToPortNumber */ - - -@@ -203,15 +186,13 @@ - - - int --AddrStrToAddr(const char * const s, struct sockaddr_in * const sa, const int defaultport) -+AddrStrToAddr(const char * const s, struct sockaddr * const sa, const int defaultport) - { -- char portstr[128]; -- unsigned int ipnum; -- unsigned int port; -- struct hostent *hp; -- char *hostcp, *atsign, *colon, *cp, *p2; -+ char portstr[128], portstr2[128]; -+ struct addrinfo hints, *res; -+ char *hostcp, *atsign, *colon, *cp, *p2, *portp; -+ int error; - -- memset(sa, 0, sizeof(struct sockaddr_in)); - strncpy(portstr, s, sizeof(portstr)); - portstr[sizeof(portstr) - 1] = '\0'; - -@@ -219,7 +200,6 @@ - /* Does it look like a URL? http://host ? */ - if ((colon[1] == '/') && (colon[2] == '/')) { - *colon = '\0'; -- port = 0; - hostcp = colon + 3; - for (cp = hostcp; *cp != '\0'; cp++) { - if ((!ISALNUM(*cp)) && (*cp != '.')) { -@@ -230,29 +210,27 @@ - while (isdigit((int) *cp)) - cp++; - *cp = '\0'; -- port = atoi(p2); - } - *cp = '\0'; - break; - } - } -- if (port == 0) -- port = ServiceNameToPortNumber(portstr, 0); - } else { - /* Look for host.name.domain:port */ - *colon = '\0'; - hostcp = portstr; -- port = (unsigned int) atoi(colon + 1); - } -+ portp = portstr; - } else if ((atsign = strchr(portstr, '@')) != NULL) { - /* Look for port@host.name.domain */ - *atsign = '\0'; - hostcp = atsign + 1; -- port = (unsigned int) atoi(portstr); -+ portp = portstr; - } else if (defaultport > 0) { - /* Have just host.name.domain, use that w/ default port. */ -- port = (unsigned int) defaultport; -+ sprintf(portstr2, "%d", defaultport); - hostcp = portstr; -+ portp = portstr2; - } else { - /* If defaultport <= 0, they must supply a port number - * in the host/port string. -@@ -260,33 +238,14 @@ - errno = EADDRNOTAVAIL; - return (kAddrStrToAddrMiscErr); - } -- -- sa->sin_port = htons((short) port); -- -- ipnum = inet_addr(hostcp); -- if (ipnum != INADDR_NONE) { -- sa->sin_family = AF_INET; -- sa->sin_addr.s_addr = ipnum; -- } else { --#ifdef DNSSEC_LOCAL_VALIDATION -- val_status_t val_status; -- errno = 0; -- hp = val_gethostbyname(NULL,hostcp,&val_status); -- if ((hp != NULL) && (!val_istrusted(val_status))) -- hp = NULL; --#else -- errno = 0; -- hp = gethostbyname(hostcp); --#endif -- if (hp == NULL) { -- if (errno == 0) -- errno = ENOENT; -- return (kAddrStrToAddrBadHost); -- } -- sa->sin_family = hp->h_addrtype; -- memcpy(&sa->sin_addr.s_addr, hp->h_addr_list[0], -- (size_t) hp->h_length); -- } -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_family = PF_UNSPEC; -+ hints.ai_socktype = SOCK_STREAM; -+ error = getaddrinfo(hostcp, portp, &hints, &res); -+ if (error != 0) -+ return (kAddrStrToAddrBadHost); -+ memcpy(sa, res->ai_addr, res->ai_addrlen); -+ freeaddrinfo(res); - return (0); - } /* AddrStrToAddr */ - -@@ -294,12 +253,12 @@ - - - char * --AddrToAddrStr(char *const dst, size_t dsize, struct sockaddr_in * const saddrp, int dns, const char *fmt) -+AddrToAddrStr(char *const dst, size_t dsize, struct sockaddr * const saddrp, int dns, const char *fmt) - { - char addrName[128]; - char *addrNamePtr; -- struct hostent *hp; -- char str[128]; -+ char portName[128]; -+ char portNum[128]; - char s_name[64]; - char *dlim, *dp; - const char *cp; -@@ -308,26 +267,25 @@ - return NULL; - memset(dst, 0, dsize); - -- addrNamePtr = NULL; -- if (dns == 0) { -- InetNtoA(addrName, &saddrp->sin_addr, sizeof(addrName)); -- addrNamePtr = addrName; -- } else { --#ifdef DNSSEC_LOCAL_VALIDATION -- val_status_t val_status; -- hp = val_gethostbyaddr(NULL, (const char*)&saddrp->sin_addr, sizeof(struct in_addr), AF_INET, &val_status); -- if ((hp != NULL) && (!val_istrusted(val_status))) -- hp = NULL; -+ addrNamePtr = addrName; -+ if (dns == 0) -+ dns = NI_NUMERICHOST; -+ else -+ dns = 0; -+ getnameinfo(saddrp, -+#ifdef HAVE_SOCKADDR_SA_LEN -+ saddrp->sa_len, - #else -- hp = gethostbyaddr((gethost_addrptr_t) &saddrp->sin_addr, sizeof(struct in_addr), AF_INET); -+ SA_LEN(saddrp), - #endif -- if ((hp != NULL) && (hp->h_name != NULL) && (hp->h_name[0] != '\0')) { -- addrNamePtr = hp->h_name; -- } else { -- InetNtoA(addrName, &saddrp->sin_addr, sizeof(addrName)); -- addrNamePtr = addrName; -- } -- } -+ addrName, sizeof(addrName), portName, sizeof(portName), dns); -+ getnameinfo(saddrp, -+#ifdef HAVE_SOCKADDR_SA_LEN -+ saddrp->sa_len, -+#else -+ SA_LEN(saddrp), -+#endif -+ NULL, 0, portNum, sizeof(portNum), NI_NUMERICSERV); - if (fmt == NULL) - fmt = "%h:%p"; - for (dp = dst, dlim = dp + dsize - 1; ; fmt++) { -@@ -339,8 +297,7 @@ - if (dp < dlim) - *dp++ = '%'; - } else if (*fmt == 'p') { -- sprintf(str, "%u", (unsigned int) ntohs(saddrp->sin_port)); -- for (cp = str; *cp != '\0'; cp++) -+ for (cp = portNum; *cp != '\0'; cp++) - if (dp < dlim) - *dp++ = *cp; - *dp = '\0'; -@@ -355,16 +312,20 @@ - *dp++ = *cp; - *dp = '\0'; - } else if (*fmt == 's') { -- cp = s_name; -- (void) ServicePortNumberToName(ntohs(saddrp->sin_port), s_name, sizeof(s_name), 0); -- for ( ; *cp != '\0'; cp++) -+ for (cp = portName ; *cp != '\0'; cp++) - if (dp < dlim) - *dp++ = *cp; - /* endservent(); */ - *dp = '\0'; - } else if ((*fmt == 't') || (*fmt == 'u')) { - cp = s_name; -- (void) ServicePortNumberToName(ntohs(saddrp->sin_port), s_name, sizeof(s_name), (int) *fmt); -+ if (saddrp->sa_family == AF_INET) { -+ (void) ServicePortNumberToName(ntohs(((struct sockaddr_in *)saddrp)->sin_port), s_name, sizeof(s_name), (int) *fmt); -+ } else if (saddrp->sa_family == AF_INET6) { -+ (void) ServicePortNumberToName(ntohs(((struct sockaddr_in6 *)saddrp)->sin6_port), s_name, sizeof(s_name), (int) *fmt); -+ } else { -+ cp = '\0'; -+ } - for ( ; *cp != '\0'; cp++) - if (dp < dlim) - *dp++ = *cp; -@@ -391,16 +352,16 @@ - AddrStrToIPStr(char *const dst, size_t dsize, const char *const src, const int defaultport) - { - int rc; -- struct sockaddr_in sa; -+ struct sockaddr_storage ss; - - if (dsize == 0) - return NULL; - memset(dst, 0, dsize); - -- rc = AddrStrToAddr(src, &sa, (defaultport <= 0) ? 21 : defaultport); -+ rc = AddrStrToAddr(src, (struct sockaddr *)&ss, (defaultport <= 0) ? 21 : defaultport); - if (rc < 0) - return (NULL); - -- AddrToAddrStr(dst, dsize, &sa, 0, (defaultport <= 0) ? "%h" : "%h:%p"); -+ AddrToAddrStr(dst, dsize, (struct sockaddr *)&ss, 0, (defaultport <= 0) ? "%h" : "%h:%p"); - return (dst); - } /* AddrStrToIPStr */ -Index: ncftp3/sio/sio.h -diff -u ncftp3/sio/sio.h:1.1.1.10 ncftp3/sio/sio.h:1.14 ---- ncftp3/sio/sio.h:1.1.1.10 Mon Aug 11 15:38:23 2008 -+++ ncftp3/sio/sio.h Mon Aug 11 16:24:16 2008 -@@ -197,7 +197,7 @@ - int PWrite(int, const char *const, size_t); - - /* SAccept.c */ --int SAccept(int, struct sockaddr_in *const, int); -+int SAccept(int, struct sockaddr *const, int); - - /* SBind.c */ - int SBind(int, const int, const int, const int); -@@ -208,7 +208,7 @@ - int SClose(int, int); - - /* SConnect.c */ --int SConnect(int, const struct sockaddr_in *const, int); -+int SConnect(int, const struct sockaddr *const, int); - - /* SConnectByName.c */ - int SConnectByName(int, const char *const, const int); -@@ -232,7 +232,7 @@ - int SRecv(int, char *const, size_t, int, int, int); - - /* SRecvfrom.c */ --int SRecvfrom(int, char *const, size_t, int, struct sockaddr_in *const, int); -+int SRecvfrom(int, char *const, size_t, int, struct sockaddr *const, int); - - /* SRecvmsg.c */ - int SRecvmsg(int, void *const, int, int); -@@ -248,8 +248,8 @@ - int SSend(int, char *, size_t, int, int); - - /* SSendto.c */ --int SSendto(int, const char *const, size_t, int, const struct sockaddr_in *const, int); --int Sendto(int, const char *const, size_t, const struct sockaddr_in *const); -+int SSendto(int, const char *const, size_t, int, const struct sockaddr *const, int); -+int Sendto(int, const char *const, size_t, const struct sockaddr *const); - - /* SSendtoByName.c */ - int SSendtoByName(int, const char *const, size_t, int, const char *const, int); -@@ -280,8 +280,8 @@ - unsigned int ServiceNameToPortNumber(const char *const s, const int proto); - int ServicePortNumberToName(unsigned short port, char *const dst, const size_t dsize, const int proto); - void InetNtoA(char *dst, struct in_addr *ia, size_t siz); --int AddrStrToAddr(const char *const, struct sockaddr_in *const, const int); --char *AddrToAddrStr(char *const dst, size_t dsize, struct sockaddr_in * const saddrp, int dns, const char *fmt); -+int AddrStrToAddr(const char *const, struct sockaddr *const, const int); -+char *AddrToAddrStr(char *const dst, size_t dsize, struct sockaddr * const saddrp, int dns, const char *fmt); - char *AddrStrToIPStr(char *const dst, size_t dsize, const char *const src, const int defaultport); - - /* SError.c */ -Index: ncftp3/sio/syshdrs.h -diff -u ncftp3/sio/syshdrs.h:1.1.1.9 ncftp3/sio/syshdrs.h:1.10 ---- ncftp3/sio/syshdrs.h:1.1.1.9 Mon Aug 11 15:38:23 2008 -+++ ncftp3/sio/syshdrs.h Mon Aug 11 16:24:16 2008 -@@ -20,6 +20,9 @@ - # define WINVER 0x0400 - # define _WIN32_WINNT 0x0400 - # include /* includes if _WIN32_WINNT >= 0x400 */ -+#ifdef ENABLE_IPV6 -+# include -+#endif /* ENABLE_IPV6 */ - # include - # include - # include -Index: ncftp3/vis/syshdrs.h -diff -u ncftp3/vis/syshdrs.h:1.1.1.10 ncftp3/vis/syshdrs.h:1.7 ---- ncftp3/vis/syshdrs.h:1.1.1.10 Thu Nov 5 16:20:41 2009 -+++ ncftp3/vis/syshdrs.h Thu Nov 5 16:47:09 2009 -@@ -94,6 +94,9 @@ - #include - #include - #include -+#ifndef HAVE_GETADDRINFO -+# include "addrinfo.h" -+#endif - - #ifdef HAVE_LOCALE_H - # include diff --git a/ncftp.spec b/ncftp.spec index 58773df..8cbdfbc 100644 --- a/ncftp.spec +++ b/ncftp.spec @@ -1,29 +1,22 @@ -# NOTE: update kame patch to use val_getaddrinfo() when/if enabling DNSSEC verification Summary: Browser program for the File Transfer Protocol Summary(de.UTF-8): NcFTP - ein Textmodus FTP-Client Summary(es.UTF-8): Cliente FTP con una interface agradable Summary(pl.UTF-8): Zaawansowany klient FTP Summary(pt_BR.UTF-8): Cliente FTP com uma interface agradável Name: ncftp -Version: 3.2.5 -Release: 3 +Version: 3.2.6 +Release: 1 Epoch: 2 License: The Clarified Artistic License Group: Applications/Networking -Source0: ftp://ftp.ncftp.com/ncftp/%{name}-%{version}-src.tar.bz2 -# Source0-md5: b05c7a6d5269c04891f02f43d4312b30 +Source0: ftp://ftp.ncftp.com/ncftp/%{name}-%{version}-src.tar.xz +# Source0-md5: 42d0f896d69a4d603ec097546444245f Source1: %{name}.desktop Source2: %{name}.png Source3: ncftpbookmarks.1 -# not updated yet, replaced by patch4 -#Source4: ftp://ftp.kame.net/pub/kame/misc/ncftp-323-v6-20091109.diff.gz -## Source4-md5: 9120dcbb0fceacb5174d01024b0ba5a5 Patch0: %{name}-DESTDIR.patch Patch1: %{name}-shared.patch -Patch2: %{name}-ac25x.patch -Patch3: %{name}-home_etc.patch -Patch4: %{name}-kame-v6.patch -Patch5: %{name}-ac.patch +Patch2: %{name}-home_etc.patch URL: http://www.ncftp.com/ BuildRequires: autoconf >= 2.53 BuildRequires: ncurses-devel >= 5.0 @@ -57,19 +50,15 @@ automáticos, e muito mais. %prep %setup -q #gunzip -c %{SOURCE4} | patch -p1 -%patch4 -p1 %patch0 -p1 %patch1 -p1 %patch2 -p1 -%patch3 -p1 -%patch5 -p1 %build %{__autoconf} -I autoconf_local %{__autoheader} -I autoconf_local CPPFLAGS="%{rpmcppflags} -I/usr/include/ncurses" -%configure \ - --enable-ipv6 +%configure %{__make} @@ -100,7 +89,7 @@ rm -rf $RPM_BUILD_ROOT %files %defattr(644,root,root,755) -%doc README.txt README.v6 doc/{CHANGELOG,FIREWALLS_AND_PROXIES,LICENSE,READLINE,what_*}.txt +%doc README.txt doc/{CHANGELOG,FIREWALLS_AND_PROXIES,LICENSE,READLINE,what_*}.txt %attr(755,root,root) %{_bindir}/ncftp* %attr(755,root,root) %{_libdir}/libncftp.so.* %dir /var/spool/%{name}