Vendor branch: Upgrade from CVS (7 JUN 2014) to release (20151004) vendor/TNFTP
authorJohn Marino <draco@marino.st>
Wed, 4 Nov 2015 16:54:26 +0000 (17:54 +0100)
committerJohn Marino <draco@marino.st>
Wed, 4 Nov 2015 18:12:29 +0000 (19:12 +0100)
Since 2006, DragonFly has synced with NetBSD's TNFTP program using CVS.
This isn't necessary; NetBSD actually publishes releases.  Let's move
over to the release tarballs from this point forward.

The file hierarchy changes as a result; the sources files in the tarball
are located in the "src" subdirectory.

21 files changed:
contrib/tnftp/COPYING [new file with mode: 0644]
contrib/tnftp/NEWS [new file with mode: 0644]
contrib/tnftp/README [new file with mode: 0644]
contrib/tnftp/src/cmds.c [moved from contrib/tnftp/cmds.c with 99% similarity]
contrib/tnftp/src/cmdtab.c [moved from contrib/tnftp/cmdtab.c with 98% similarity]
contrib/tnftp/src/complete.c [moved from contrib/tnftp/complete.c with 97% similarity]
contrib/tnftp/src/domacro.c [moved from contrib/tnftp/domacro.c with 93% similarity]
contrib/tnftp/src/extern.h [moved from contrib/tnftp/extern.h with 98% similarity]
contrib/tnftp/src/fetch.c [moved from contrib/tnftp/fetch.c with 98% similarity]
contrib/tnftp/src/ftp.1 [moved from contrib/tnftp/ftp.1 with 99% similarity]
contrib/tnftp/src/ftp.c [moved from contrib/tnftp/ftp.c with 99% similarity]
contrib/tnftp/src/ftp_var.h [moved from contrib/tnftp/ftp_var.h with 98% similarity]
contrib/tnftp/src/main.c [moved from contrib/tnftp/main.c with 97% similarity]
contrib/tnftp/src/progressbar.c [moved from contrib/tnftp/progressbar.c with 94% similarity]
contrib/tnftp/src/progressbar.h [moved from contrib/tnftp/progressbar.h with 88% similarity]
contrib/tnftp/src/ruserpass.c [moved from contrib/tnftp/ruserpass.c with 96% similarity]
contrib/tnftp/src/ssl.c [moved from contrib/tnftp/ssl.c with 96% similarity]
contrib/tnftp/src/ssl.h [moved from contrib/tnftp/ssl.h with 93% similarity]
contrib/tnftp/src/util.c [moved from contrib/tnftp/util.c with 94% similarity]
contrib/tnftp/src/version.h [moved from contrib/tnftp/version.h with 87% similarity]
contrib/tnftp/tnftp.h [new file with mode: 0644]

