[packages/ncftp] - up to 3.2.6; ipv6 is gone (not supported by upstream and by other projects)
arekm
arekm at pld-linux.org
Mon Apr 15 13:23:44 CEST 2019
commit 68a4b1e984510930b1d6a778cbcfb6d51c050727
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date: Mon Apr 15 13:23:19 2019 +0200
- up to 3.2.6; ipv6 is gone (not supported by upstream and by other projects)
ncftp-ac.patch | 57 -
ncftp-ac25x.patch | 26 -
ncftp-kame-v6.patch | 2977 ---------------------------------------------------
ncftp.spec | 25 +-
4 files changed, 7 insertions(+), 3078 deletions(-)
---
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}
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 at 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 <sys/types.h>
-+#include <sys/socket.h>
-+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 <sys/types.h>
-+#include <sys/socket.h>],
-+[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 <sys/types.h>
-+#include <sys/socket.h>],
-+[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 <sys/types.h>
-+#include <sys/param.h>
-+#include <sys/sysctl.h>
-+#include <sys/socket.h>
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
-+#include <arpa/nameser.h>
-+#include <netdb.h>
-+#include <resolv.h>
-+#include <string.h>
-+#include <stdlib.h>
-+#include <stddef.h>
-+#include <ctype.h>
-+#include <unistd.h>
-+
-+#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 <sys/types.h>
-+#include <sys/socket.h>
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
-+#include <arpa/nameser.h>
-+#include <netdb.h>
-+#include <resolv.h>
-+#include <string.h>
-+#include <stddef.h>
-+
-+#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 <windows.h> /* includes <winsock2.h> if _WIN32_WINNT >= 0x400 */
-+# ifdef ENABLE_IPV6
-+# include <ws2tcpip.h>
-+# define INET6_ADDRSTRLEN 46
-+# endif /* ENABLE_IPV6 */
- # include <shlobj.h>
- # include <io.h>
- # include <conio.h>
-@@ -164,6 +168,9 @@
- # include <resolv.h>
- # endif
-
-+# ifndef HAVE_GETADDRINFO
-+# include "addrinfo.h"
-+# endif
- # ifdef CAN_USE_SYS_SELECT_H
- # include <sys/select.h>
- # 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 <windows.h> /* includes <winsock2.h> if _WIN32_WINNT >= 0x400 */
-+#ifdef ENABLE_IPV6
-+# include <ws2tcpip.h>
-+#endif /* ENABLE_IPV6 */
- # include <shlobj.h>
- # include <process.h>
- # include <direct.h>
-@@ -174,6 +177,9 @@
- # include <time.h>
- # include <pwd.h>
- # include <fcntl.h>
-+# ifndef HAVE_GETADDRINFO
-+# include "addrinfo.h"
-+# endif
- # if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H)
- # include <sys/ioctl.h>
- # include <termios.h>
---- 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 <windows.h> /* includes <winsock2.h> if _WIN32_WINNT >= 0x400 */
-+#ifdef ENABLE_IPV6
-+# include <ws2tcpip.h>
-+#endif /* ENABLE_IPV6 */
- # include <shlobj.h>
- # include <tchar.h>
- # include <process.h>
-@@ -167,6 +170,9 @@
- # include <pwd.h>
- # include <fcntl.h>
- # include <dirent.h>
-+# ifndef HAVE_GETADDRINFO
-+# include "addrinfo.h"
-+# endif
- # ifdef HAVE_LOCALE_H
- # include <locale.h>
- # 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 at 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 <windows.h> /* includes <winsock2.h> if _WIN32_WINNT >= 0x400 */
-+#ifdef ENABLE_IPV6
-+# include <ws2tcpip.h>
-+#endif /* ENABLE_IPV6 */
- # include <io.h>
- # include <errno.h>
- # include <stdio.h>
-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 <time.h>
- #include <pwd.h>
- #include <fcntl.h>
-+#ifndef HAVE_GETADDRINFO
-+# include "addrinfo.h"
-+#endif
-
- #ifdef HAVE_LOCALE_H
- # include <locale.h>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/ncftp.git/commitdiff/68a4b1e984510930b1d6a778cbcfb6d51c050727
More information about the pld-cvs-commit
mailing list