diff --git a/contrib/tnftp/COPYING b/contrib/tnftp/COPYING
new file mode 100644 (file)
index 0000000..064be2d
--- /dev/null
@@ -0,0 +1,59 @@
+$NetBSD: COPYING,v 1.7 2010/01/12 07:01:01 lukem Exp $
+
+Copyright (c) 2001-2010 The NetBSD Foundation, Inc.
+All rights reserved.
+
+This code is derived from software contributed to The NetBSD Foundation
+by Simon Burge, Luke Mewburn, and Christos Zoulas.
+
+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. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+       This product includes software developed by the NetBSD
+       Foundation, Inc. and its contributors.
+4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+
+
+This product also contains software developed by other people, and you
+are advised to read the various source files to read the full details
+of the other licenses. Those licenses also require the following
+acknowledgements:
+
+       This product includes software developed by the NetBSD Foundation,
+       Inc.  and its contributors. Those contributors include:
+               - Simon Burge
+               - Jaromir Dolecek
+               - Klaus Klein
+               - Luke Mewburn
+               - Jason R. Thorpe of the Numerical Aerospace Simulation
+                 Facility, NASA Ames Research Center.
+               - Christos Zoulas
+
+       This product includes software developed by the University of
+       California, Berkeley and its contributors. Those contributors include:
+               - Christos Zoulas of Cornell University.
+               - Guido van Rossum.
+
+       This product includes software developed by Christos Zoulas.
+
diff --git a/contrib/tnftp/NEWS b/contrib/tnftp/NEWS
new file mode 100644 (file)
index 0000000..f9a16d6
--- /dev/null
@@ -0,0 +1,73 @@
+$NetBSD: NEWS,v 1.12 2015/10/04 06:20:58 lukem Exp $
+
+This is tnftp version 20151004.
+
+Changes in tnftp 20141104 to 20151004:
+
+       Implement '-x xferbufsize' to set xferbuf size.
+
+       Add Server Name Indication (SNI) support for https.
+
+       Increase buffer limit used for response handling.
+
+Changes in tnftp from 20141031 to 20141104:
+
+       Portability fixes.
+
+Changes in tnftp from 20130505 to 20141031:
+
+       Ignore special character behaviour in filenames not provided
+       by the user.
+       Fixes CVE-2014-8517.
+
+       Fix timeout on HTTP fetches.
+
+Changes in tnftp from 20100108 to 20130505:
+
+       Support https:// fetch if OpenSSL is available and enabled.
+
+       Allow -R to restart non-existent ftp:// URIs.
+
+       Parse HTTP 'Date' entries in the `C' locale rather than the user's.
+
+       When using the response to SYST to decide whether to default
+       to 'binary' be a lot less specific.
+
+       Portability fixes.
+
+Changes in tnftp from 20091122 to 20100108:
+
+       Portability fixes.
+
+Changes in tnftp from 20090606 to 20091122:
+
+       Portability fixes.
+
+Changes in tnftp from 20090520 to 20090606:
+
+       Portability fixes.
+
+Changes in tnftp from 20070806 to 20090520:
+
+       Fix intermittent "Alarm clock" error.
+
+       Add epsv6 and epsv to disable extended passive mode for IPv6 or
+       both IPv4 and IPv6 respectively.
+
+       Improve parsing of HTTP chunked transfers per RFC2616.
+
+       Use the service name to getaddrinfo() (along with the host name),
+       so that features such as DNS Service Discovery will work.
+
+       Fix various compiler warnings.
+
+Changes in tnftp from 20050625 to 20070806:
+
+       Implement '-s srcaddr' to set the local IP address for
+       all connections.
+
+       Support '-q quittime' when waiting for server replies.
+
+       Use IEC 60027-2 "KiB", "MiB" (etc) instead of "KB", "MB", ...
+
+       Portability fixes, including for FreeBSD, Mac OS X, and Solaris.
diff --git a/contrib/tnftp/README b/contrib/tnftp/README
new file mode 100644 (file)
index 0000000..2f81da6
--- /dev/null
@@ -0,0 +1,68 @@
+WHAT IS TNFTP?
+--------------
+
+`tnftp' is a `port' of the NetBSD FTP client to other systems.
+See http://www.NetBSD.org/ for more details about NetBSD.
+
+tnftp was formerly known as `lukemftp'
+It was renamed to `tnftp' by Luke Mewburn in February 2003.
+
+The enhancements over the standard ftp client in 4.4BSD (and
+derivatives) include:
+       * command-line editing within ftp
+       * command-line fetching of URLS, including support for:
+           - http proxies (see $http_proxy, $ftp_proxy)
+           - authentication
+       * configurable prompt
+       * context sensitive command and filename completion
+       * dynamic progress bar
+       * feature negotiation extensions from RFC 2389
+         (see `feat' and `remopts')
+       * extensions to ftp from the IETF ftpext working group
+         (see `mlsd' and `mlst')
+       * IPv6 support (from the WIDE project)
+       * modification time preservation
+       * paging of local and remote files, and of directory listings
+         (see `lpage', `page', `pdir')
+       * passive mode support, with fallback to active mode
+       * retrieval of filenames listed in a given file (see `fget')
+       * `set option' override of ftp environment variables
+       * TIS Firewall Toolkit gate ftp proxy support (see `gate')
+       * transfer-rate throttling (see `-T', `rate')
+       * uploading of files on the command line (see `-u')
+       * (Dante) SOCKS5 support
+
+Previous features, currently disabled until a test system is available:
+       * SOCKS4 support
+
+
+INSTALLATION
+------------
+
+Refer to `INSTALL' for more information on how to compile and install tnftp.
+
+
+FEEDBACK / BUG REPORTS
+----------------------
+
+Please email feedback back to the maintainer:
+       Luke Mewburn <lukem@NetBSD.org>.
+
+
+COPYRIGHT
+---------
+
+tnftp is covered by a BSD-style copyright notice.
+Please refer to the file `COPYING' for more information.
+
+
+AVAILABILITY
+------------
+
+The primary ftp site for tnftp is:
+       ftp://ftp.NetBSD.org/pub/NetBSD/misc/tnftp/
+
+
+DOCUMENT REFERENCE
+------------------
+$NetBSD: README,v 1.10 2007/08/06 01:58:57 lukem Exp $
similarity index 99%
rename from contrib/tnftp/cmds.c
rename to contrib/tnftp/src/cmds.c
index 66cab2b..a8e33bd 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: cmds.c,v 1.135 2012/12/22 16:57:09 christos Exp $      */
+/*     $NetBSD: cmds.c,v 1.18 2013/05/05 11:17:30 lukem Exp $  */
+/*     from    NetBSD: cmds.c,v 1.135 2012/12/22 16:57:09 christos Exp */
 
 /*-
  * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
  * SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)cmds.c     8.6 (Berkeley) 10/9/94";
 #else
-__RCSID("$NetBSD: cmds.c,v 1.135 2012/12/22 16:57:09 christos Exp $");
+__RCSID(" NetBSD: cmds.c,v 1.135 2012/12/22 16:57:09 christos Exp  ");
 #endif
 #endif /* not lint */
 
@@ -123,6 +128,8 @@ __RCSID("$NetBSD: cmds.c,v 1.135 2012/12/22 16:57:09 christos Exp $");
 #include <time.h>
 #include <unistd.h>
 
+#endif /* tnftp */
+
 #include "ftp_var.h"
 #include "version.h"
 
similarity index 98%
rename from contrib/tnftp/cmdtab.c
rename to contrib/tnftp/src/cmdtab.c
index 13d3f4b..5a51bd4 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: cmdtab.c,v 1.52 2012/12/22 16:57:09 christos Exp $     */
+/*     $NetBSD: cmdtab.c,v 1.12 2013/05/05 11:17:30 lukem Exp $        */
+/*     from    NetBSD: cmdtab.c,v 1.52 2012/12/22 16:57:09 christos Exp        */
 
 /*-
  * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
  * SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)cmdtab.c   8.4 (Berkeley) 10/9/94";
 #else
-__RCSID("$NetBSD: cmdtab.c,v 1.52 2012/12/22 16:57:09 christos Exp $");
+__RCSID(" NetBSD: cmdtab.c,v 1.52 2012/12/22 16:57:09 christos Exp  ");
 #endif
 #endif /* not lint */
 
 #include <stdio.h>
+
+#endif /* tnftp */
+
 #include "ftp_var.h"
 
 /*
similarity index 97%
rename from contrib/tnftp/complete.c
rename to contrib/tnftp/src/complete.c
index 617af07..df75d3a 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: complete.c,v 1.46 2009/04/12 10:18:52 lukem Exp $      */
+/*     $NetBSD: complete.c,v 1.10 2009/05/20 12:53:47 lukem Exp $      */
+/*     from    NetBSD: complete.c,v 1.46 2009/04/12 10:18:52 lukem Exp */
 
 /*-
  * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: complete.c,v 1.46 2009/04/12 10:18:52 lukem Exp $");
+__RCSID(" NetBSD: complete.c,v 1.46 2009/04/12 10:18:52 lukem Exp  ");
 #endif /* not lint */
 
 /*
@@ -47,6 +52,8 @@ __RCSID("$NetBSD: complete.c,v 1.46 2009/04/12 10:18:52 lukem Exp $");
 #include <stdlib.h>
 #include <string.h>
 
+#endif /* tnftp */
+
 #include "ftp_var.h"
 
 #ifndef NO_EDITCOMPLETE
similarity index 93%
rename from contrib/tnftp/domacro.c
rename to contrib/tnftp/src/domacro.c
index 04799bc..b8fde0c 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: domacro.c,v 1.22 2009/04/12 10:18:52 lukem Exp $       */
+/*     $NetBSD: domacro.c,v 1.8 2009/05/20 12:53:47 lukem Exp $        */
+/*     from    NetBSD: domacro.c,v 1.22 2009/04/12 10:18:52 lukem Exp  */
 
 /*
  * Copyright (c) 1985, 1993, 1994
  * SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)domacro.c  8.3 (Berkeley) 4/2/94";
 #else
-__RCSID("$NetBSD: domacro.c,v 1.22 2009/04/12 10:18:52 lukem Exp $");
+__RCSID(" NetBSD: domacro.c,v 1.22 2009/04/12 10:18:52 lukem Exp  ");
 #endif
 #endif /* not lint */
 
@@ -42,6 +47,8 @@ __RCSID("$NetBSD: domacro.c,v 1.22 2009/04/12 10:18:52 lukem Exp $");
 #include <stdio.h>
 #include <string.h>
 
+#endif /* tnftp */
+
 #include "ftp_var.h"
 
 void
similarity index 98%
rename from contrib/tnftp/extern.h
rename to contrib/tnftp/src/extern.h
index e856ef4..d9b7a50 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: extern.h,v 1.80 2012/07/04 06:09:37 is Exp $   */
+/*     $NetBSD: extern.h,v 1.13 2013/05/05 11:17:30 lukem Exp $        */
+/*     from    NetBSD: extern.h,v 1.80 2012/07/04 06:09:37 is Exp      */
 
 /*-
  * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
@@ -108,7 +109,7 @@ void        cmdabort(int);
 void   cmdtimeout(int);
 void   cmdscanner(void);
 int    command(const char *, ...)
-     __attribute__((__format__(__printf__, 1, 2)));
+     ;
 #ifndef NO_EDITCOMPLETE
 unsigned char complete(EditLine *, int);
 void   controlediting(void);
similarity index 98%
rename from contrib/tnftp/fetch.c
rename to contrib/tnftp/src/fetch.c
index 8c628a8..d0f40d3 100644 (file)
@@ -1,7 +1,8 @@
-/*     $NetBSD: fetch.c,v 1.205 2013/11/07 02:06:51 christos Exp $     */
+/*     $NetBSD: fetch.c,v 1.21 2015/10/04 04:53:26 lukem Exp $ */
+/*     from    NetBSD: fetch.c,v 1.207 2015/09/12 19:38:42 wiz Exp     */
 
 /*-
- * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2015 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -10,6 +11,9 @@
  * This code is derived from software contributed to The NetBSD Foundation
  * by Scott Aaron Bamford.
  *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Thomas Klausner.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: fetch.c,v 1.205 2013/11/07 02:06:51 christos Exp $");
+__RCSID(" NetBSD: fetch.c,v 1.207 2015/09/12 19:38:42 wiz Exp  ");
 #endif /* not lint */
 
 /*
@@ -64,6 +72,8 @@ __RCSID("$NetBSD: fetch.c,v 1.205 2013/11/07 02:06:51 christos Exp $");
 #include <unistd.h>
 #include <time.h>
 
+#endif /* tnftp */
+
 #include "ssl.h"
 #include "ftp_var.h"
 #include "version.h"
@@ -571,7 +581,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
        url_decode(decodedpath);
 
        if (outfile)
-               savefile = ftp_strdup(outfile);
+               savefile = outfile;
        else {
                cp = strrchr(decodedpath, '/');         /* find savefile */
                if (cp != NULL)
@@ -595,8 +605,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
        rangestart = rangeend = entitylen = -1;
        mtime = -1;
        if (restartautofetch) {
-               if (strcmp(savefile, "-") != 0 && *savefile != '|' &&
-                   stat(savefile, &sb) == 0)
+               if (stat(savefile, &sb) == 0)
                        restart_point = sb.st_size;
        }
        if (urltype == FILE_URL_T) {            /* file:// URLs */
@@ -783,7 +792,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
 
 #ifdef WITH_SSL
                        if (urltype == HTTPS_URL_T) {
-                               if ((ssl = fetch_start_ssl(s)) == NULL) {
+                               if ((ssl = fetch_start_ssl(s, host)) == NULL) {
                                        close(s);
                                        s = -1;
                                        continue;
@@ -1150,18 +1159,26 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                }
        }               /* end of ftp:// or http:// specific setup */
 
-                       /* Open the output file. */
-       if (strcmp(savefile, "-") == 0) {
-               fout = stdout;
-       } else if (*savefile == '|') {
-               oldpipe = xsignal(SIGPIPE, SIG_IGN);
-               fout = popen(savefile + 1, "w");
-               if (fout == NULL) {
-                       warn("Can't execute `%s'", savefile + 1);
-                       goto cleanup_fetch_url;
+       /* Open the output file. */
+
+       /*
+        * Only trust filenames with special meaning if they came from
+        * the command line
+        */
+       if (outfile == savefile) {
+               if (strcmp(savefile, "-") == 0) {
+                       fout = stdout;
+               } else if (*savefile == '|') {
+                       oldpipe = xsignal(SIGPIPE, SIG_IGN);
+                       fout = popen(savefile + 1, "w");
+                       if (fout == NULL) {
+                               warn("Can't execute `%s'", savefile + 1);
+                               goto cleanup_fetch_url;
+                       }
+                       closefunc = pclose;
                }
-               closefunc = pclose;
-       } else {
+       }
+       if (fout == NULL) {
                if ((rangeend != -1 && rangeend <= restart_point) ||
                    (rangestart == -1 && filesize != -1 && filesize <= restart_point)) {
                        /* already done */
@@ -1379,7 +1396,8 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                (*closefunc)(fout);
        if (res0)
                freeaddrinfo(res0);
-       FREEPTR(savefile);
+       if (savefile != outfile)
+               FREEPTR(savefile);
        FREEPTR(uuser);
        if (pass != NULL)
                memset(pass, 0, strlen(pass));
similarity index 99%
rename from contrib/tnftp/ftp.1
rename to contrib/tnftp/src/ftp.1
index 931f3b8..3180f00 100644 (file)
@@ -1,6 +1,7 @@
-.\"    $NetBSD: ftp.1,v 1.134 2012/12/22 16:57:10 christos Exp $
+.\"    $NetBSD: ftp.1,v 1.15 2015/10/04 04:53:26 lukem Exp $
+.\"    from    NetBSD: ftp.1,v 1.135 2015/04/23 23:31:23 lukem Exp
 .\"
-.\" Copyright (c) 1996-2010 The NetBSD Foundation, Inc.
+.\" Copyright (c) 1996-2015 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .\"
 .\" This code is derived from software contributed to The NetBSD Foundation
@@ -57,7 +58,7 @@
 .\"
 .\"    @(#)ftp.1       8.3 (Berkeley) 10/9/94
 .\"
-.Dd December 22, 2012
+.Dd April 24, 2015
 .Dt FTP 1
 .Os
 .Sh NAME
@@ -84,6 +85,7 @@
 .Xc
 .Oc
 .Ek
+.Op Fl x Ar xferbufsize
 .Bk -words
 .\" [[user@]host [port]]
 .Oo
@@ -311,6 +313,12 @@ Forces
 .Nm
 to show all responses from the remote server, as well
 as report on data transfer statistics.
+.It Fl x Ar xferbufsize
+Set the size of the socket send and receive buffers to
+.Ar xferbufsize .
+Refer to
+.Ic xferbuf
+for more information.
 .El
 .Pp
 The client host with which
similarity index 99%
rename from contrib/tnftp/ftp.c
rename to contrib/tnftp/src/ftp.c
index d1a8785..af236ac 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: ftp.c,v 1.164 2012/07/04 06:09:37 is Exp $     */
+/*     $NetBSD: ftp.c,v 1.19 2013/05/05 11:17:31 lukem Exp $   */
+/*     from    NetBSD: ftp.c,v 1.164 2012/07/04 06:09:37 is Exp        */
 
 /*-
  * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
  * SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+#include <arpa/telnet.h>
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)ftp.c      8.6 (Berkeley) 10/27/94";
 #else
-__RCSID("$NetBSD: ftp.c,v 1.164 2012/07/04 06:09:37 is Exp $");
+__RCSID(" NetBSD: ftp.c,v 1.164 2012/07/04 06:09:37 is Exp  ");
 #endif
 #endif /* not lint */
 
@@ -121,6 +127,8 @@ __RCSID("$NetBSD: ftp.c,v 1.164 2012/07/04 06:09:37 is Exp $");
 #include <unistd.h>
 #include <stdarg.h>
 
+#endif /* tnftp */
+
 #include "ftp_var.h"
 
 volatile sig_atomic_t  abrtflag;
similarity index 98%
rename from contrib/tnftp/ftp_var.h
rename to contrib/tnftp/src/ftp_var.h
index 7e5040a..50f9c9a 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: ftp_var.h,v 1.82 2012/12/21 18:07:36 christos Exp $    */
+/*     $NetBSD: ftp_var.h,v 1.12 2015/10/04 04:53:26 lukem Exp $       */
+/*     from    NetBSD: ftp_var.h,v 1.83 2015/01/12 14:17:08 christos Exp       */
 
 /*-
  * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
 #define        NO_PROGRESS
 #endif
 
+#if 0  /* tnftp */
+
 #include <sys/param.h>
 
 #include <netinet/in.h>
 #include <setjmp.h>
 #include <stringlist.h>
 
+#endif /* tnftp */
+
 #ifndef NO_EDITCOMPLETE
 #include <histedit.h>
 #endif /* !NO_EDITCOMPLETE */
@@ -169,7 +174,7 @@ enum {
 /*
  * Global defines
  */
-#define        FTPBUFLEN       MAXPATHLEN + 200
+#define        FTPBUFLEN       (4 * MAXPATHLEN)
 #define        MAX_IN_PORT_T   0xffffU
 
 #define        HASHBYTES       1024    /* default mark for `hash' command */
similarity index 97%
rename from contrib/tnftp/main.c
rename to contrib/tnftp/src/main.c
index c84364d..8237d4d 100644 (file)
@@ -1,7 +1,8 @@
-/*     $NetBSD: main.c,v 1.122 2012/12/22 16:57:10 christos Exp $      */
+/*     $NetBSD: main.c,v 1.20 2015/10/04 04:53:26 lukem Exp $  */
+/*     from    NetBSD: main.c,v 1.123 2015/04/23 23:31:23 lukem Exp    */
 
 /*-
- * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2015 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\
  The Regents of the University of California.  All rights reserved.\
-  Copyright 1996-2008 The NetBSD Foundation, Inc.  All rights reserved");
+  Copyright 1996-2015 The NetBSD Foundation, Inc.  All rights reserved");
 #endif /* not lint */
 
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)main.c     8.6 (Berkeley) 10/9/94";
 #else
-__RCSID("$NetBSD: main.c,v 1.122 2012/12/22 16:57:10 christos Exp $");
+__RCSID(" NetBSD: main.c,v 1.123 2015/04/23 23:31:23 lukem Exp  ");
 #endif
 #endif /* not lint */
 
@@ -121,6 +126,8 @@ __RCSID("$NetBSD: main.c,v 1.122 2012/12/22 16:57:10 christos Exp $");
 #include <unistd.h>
 #include <locale.h>
 
+#endif /* tnftp */
+
 #define        GLOBAL          /* force GLOBAL decls in ftp_var.h to be declared */
 #include "ftp_var.h"
 
@@ -144,7 +151,9 @@ main(int volatile argc, char **volatile argv)
        size_t len;
 
        tzset();
+#if defined(HAVE_SETLOCALE)
        setlocale(LC_ALL, "");
+#endif
        setprogname(argv[0]);
 
        sigint_raised = 0;
@@ -266,7 +275,7 @@ main(int volatile argc, char **volatile argv)
                }
        }
 
-       while ((ch = getopt(argc, argv, "46AadefginN:o:pP:q:r:Rs:tT:u:vV")) != -1) {
+       while ((ch = getopt(argc, argv, "46AadefginN:o:pP:q:r:Rs:tT:u:vVx:")) != -1) {
                switch (ch) {
                case '4':
                        family = AF_INET;
@@ -408,6 +417,13 @@ main(int volatile argc, char **volatile argv)
                        progress = verbose = 0;
                        break;
 
+               case 'x':
+                       sndbuf_size = strsuftoi(optarg);
+                       if (sndbuf_size < 1)
+                               errx(1, "Bad xferbuf value: %s", optarg);
+                       rcvbuf_size = sndbuf_size;
+                       break;
+
                default:
                        usage();
                }
@@ -1045,7 +1061,7 @@ usage(void)
 
        (void)fprintf(stderr,
 "usage: %s [-46AadefginpRtVv] [-N netrc] [-o outfile] [-P port] [-q quittime]\n"
-"           [-r retry] [-s srcaddr] [-T dir,max[,inc]]\n"
+"           [-r retry] [-s srcaddr] [-T dir,max[,inc]] [-x xferbufsize]\n"
 "           [[user@]host [port]] [host:path[/]] [file:///file]\n"
 "           [ftp://[user[:pass]@]host[:port]/path[/]]\n"
 "           [http://[user[:pass]@]host[:port]/path] [...]\n"
similarity index 94%
rename from contrib/tnftp/progressbar.c
rename to contrib/tnftp/src/progressbar.c
index 2350776..11eae3a 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: progressbar.c,v 1.22 2012/06/27 22:07:36 riastradh Exp $       */
+/*     $NetBSD: progressbar.c,v 1.15 2013/05/05 11:17:31 lukem Exp $   */
+/*     from    NetBSD: progressbar.c,v 1.22 2012/06/27 22:07:36 riastradh Exp  */
 
 /*-
  * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: progressbar.c,v 1.22 2012/06/27 22:07:36 riastradh Exp $");
+__RCSID(" NetBSD: progressbar.c,v 1.22 2012/06/27 22:07:36 riastradh Exp  ");
 #endif /* not lint */
 
 /*
@@ -51,6 +56,8 @@ __RCSID("$NetBSD: progressbar.c,v 1.22 2012/06/27 22:07:36 riastradh Exp $");
 #include <tzfile.h>
 #include <unistd.h>
 
+#endif /* tnftp */
+
 #include "progressbar.h"
 
 #if !defined(NO_PROGRESS)
@@ -63,7 +70,11 @@ foregroundproc(void)
        static pid_t pgrp = -1;
 
        if (pgrp == -1)
+#if GETPGRP_VOID
                pgrp = getpgrp();
+#else /* ! GETPGRP_VOID */
+               pgrp = getpgrp(0);
+#endif /* ! GETPGRP_VOID */
 
        return (tcgetpgrp(fileno(ttyout)) == pgrp);
 }
@@ -408,6 +419,16 @@ alarmtimer(int wait)
 sigfunc
 xsignal_restart(int sig, sigfunc func, int restartable)
 {
+#ifdef ultrix  /* XXX: this is lame - how do we test sigvec vs. sigaction? */
+       struct sigvec vec, ovec;
+
+       vec.sv_handler = func;
+       sigemptyset(&vec.sv_mask);
+       vec.sv_flags = 0;
+       if (sigvec(sig, &vec, &ovec) < 0)
+               return (SIG_ERR);
+       return (ovec.sv_handler);
+#else  /* ! ultrix */
        struct sigaction act, oact;
        act.sa_handler = func;
 
@@ -422,6 +443,7 @@ xsignal_restart(int sig, sigfunc func, int restartable)
        if (sigaction(sig, &act, &oact) < 0)
                return (SIG_ERR);
        return (oact.sa_handler);
+#endif /* ! ultrix */
 }
 
 /*
similarity index 88%
rename from contrib/tnftp/progressbar.h
rename to contrib/tnftp/src/progressbar.h
index f627e88..70e2df3 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: progressbar.h,v 1.8 2009/04/12 10:18:52 lukem Exp $    */
+/*     $NetBSD: progressbar.h,v 1.9 2009/05/20 12:53:47 lukem Exp $    */
+/*     from    NetBSD: progressbar.h,v 1.8 2009/04/12 10:18:52 lukem Exp       */
 
 /*-
  * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
@@ -83,10 +84,19 @@ void        ptransfer(int);
 # define ULLFP(x)      "%" x "lu"
 # define ULLT          unsigned long
 #else
+#if defined(HAVE_PRINTF_QD)
+# define LLF           "%qd"
+# define LLFP(x)       "%" x "qd"
+# define LLT           long long
+# define ULLF          "%qu"
+# define ULLFP(x)      "%" x "qu"
+# define ULLT          unsigned long long
+#else /* !defined(HAVE_PRINTF_QD) */
 # define LLF           "%lld"
 # define LLFP(x)       "%" x "lld"
 # define LLT           long long
 # define ULLF          "%llu"
 # define ULLFP(x)      "%" x "llu"
 # define ULLT          unsigned long long
+#endif /* !defined(HAVE_PRINTF_QD) */
 #endif
similarity index 96%
rename from contrib/tnftp/ruserpass.c
rename to contrib/tnftp/src/ruserpass.c
index e434052..a2e0360 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp $     */
+/*     $NetBSD: ruserpass.c,v 1.8 2007/08/06 04:33:24 lukem Exp $      */
+/*     from    NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp        */
 
 /*
  * Copyright (c) 1985, 1993, 1994
  * SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)ruserpass.c        8.4 (Berkeley) 4/27/95";
 #else
-__RCSID("$NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp $");
+__RCSID(" NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp  ");
 #endif
 #endif /* not lint */
 
@@ -50,6 +55,8 @@ __RCSID("$NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp $");
 #include <string.h>
 #include <unistd.h>
 
+#endif /* tnftp */
+
 #include "ftp_var.h"
 
 static int token(void);
similarity index 96%
rename from contrib/tnftp/ssl.c
rename to contrib/tnftp/src/ssl.c
index b34c864..8587526 100644 (file)
@@ -1,8 +1,10 @@
-/*     $NetBSD: ssl.c,v 1.2 2012/12/24 22:12:28 christos Exp $ */
+/*     $NetBSD: ssl.c,v 1.3 2015/10/04 04:53:26 lukem Exp $    */
+/*     from    NetBSD: ssl.c,v 1.5 2015/09/16 15:32:53 joerg Exp       */
 
 /*-
  * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
  * Copyright (c) 2008, 2010 Joerg Sonnenberger <joerg@NetBSD.org>
+ * Copyright (c) 2015 Thomas Klausner <wiz@NetBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * $FreeBSD: common.c,v 1.53 2007/12/19 00:26:36 des Exp $
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ssl.c,v 1.2 2012/12/24 22:12:28 christos Exp $");
+__RCSID(" NetBSD: ssl.c,v 1.5 2015/09/16 15:32:53 joerg Exp  ");
 #endif
 
 #include <time.h>
@@ -46,6 +52,8 @@ __RCSID("$NetBSD: ssl.c,v 1.2 2012/12/24 22:12:28 christos Exp $");
 
 #include <netinet/tcp.h>
 #include <netinet/in.h>
+#endif /* tnftp */
+
 #include <openssl/crypto.h>
 #include <openssl/x509.h>
 #include <openssl/pem.h>
@@ -545,7 +553,7 @@ fetch_getline(struct fetch_connect *conn, char *buf, size_t buflen,
 }
 
 void *
-fetch_start_ssl(int sock)
+fetch_start_ssl(int sock, const char *servername)
 {
        SSL *ssl;
        SSL_CTX *ctx;
@@ -569,6 +577,11 @@ fetch_start_ssl(int sock)
                return NULL;
        }
        SSL_set_fd(ssl, sock);
+       if (!SSL_set_tlsext_host_name(ssl, __UNCONST(servername))) {
+               fprintf(ttyout, "SSL hostname setting failed\n");
+               SSL_CTX_free(ctx);
+               return NULL;
+       }
        while ((ret = SSL_connect(ssl)) == -1) {
                ssl_err = SSL_get_error(ssl, ret);
                if (ssl_err != SSL_ERROR_WANT_READ &&
similarity index 93%
rename from contrib/tnftp/ssl.h
rename to contrib/tnftp/src/ssl.h
index e248bb2..56be916 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: ssl.h,v 1.2 2014/01/07 02:07:08 joerg Exp $    */
+/*     $NetBSD: ssl.h,v 1.3 2015/10/04 04:53:26 lukem Exp $    */
+/*     from    NetBSD: ssl.h,v 1.3 2015/09/12 19:38:42 wiz Exp */
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -31,7 +32,7 @@
 struct fetch_connect;
 
 int fetch_printf(struct fetch_connect *, const char *fmt, ...)
-    __printflike(2, 3);
+    ;
 int fetch_fileno(struct fetch_connect *);
 int fetch_error(struct fetch_connect *);
 int fetch_flush(struct fetch_connect *);
@@ -42,7 +43,7 @@ ssize_t fetch_read(void *, size_t, size_t, struct fetch_connect *);
 char *fetch_getln(char *, int, struct fetch_connect *);
 int fetch_getline(struct fetch_connect *, char *, size_t, const char **);
 void fetch_set_ssl(struct fetch_connect *, void *);
-void *fetch_start_ssl(int);
+void *fetch_start_ssl(int, const char *);
 
 #else  /* !WITH_SSL */
 
similarity index 94%
rename from contrib/tnftp/util.c
rename to contrib/tnftp/src/util.c
index ee610c6..531712c 100644 (file)
@@ -1,4 +1,5 @@
-/*     $NetBSD: util.c,v 1.158 2013/02/19 23:29:15 dsl Exp $   */
+/*     $NetBSD: util.c,v 1.23 2013/05/05 11:51:43 lukem Exp $  */
+/*     from    NetBSD: util.c,v 1.158 2013/02/19 23:29:15 dsl Exp      */
 
 /*-
  * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
  * SUCH DAMAGE.
  */
 
+#include "tnftp.h"
+
+#if 0  /* tnftp */
+
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: util.c,v 1.158 2013/02/19 23:29:15 dsl Exp $");
+__RCSID(" NetBSD: util.c,v 1.158 2013/02/19 23:29:15 dsl Exp  ");
 #endif /* not lint */
 
 /*
@@ -95,6 +100,8 @@ __RCSID("$NetBSD: util.c,v 1.158 2013/02/19 23:29:15 dsl Exp $");
 #include <tzfile.h>
 #include <unistd.h>
 
+#endif /* tnftp */
+
 #include "ftp_var.h"
 
 /*
@@ -796,11 +803,13 @@ const char *
 parse_rfc2616time(struct tm *parsed, const char *httpdate)
 {
        const char *t;
+#if defined(HAVE_SETLOCALE)
        const char *curlocale;
 
        /* The representation of %a depends on the current locale. */
        curlocale = setlocale(LC_TIME, NULL);
        (void)setlocale(LC_TIME, "C");
+#endif
                                                                /* RFC 1123 */
        if ((t = strptime(httpdate, "%a, %d %b %Y %H:%M:%S GMT", parsed)) ||
                                                                /* RFC 850 */
@@ -809,7 +818,9 @@ parse_rfc2616time(struct tm *parsed, const char *httpdate)
            (t = strptime(httpdate, "%a, %b %d %H:%M:%S %Y", parsed))) {
                ;                       /* do nothing */
        }
+#if defined(HAVE_SETLOCALE)
        (void)setlocale(LC_TIME, curlocale);
+#endif
        return t;
 }
 
@@ -1484,7 +1495,65 @@ ftp_listen(int sock, int backlog)
 int
 ftp_poll(struct pollfd *fds, int nfds, int timeout)
 {
+#if defined(HAVE_POLL)
        return poll(fds, nfds, timeout);
+
+#elif defined(HAVE_SELECT)
+               /* implement poll(2) using select(2) */
+       fd_set          rset, wset, xset;
+       const int       rsetflags = POLLIN | POLLRDNORM;
+       const int       wsetflags = POLLOUT | POLLWRNORM;
+       const int       xsetflags = POLLRDBAND;
+       struct timeval  tv, *ptv;
+       int             i, max, rv;
+
+       FD_ZERO(&rset);                 /* build list of read & write events */
+       FD_ZERO(&wset);
+       FD_ZERO(&xset);
+       max = 0;
+       for (i = 0; i < nfds; i++) {
+               if (fds[i].fd > FD_SETSIZE) {
+                       warnx("can't select fd %d", fds[i].fd);
+                       errno = EINVAL;
+                       return -1;
+               } else if (fds[i].fd > max)
+                       max = fds[i].fd;
+               if (fds[i].events & rsetflags)
+                       FD_SET(fds[i].fd, &rset);
+               if (fds[i].events & wsetflags)
+                       FD_SET(fds[i].fd, &wset);
+               if (fds[i].events & xsetflags)
+                       FD_SET(fds[i].fd, &xset);
+       }
+
+       ptv = &tv;                      /* determine timeout */
+       if (timeout == -1) {            /* wait forever */
+               ptv = NULL;
+       } else if (timeout == 0) {      /* poll once */
+               ptv->tv_sec = 0;
+               ptv->tv_usec = 0;
+       }
+       else if (timeout != 0) {        /* wait timeout milliseconds */
+               ptv->tv_sec = timeout / 1000;
+               ptv->tv_usec = (timeout % 1000) * 1000;
+       }
+       rv = select(max + 1, &rset, &wset, &xset, ptv);
+       if (rv <= 0)                    /* -1 == error, 0 == timeout */
+               return rv;
+
+       for (i = 0; i < nfds; i++) {    /* determine results */
+               if (FD_ISSET(fds[i].fd, &rset))
+                       fds[i].revents |= (fds[i].events & rsetflags);
+               if (FD_ISSET(fds[i].fd, &wset))
+                       fds[i].revents |= (fds[i].events & wsetflags);
+               if (FD_ISSET(fds[i].fd, &xset))
+                       fds[i].revents |= (fds[i].events & xsetflags);
+       }
+       return rv;
+
+#else
+# error no way to implement xpoll
+#endif
 }
 
 /*
similarity index 87%
rename from contrib/tnftp/version.h
rename to contrib/tnftp/src/version.h
index 9fb6c4a..80c5455 100644 (file)
@@ -1,7 +1,8 @@
-/*     $NetBSD: version.h,v 1.84 2013/05/05 10:40:19 lukem Exp $       */
+/*     $NetBSD: version.h,v 1.7 2015/10/04 04:53:26 lukem Exp $        */
+/*     from    NetBSD: version.h,v 1.87 2015/09/12 20:18:52 wiz Exp    */
 
 /*-
- * Copyright (c) 1999-2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 1999-2015 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -34,5 +35,5 @@
 #endif
 
 #ifndef FTP_VERSION
-#define        FTP_VERSION     "20130220"
+#define        FTP_VERSION     "20150912"
 #endif
diff --git a/contrib/tnftp/tnftp.h b/contrib/tnftp/tnftp.h
new file mode 100644 (file)
index 0000000..85619ef
--- /dev/null
@@ -0,0 +1,517 @@
+/*     $NetBSD: tnftp.h,v 1.36 2014/10/31 07:22:03 lukem Exp $ */
+
+#define        FTP_PRODUCT     PACKAGE_NAME
+#define        FTP_VERSION     PACKAGE_VERSION
+
+#include "tnftp_config.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+
+#if defined(HAVE_SYS_TYPES_H)
+# include <sys/types.h>
+#endif
+#if defined(STDC_HEADERS)
+# include <stdarg.h>
+# include <stdlib.h>
+# include <string.h>
+#endif
+#if defined(HAVE_LIBGEN_H)
+# include <libgen.h>
+#endif
+#if defined(HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+#if defined(HAVE_POLL_H)
+# include <poll.h>
+#elif defined(HAVE_SYS_POLL_H)
+# include <sys/poll.h>
+#endif
+#if defined(HAVE_SYS_SOCKET_H)
+# include <sys/socket.h>
+#endif
+#if defined(HAVE_NETINET_IN_H)
+# include <netinet/in.h>
+#endif
+#if defined(HAVE_NETINET_IN_SYSTM_H)
+# include <netinet/in_systm.h>
+#endif
+#if defined(HAVE_NETINET_IP_H)
+# include <netinet/ip.h>
+#endif
+#if defined(HAVE_NETINET_TCP_H)
+# include <netinet/tcp.h>
+#endif
+#if defined(HAVE_NETDB_H)
+# if HAVE_DECL_AI_NUMERICHOST
+#  include <netdb.h>
+# else /* !HAVE_DECL_AI_NUMERICHOST */
+#  define getaddrinfo non_rfc2553_getaddrinfo
+#  include <netdb.h>
+#  undef getaddrinfo
+# endif        /* !HAVE_DECL_AI_NUMERICHOST */
+#endif
+#if defined(HAVE_ARPA_INET_H)
+# include <arpa/inet.h>
+#endif
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# if defined(HAVE_SYS_NDIR_H)
+#  include <sys/ndir.h>
+# endif
+# if defined(HAVE_SYS_DIR_H)
+#  include <sys/dir.h>
+# endif
+# if defined(HAVE_NDIR_H)
+#  include <ndir.h>
+# endif
+#endif
+#if defined(HAVE_SYS_UIO_H)
+# include <sys/uio.h>
+#endif
+
+#if defined(HAVE_SYS_IOCTL_H)
+# include <sys/ioctl.h>
+#endif
+#if defined(HAVE_SYS_PARAM_H)
+# include <sys/param.h>
+#endif
+#if defined(HAVE_SYS_STAT_H)
+# include <sys/stat.h>
+#endif
+#if defined(HAVE_SYS_SYSLIMITS_H)
+# include <sys/syslimits.h>
+#endif
+#if defined(HAVE_SYS_WAIT_H)
+# include <sys/wait.h>
+#endif
+
+#if defined(HAVE_ARPA_FTP_H)
+# include <arpa/ftp.h>
+#endif
+
+#if defined(HAVE_FCNTL_H)
+# include <fcntl.h>
+#endif
+#if defined(HAVE_LIMITS_H)
+# include <limits.h>
+#endif
+#if defined(HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+#if defined(HAVE_PWD_H)
+# include <pwd.h>
+#endif
+#if defined(HAVE_SETJMP_H)
+# include <setjmp.h>
+#endif
+#if defined(HAVE_SIGNAL_H)
+# include <signal.h>
+#endif
+#if defined(HAVE_STDDEF_H)
+# include <stddef.h>
+#endif
+#if defined(HAVE_TERMIOS_H)
+# include <termios.h>
+#endif
+
+#if defined(HAVE_POLL)
+/* we use poll */
+#elif defined(HAVE_SELECT)
+/* we use select */
+#else /* !defined(HAVE_POLL) && !defined(HAVE_SELECT) */
+# error "no poll() or select() found"
+#endif
+#if !defined(POLLIN)
+# define POLLIN                0x0001
+#endif
+#if !defined(POLLOUT)
+# define POLLOUT       0x0004
+#endif
+#if !defined(POLLRDNORM)
+# define POLLRDNORM    0x0040
+#endif
+#if !defined(POLLWRNORM)
+# define POLLWRNORM    POLLOUT
+#endif
+#if !defined(POLLRDBAND)
+# define POLLRDBAND    0x0080
+#endif
+#if !defined(INFTIM)
+# define INFTIM -1
+#endif
+#if !defined(HAVE_STRUCT_POLLFD)
+struct pollfd {
+       int     fd;
+       short   events;
+       short   revents;
+};
+#endif
+
+#if defined(TIME_WITH_SYS_TIME)
+# include <sys/time.h>
+# include <time.h>
+#else
+# if defined(HAVE_SYS_TIME_H)
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#if defined(HAVE_ERR_H)
+# include <err.h>
+#endif
+
+#if defined(USE_GLOB_H)        /* not set by configure; used by other build systems */
+# include <glob.h>
+#else
+# include "ftpglob.h"
+#endif
+
+#if defined(HAVE_PATHS_H)
+# include <paths.h>
+#endif
+#if !defined(_PATH_BSHELL)
+# define _PATH_BSHELL  "/bin/sh"
+#endif
+#if !defined(_PATH_TMP)
+# define _PATH_TMP     "/tmp/"
+#endif
+
+typedef struct _stringlist {
+       char    **sl_str;
+       size_t    sl_max;
+       size_t    sl_cur;
+} StringList;
+
+StringList *sl_init(void);
+int     sl_add(StringList *, char *);
+void    sl_free(StringList *, int);
+char   *sl_find(StringList *, char *);
+
+#if defined(HAVE_TERMCAP_H)
+# include <termcap.h>
+#else
+int     tgetent(char *, const char *);
+char   *tgetstr(const char *, char **);
+int     tgetflag(const char *);
+int     tgetnum(const char *);
+char   *tgoto(const char *, int, int);
+void    tputs(const char *, int, int (*)(int));
+#endif /* !HAVE_TERMCAP_H */
+
+#if defined(HAVE_VIS_H) && defined(HAVE_STRVIS) && defined(HAVE_STRUNVIS)
+# include <vis.h>
+#else
+# include "ftpvis.h"
+#endif
+
+#if !defined(HAVE_IN_PORT_T)
+typedef unsigned short in_port_t;
+#endif
+
+#if !defined(HAVE_SA_FAMILY_T)
+typedef unsigned short sa_family_t;
+#endif
+
+#if !defined(HAVE_SOCKLEN_T)
+typedef unsigned int socklen_t;
+#endif
+
+#if defined(USE_INET6)
+# define INET6
+#endif
+
+#if !HAVE_DECL_AI_NUMERICHOST
+
+                               /* RFC 2553 */
+#undef EAI_ADDRFAMILY
+#define        EAI_ADDRFAMILY   1      /* address family for hostname not supported */
+#undef EAI_AGAIN
+#define        EAI_AGAIN        2      /* temporary failure in name resolution */
+#undef EAI_BADFLAGS
+#define        EAI_BADFLAGS     3      /* invalid value for ai_flags */
+#undef EAI_FAIL
+#define        EAI_FAIL         4      /* non-recoverable failure in name resolution */
+#undef EAI_FAMILY
+#define        EAI_FAMILY       5      /* ai_family not supported */
+#undef EAI_MEMORY
+#define        EAI_MEMORY       6      /* memory allocation failure */
+#undef EAI_NODATA
+#define        EAI_NODATA       7      /* no address associated with hostname */
+#undef EAI_NONAME
+#define        EAI_NONAME       8      /* hostname nor servname provided, or not known */
+#undef EAI_SERVICE
+#define        EAI_SERVICE      9      /* servname not supported for ai_socktype */
+#undef EAI_SOCKTYPE
+#define        EAI_SOCKTYPE    10      /* ai_socktype not supported */
+#undef EAI_SYSTEM
+#define        EAI_SYSTEM      11      /* system error returned in errno */
+
+                               /* KAME extensions? */
+#undef EAI_BADHINTS
+#define        EAI_BADHINTS    12
+#undef EAI_PROTOCOL
+#define        EAI_PROTOCOL    13
+#undef EAI_MAX
+#define        EAI_MAX         14
+
+                               /* RFC 2553 */
+#undef NI_MAXHOST
+#define        NI_MAXHOST      1025
+#undef NI_MAXSERV
+#define        NI_MAXSERV      32
+
+#undef NI_NOFQDN
+#define        NI_NOFQDN       0x00000001
+#undef NI_NUMERICHOST
+#define        NI_NUMERICHOST  0x00000002
+#undef NI_NAMEREQD
+#define        NI_NAMEREQD     0x00000004
+#undef NI_NUMERICSERV
+#define        NI_NUMERICSERV  0x00000008
+#undef NI_DGRAM
+#define        NI_DGRAM        0x00000010
+
+                               /* RFC 2553 */
+#undef AI_PASSIVE
+#define        AI_PASSIVE      0x00000001 /* get address to use bind() */
+#undef AI_CANONNAME
+#define        AI_CANONNAME    0x00000002 /* fill ai_canonname */
+
+                               /* KAME extensions ? */
+#undef AI_NUMERICHOST
+#define        AI_NUMERICHOST  0x00000004 /* prevent name resolution */
+#undef AI_MASK
+#define        AI_MASK         (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
+
+                               /* RFC 2553 */
+#undef AI_ALL
+#define        AI_ALL          0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
+#undef AI_V4MAPPED_CFG
+#define        AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */
+#undef AI_ADDRCONFIG
+#define        AI_ADDRCONFIG   0x00000400 /* only if any address is assigned */
+#undef AI_V4MAPPED
+#define        AI_V4MAPPED     0x00000800 /* accept IPv4-mapped IPv6 address */
+
+#endif /* !HAVE_DECL_AI_NUMERICHOST */
+
+
+#if !HAVE_DECL_AI_NUMERICHOST && !defined(HAVE_STRUCT_ADDRINFO) \
+    && !defined(USE_SOCKS)
+
+struct addrinfo {
+       int             ai_flags;       /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
+       int             ai_family;      /* PF_xxx */
+       int             ai_socktype;    /* SOCK_xxx */
+       int             ai_protocol;    /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+       socklen_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 */
+};
+
+int    getaddrinfo(const char *, const char *,
+           const struct addrinfo *, struct addrinfo **);
+int    getnameinfo(const struct sockaddr *, socklen_t,
+           char *, size_t, char *, size_t, int);
+void   freeaddrinfo(struct addrinfo *);
+const char *gai_strerror(int);
+
+#endif /* !HAVE_DECL_AI_NUMERICHOST && !defined(HAVE_STRUCT_ADDRINFO) \
+       && !defined(USE_SOCKS) */
+
+#if !defined(HAVE_STRUCT_DIRENT_D_NAMLEN)
+# define DIRENT_MISSING_D_NAMLEN
+#endif
+
+#if !HAVE_DECL_H_ERRNO
+extern int     h_errno;
+#endif
+#define HAVE_H_ERRNO   1               /* XXX: an assumption for now... */
+
+#if !HAVE_DECL_FCLOSE
+int    fclose(FILE *);
+#endif
+
+#if !HAVE_DECL_GETPASS
+char   *getpass(const char *);
+#endif
+
+#if !HAVE_DECL_OPTARG
+extern char    *optarg;
+#endif
+
+#if !HAVE_DECL_OPTIND
+extern int     optind;
+#endif
+
+#if !HAVE_DECL_PCLOSE
+int    pclose(FILE *);
+#endif
+
+#if !HAVE_DECL_DIRNAME
+char   *dirname(char *);
+#endif
+
+#if !defined(HAVE_ERR)
+void   err(int, const char *, ...);
+void   errx(int, const char *, ...);
+void   warn(const char *, ...);
+void   warnx(const char *, ...);
+#endif
+
+#if !defined(HAVE_FGETLN)
+char   *fgetln(FILE *, size_t *);
+#endif
+
+#if !defined(HAVE_FSEEKO)
+int    fseeko(FILE *, off_t, int);
+#endif
+
+#if !defined(HAVE_INET_NTOP)
+const char *inet_ntop(int, const void *, char *, socklen_t);
+#endif
+
+#if !defined(HAVE_INET_PTON)
+int inet_pton(int, const char *, void *);
+#endif
+
+#if !defined(HAVE_MKSTEMP)
+int    mkstemp(char *);
+#endif
+
+#if !defined(HAVE_SETPROGNAME)
+const char *getprogname(void);
+void   setprogname(const char *);
+#endif
+
+#if !defined(HAVE_SNPRINTF)
+int    snprintf(char *, size_t, const char *, ...);
+#endif
+
+#if !defined(HAVE_STRDUP)
+char   *strdup(const char *);
+#endif
+
+#if !defined(HAVE_STRERROR)
+char   *strerror(int);
+#endif
+
+#if !defined(HAVE_STRPTIME) || !HAVE_DECL_STRPTIME
+char   *strptime(const char *, const char *, struct tm *);
+#endif
+
+#if defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)
+# if !defined(HAVE_STRTOLL)
+long long strtoll(const char *, char **, int);
+# endif
+# if !defined(LLONG_MIN)
+#  define LLONG_MIN    (-0x7fffffffffffffffLL-1)
+# endif
+# if !defined(LLONG_MAX)
+#  define LLONG_MAX    (0x7fffffffffffffffLL)
+# endif
+#else  /* !(defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)) */
+# define NO_LONG_LONG  1
+#endif /* !(defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)) */
+
+#if !defined(HAVE_TIMEGM)
+time_t timegm(struct tm *);
+#endif
+
+#if !defined(HAVE_STRLCAT)
+size_t strlcat(char *, const char *, size_t);
+#endif
+
+#if !defined(HAVE_STRLCPY)
+size_t strlcpy(char *, const char *, size_t);
+#endif
+
+#if !defined(HAVE_STRSEP)
+char   *strsep(char **stringp, const char *delim);
+#endif
+
+#if !defined(HAVE_UTIMES)
+int utimes(const char *, const struct timeval *);
+#endif
+
+#if !defined(HAVE_MEMMOVE)
+# define memmove(a,b,c)        bcopy((b),(a),(c))
+       /* XXX: add others #defines for borken systems? */
+#endif
+
+#if defined(HAVE_GETPASSPHRASE)
+# define getpass getpassphrase
+#endif
+
+#if !defined(MIN)
+# define MIN(a, b)     ((a) < (b) ? (a) : (b))
+#endif
+#if !defined(MAX)
+# define MAX(a, b)     ((a) < (b) ? (b) : (a))
+#endif
+
+#if !defined(timersub)
+# define timersub(tvp, uvp, vvp)                                       \
+       do {                                                            \
+               (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;          \
+               (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;       \
+               if ((vvp)->tv_usec < 0) {                               \
+                       (vvp)->tv_sec--;                                \
+                       (vvp)->tv_usec += 1000000;                      \
+               }                                                       \
+       } while (0)
+#endif
+
+#if !defined(S_ISLNK)
+# define S_ISLNK(m)    ((m & S_IFMT) == S_IFLNK)
+#endif
+
+#define        EPOCH_YEAR      1970
+#define        SECSPERHOUR     3600
+#define        SECSPERDAY      86400
+#define        TM_YEAR_BASE    1900
+
+#if defined(USE_SOCKS)         /* (Dante) SOCKS5 */
+#define connect                Rconnect
+#define bind           Rbind
+#define getsockname    Rgetsockname
+#define getpeername    Rgetpeername
+#define accept         Raccept
+#define rresvport      Rrresvport
+#define bindresvport   Rbindresvport
+#define gethostbyname  Rgethostbyname
+#define gethostbyname2 Rgethostbyname2
+#define sendto         Rsendto
+#define recvfrom       Rrecvfrom
+#define recvfrom       Rrecvfrom
+#define write          Rwrite
+#define writev         Rwritev
+#define send           Rsend
+#define sendmsg                Rsendmsg
+#define read           Rread
+#define readv          Rreadv
+#define recv           Rrecv
+#define recvmsg                Rrecvmsg
+#define getaddrinfo    Rgetaddrinfo
+#define getipnodebyname        Rgetipnodebyname
+#endif /* defined(USE_SOCKS) */
+
+
+/*
+ * Compatibility for stuff in NetBSD <sys/cdefs.h>
+ */
+#undef __dead
+#define __dead
+
+#ifdef __UNCONST
+#undef __UNCONST
+#endif
+#define __UNCONST(a)   ((void *)(unsigned long)(const void *)(a))