aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Heffner <mikeh@FreeBSD.org>2003-06-16 02:36:38 +0000
committerMike Heffner <mikeh@FreeBSD.org>2003-06-16 02:36:38 +0000
commit1796d6118b58b3fde2859c2646c2cbfef5dc6431 (patch)
treefe7476d6e4129e7a835cd3c91bbef8b7b0b35a14
parent2e0951ee2da24c3bd16b4edded44a579c3cffe90 (diff)
downloadsrc-1796d6118b58b3fde2859c2646c2cbfef5dc6431.tar.gz
src-1796d6118b58b3fde2859c2646c2cbfef5dc6431.zip
Import the June 15, 2003 CVS version of NetBSD's ftp + patchset to fixvendor/tnftp/20030615vendor/NetBSD/lukemftp/20030615
header file differences between FBSD and NBSD. Like lukemftpd, the portable version of lukemftp lags too far behind CVS. This import includes several big fixes plus a cleaned up manpage.
Notes
Notes: svn path=/vendor/lukemftp/dist/; revision=116424 svn path=/vendor/tnftp/20030615/; revision=223303; tag=vendor/tnftp/20030615
-rw-r--r--contrib/lukemftp/FreeBSD-patchset64
-rw-r--r--contrib/lukemftp/diffout3500
-rw-r--r--contrib/lukemftp/src/Makefile26
-rw-r--r--contrib/lukemftp/src/cmds.c33
-rw-r--r--contrib/lukemftp/src/cmdtab.c14
-rw-r--r--contrib/lukemftp/src/complete.c14
-rw-r--r--contrib/lukemftp/src/domacro.c13
-rw-r--r--contrib/lukemftp/src/extern.h12
-rw-r--r--contrib/lukemftp/src/fetch.c45
-rw-r--r--contrib/lukemftp/src/ftp.1405
-rw-r--r--contrib/lukemftp/src/ftp.c35
-rw-r--r--contrib/lukemftp/src/ftp_var.h49
-rw-r--r--contrib/lukemftp/src/main.c43
-rw-r--r--contrib/lukemftp/src/progressbar.c463
-rw-r--r--contrib/lukemftp/src/progressbar.h99
-rw-r--r--contrib/lukemftp/src/ruserpass.c21
-rw-r--r--contrib/lukemftp/src/util.c429
-rw-r--r--contrib/lukemftp/src/version.h6
18 files changed, 4710 insertions, 561 deletions
diff --git a/contrib/lukemftp/FreeBSD-patchset b/contrib/lukemftp/FreeBSD-patchset
new file mode 100644
index 000000000000..cb592b652a57
--- /dev/null
+++ b/contrib/lukemftp/FreeBSD-patchset
@@ -0,0 +1,64 @@
+diff -ru src.orig/cmds.c src/cmds.c
+--- src.orig/cmds.c Sun Jun 15 22:11:43 2003
++++ src/cmds.c Sun Jun 15 21:46:37 2003
+@@ -131,6 +131,7 @@
+ #include <string.h>
+ #include <time.h>
+ #include <unistd.h>
++#include <libutil.h>
+
+ #include "ftp_var.h"
+ #include "version.h"
+diff -ru src.orig/fetch.c src/fetch.c
+--- src.orig/fetch.c Sun Jun 15 22:11:43 2003
++++ src/fetch.c Sun Jun 15 21:46:53 2003
+@@ -69,6 +69,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <time.h>
++#include <libutil.h>
+
+ #include "ftp_var.h"
+ #include "version.h"
+Only in src: ftp.cat1
+diff -ru src.orig/progressbar.c src/progressbar.c
+--- src.orig/progressbar.c Sun Jun 15 22:11:43 2003
++++ src/progressbar.c Sun Jun 15 21:50:48 2003
+@@ -50,6 +50,7 @@
+ */
+ #include <sys/types.h>
+ #include <sys/param.h>
++#include <sys/time.h>
+
+ #include <err.h>
+ #include <errno.h>
+@@ -57,10 +58,12 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <time.h>
+-#include <tzfile.h>
+ #include <unistd.h>
+
+ #include "progressbar.h"
++
++#define SECSPERHOUR 60
++#define SECSPERDAY ((long)60 * 60 * 24)
+
+ #if !defined(NO_PROGRESS)
+ /*
+diff -ru src.orig/util.c src/util.c
+--- src.orig/util.c Sun Jun 15 22:11:44 2003
++++ src/util.c Sun Jun 15 21:51:31 2003
+@@ -101,10 +101,11 @@
+ #include <string.h>
+ #include <termios.h>
+ #include <time.h>
+-#include <tzfile.h>
+ #include <unistd.h>
+
+ #include "ftp_var.h"
++
++#define TM_YEAR_BASE 1900
+
+ /*
+ * Connect to peer server and auto-login, if possible.
diff --git a/contrib/lukemftp/diffout b/contrib/lukemftp/diffout
new file mode 100644
index 000000000000..932f748734f9
--- /dev/null
+++ b/contrib/lukemftp/diffout
@@ -0,0 +1,3500 @@
+diff -Nru src/CVS/Entries /home/spock/ftp/CVS/Entries
+--- src/CVS/Entries Thu Jan 30 11:00:13 2003
++++ /home/spock/ftp/CVS/Entries Thu Jun 12 02:02:10 2003
+@@ -1,16 +1,17 @@
+-/Makefile.in/1.1.1.1/Thu Jul 19 16:26:12 2001//
+-/cmds.c/1.1.1.2/Sat Jun 15 09:40:32 2002//
+-/cmdtab.c/1.1.1.2/Sat Jun 15 09:40:33 2002//
+-/complete.c/1.1.1.1/Thu Jul 19 16:26:13 2001//
+-/domacro.c/1.1.1.2/Sat Jun 15 09:40:33 2002//
+-/extern.h/1.1.1.2/Sat Jun 15 09:40:33 2002//
+-/fetch.c/1.1.1.3/Sat Jun 15 09:40:34 2002//
+-/ftp.1/1.1.1.3/Sat Jun 15 09:40:35 2002//
+-/ftp.c/1.1.1.3/Sat Jun 15 09:40:36 2002//
+-/ftp.cat1/1.1.1.1/Sat Jun 15 09:40:31 2002//
+-/ftp_var.h/1.1.1.3/Sat Jun 15 09:40:36 2002//
+-/main.c/1.1.1.3/Sat Jun 15 09:40:36 2002//
+-/ruserpass.c/1.1.1.2/Sat Jun 15 09:40:36 2002//
+-/util.c/1.1.1.2/Sat Jun 15 09:40:37 2002//
+-/version.h/1.1.1.2/Sat Jun 15 09:40:37 2002//
++/Makefile/1.26/Tue Jan 21 16:08:06 2003//
++/cmds.c/1.100/Sat Nov 30 03:10:55 2002//
++/cmdtab.c/1.40/Mon Jul 29 04:24:47 2002//
++/complete.c/1.38/Mon May 1 10:35:17 2000//
++/domacro.c/1.19/Fri Feb 1 05:04:43 2002//
++/extern.h/1.61/Tue Jan 21 16:08:07 2003//
++/fetch.c/1.141/Wed May 14 14:31:00 2003//
++/ftp.1/1.94/Wed May 14 14:31:00 2003//
++/ftp.c/1.120/Wed Jun 5 10:20:49 2002//
++/ftp_var.h/1.64/Tue Jan 21 16:08:07 2003//
++/main.c/1.84/Wed May 14 14:31:00 2003//
++/progressbar.c/1.3/Fri Feb 28 09:53:49 2003//
++/progressbar.h/1.3/Fri Feb 28 09:53:49 2003//
++/ruserpass.c/1.28/Wed Nov 15 00:11:04 2000//
++/util.c/1.111/Fri Feb 28 09:54:51 2003//
++/version.h/1.30/Fri Feb 28 09:54:20 2003//
+ D
+diff -Nru src/CVS/Repository /home/spock/ftp/CVS/Repository
+--- src/CVS/Repository Thu Jan 30 11:00:13 2003
++++ /home/spock/ftp/CVS/Repository Thu Jun 12 02:02:10 2003
+@@ -1 +1 @@
+-src/contrib/lukemftp/src
++src/usr.bin/ftp
+diff -Nru src/CVS/Root /home/spock/ftp/CVS/Root
+--- src/CVS/Root Thu Jan 30 11:00:13 2003
++++ /home/spock/ftp/CVS/Root Thu Jun 12 02:02:09 2003
+@@ -1 +1 @@
+-spock@current:/cvs/ncvs
++:pserver:anoncvs@anoncvs.netbsd.org:/cvsroot
+diff -Nru src/Makefile /home/spock/ftp/Makefile
+--- src/Makefile Wed Dec 31 19:00:00 1969
++++ /home/spock/ftp/Makefile Thu Jun 12 02:02:10 2003
+@@ -0,0 +1,26 @@
++# $NetBSD: Makefile,v 1.26 2003/01/21 16:08:06 jhawk Exp $
++# from: @(#)Makefile 8.2 (Berkeley) 4/3/94
++
++PROG= ftp
++SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c \
++ progressbar.c ruserpass.c util.c
++
++# Uncomment the following to provide defaults for gate-ftp operation
++#
++#CPPFLAGS+=-DGATE_SERVER=\"ftp-gw.host\" # -DGATE_PORT=21
++
++.if defined(SMALLPROG)
++CPPFLAGS+=-DNO_EDITCOMPLETE -DNO_ABOUT
++.else
++LDADD+= -ledit -ltermcap
++DPADD+= ${LIBEDIT} ${LIBTERMCAP}
++.endif
++
++.if !defined(SMALLPROG) || defined(SMALLPROG_INET6)
++CPPFLAGS+= -DINET6
++.endif
++
++cmds.o fetch.o: version.h
++main.o: ftp_var.h
++
++.include <bsd.prog.mk>
+diff -Nru src/Makefile.in /home/spock/ftp/Makefile.in
+--- src/Makefile.in Thu Jul 19 12:26:12 2001
++++ /home/spock/ftp/Makefile.in Wed Dec 31 19:00:00 1969
+@@ -1,43 +0,0 @@
+-#
+-# $Id: Makefile.in,v 1.8 2000/08/08 07:04:27 lukem Exp $
+-#
+-
+-srcdir = @srcdir@
+-VPATH = @srcdir@
+-SHELL = /bin/sh
+-
+-prefix = @prefix@
+-exec_prefix = @exec_prefix@
+-bindir = @bindir@
+-mandir = @mandir@
+-transform = @program_transform_name@
+-
+-mandircat1 = ${mandir}/cat1
+-
+-CC = @CC@
+-CFLAGS = -I${srcdir} -I${srcdir}/.. -I. -I.. @INCLUDES@ @CFLAGS@
+-LIBS = @LIBS@
+-LDFLAGS = @LDFLAGS@
+-
+-INSTALL = @INSTALL@
+-
+-PROG = ftp
+-OBJS = cmds.o cmdtab.o complete.o domacro.o fetch.o ftp.o main.o \
+- ruserpass.o util.o
+-
+-all: ${PROG}
+-
+-install: all
+- -mkdir -p ${bindir}
+- ${INSTALL} -m 555 ${PROG} ${bindir}/`echo ${PROG}|sed '$(transform)'`
+- -mkdir -p ${mandircat1}
+- ${INSTALL} -m 444 ${srcdir}/${PROG}.cat1 ${mandircat1}/`echo ${PROG}|sed '$(transform)'`.1
+-
+-${PROG}: ${OBJS} @LIBDEPENDS@
+- ${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} ${OBJS} ${LIBS}
+-
+-clean:
+- rm -f core ${PROG} ${OBJS}
+-
+-distclean: clean
+- rm -f Makefile
+diff -Nru src/cmds.c /home/spock/ftp/cmds.c
+--- src/cmds.c Sat Jun 15 05:40:32 2002
++++ /home/spock/ftp/cmds.c Thu Jun 12 02:02:10 2003
+@@ -1,4 +1,4 @@
+-/* $NetBSD: cmds.c,v 1.98 2002/06/05 10:20:46 lukem Exp $ */
++/* $NetBSD: cmds.c,v 1.100 2002/11/30 03:10:55 lukem Exp $ */
+
+ /*-
+ * Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
+@@ -102,11 +102,35 @@
+ * SUCH DAMAGE.
+ */
+
++#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.100 2002/11/30 03:10:55 lukem Exp $");
++#endif
++#endif /* not lint */
++
+ /*
+ * FTP User Program -- Command Routines.
+ */
+-
+-#include "lukemftp.h"
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <sys/stat.h>
++#include <sys/wait.h>
++#include <arpa/ftp.h>
++
++#include <ctype.h>
++#include <err.h>
++#include <glob.h>
++#include <limits.h>
++#include <netdb.h>
++#include <paths.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <time.h>
++#include <unistd.h>
+
+ #include "ftp_var.h"
+ #include "version.h"
+@@ -1008,7 +1032,7 @@
+ gatemode = 0;
+ else {
+ if (argc == 3)
+- gateport = strdup(argv[2]);
++ gateport = xstrdup(argv[2]);
+ (void)strlcpy(gsbuf, argv[1], sizeof(gsbuf));
+ gateserver = gsbuf;
+ gatemode = 1;
+diff -Nru src/cmdtab.c /home/spock/ftp/cmdtab.c
+--- src/cmdtab.c Sat Jun 15 05:40:33 2002
++++ /home/spock/ftp/cmdtab.c Thu Jun 12 02:02:10 2003
+@@ -1,4 +1,4 @@
+-/* $NetBSD: cmdtab.c,v 1.39 2000/11/15 00:10:59 lukem Exp $ */
++/* $NetBSD: cmdtab.c,v 1.40 2002/07/29 04:24:47 lukem Exp $ */
+
+ /*-
+ * Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
+@@ -69,8 +69,16 @@
+ * SUCH DAMAGE.
+ */
+
+-#include "lukemftp.h"
++#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.40 2002/07/29 04:24:47 lukem Exp $");
++#endif
++#endif /* not lint */
+
++#include <stdio.h>
+ #include "ftp_var.h"
+
+ /*
+@@ -123,7 +131,7 @@
+ char ntranshelp[] = "set translation table for default file name mapping";
+ char optshelp[] = "show or set options for remote commands";
+ char pagehelp[] = "view a remote file through your pager";
+-char passivehelp[] = "enter passive transfer mode";
++char passivehelp[] = "toggle use of passive transfer mode";
+ char plshelp[] = "list contents of remote path through your pager";
+ char pmlsdhelp[] = "list contents of remote directory in a machine "
+ "parsable form through your pager";
+diff -Nru src/complete.c /home/spock/ftp/complete.c
+--- src/complete.c Thu Jul 19 12:26:13 2001
++++ /home/spock/ftp/complete.c Thu Jun 12 02:02:10 2003
+@@ -36,11 +36,23 @@
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
++#include <sys/cdefs.h>
++#ifndef lint
++__RCSID("$NetBSD: complete.c,v 1.38 2000/05/01 10:35:17 lukem Exp $");
++#endif /* not lint */
++
+ /*
+ * FTP user program - command and file completion routines
+ */
+
+-#include "lukemftp.h"
++#include <sys/stat.h>
++
++#include <ctype.h>
++#include <err.h>
++#include <dirent.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
+
+ #include "ftp_var.h"
+
+diff -Nru src/domacro.c /home/spock/ftp/domacro.c
+--- src/domacro.c Sat Jun 15 05:40:33 2002
++++ /home/spock/ftp/domacro.c Thu Jun 12 02:02:10 2003
+@@ -33,7 +33,18 @@
+ * SUCH DAMAGE.
+ */
+
+-#include "lukemftp.h"
++#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.19 2002/02/01 05:04:43 itojun Exp $");
++#endif
++#endif /* not lint */
++
++#include <ctype.h>
++#include <stdio.h>
++#include <string.h>
+
+ #include "ftp_var.h"
+
+diff -Nru src/extern.h /home/spock/ftp/extern.h
+--- src/extern.h Sat Jun 15 05:40:33 2002
++++ /home/spock/ftp/extern.h Thu Jun 12 02:02:10 2003
+@@ -1,7 +1,7 @@
+-/* $NetBSD: extern.h,v 1.60 2000/10/11 14:46:03 is Exp $ */
++/* $NetBSD: extern.h,v 1.61 2003/01/21 16:08:07 jhawk Exp $ */
+
+ /*-
+- * Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
++ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+@@ -110,7 +110,6 @@
+ void abortxfer(int);
+ void account(int, char **);
+ void ai_unmapped(struct addrinfo *);
+-void alarmtimer(int);
+ int another(int *, char ***, const char *);
+ int auto_fetch(int, char **);
+ int auto_put(int, char **, const char *);
+@@ -123,7 +122,7 @@
+ 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);
+@@ -183,14 +182,11 @@
+ void page(int, char **);
+ int parseport(const char *, int);
+ int parserate(int, char **, int);
+-void progressmeter(int);
+ char *prompt(void);
+ void proxabort(int);
+ void proxtrans(const char *, const char *, const char *);
+ void psabort(int);
+-void psummary(int);
+ void pswitch(int);
+-void ptransfer(int);
+ void put(int, char **);
+ void pwd(int, char **);
+ void quit(int, char **);
+@@ -263,5 +259,3 @@
+ StringList *xsl_init(void);
+ void xsl_add(StringList *, char *);
+ char *xstrdup(const char *);
+-sigfunc xsignal(int, sigfunc);
+-sigfunc xsignal_restart(int, sigfunc, int);
+diff -Nru src/fetch.c /home/spock/ftp/fetch.c
+--- src/fetch.c Sun Feb 16 14:45:52 2003
++++ /home/spock/ftp/fetch.c Thu Jun 12 02:02:11 2003
+@@ -1,7 +1,7 @@
+-/* $NetBSD: fetch.c,v 1.136 2002/06/05 10:20:48 lukem Exp $ */
++/* $NetBSD: fetch.c,v 1.141 2003/05/14 14:31:00 wiz Exp $ */
+
+ /*-
+- * Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
++ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+@@ -39,11 +39,36 @@
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
++#include <sys/cdefs.h>
++#ifndef lint
++__RCSID("$NetBSD: fetch.c,v 1.141 2003/05/14 14:31:00 wiz Exp $");
++#endif /* not lint */
++
+ /*
+ * FTP User Program -- Command line file retrieval
+ */
+
+-#include "lukemftp.h"
++#include <sys/types.h>
++#include <sys/param.h>
++#include <sys/socket.h>
++#include <sys/stat.h>
++#include <sys/time.h>
++
++#include <netinet/in.h>
++
++#include <arpa/ftp.h>
++#include <arpa/inet.h>
++
++#include <ctype.h>
++#include <err.h>
++#include <errno.h>
++#include <netdb.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <time.h>
+
+ #include "ftp_var.h"
+ #include "version.h"
+@@ -155,7 +180,7 @@
+ *response = (char *)xmalloc(rlen);
+ (void)strlcpy(*response, scheme, rlen);
+ len = strlcat(*response, " ", rlen);
+- base64_encode(clear, clen, *response + len);
++ base64_encode(clear, clen, (u_char *)*response + len);
+ memset(clear, 0, clen);
+ rval = 0;
+
+@@ -235,12 +260,12 @@
+ * XXX: this is not totally RFC 1738 compliant; <path> will have the
+ * leading `/' unless it's an ftp:// URL, as this makes things easier
+ * for file:// and http:// URLs. ftp:// URLs have the `/' between the
+- * host and the url-path removed, but any additional leading slashes
+- * in the url-path are retained (because they imply that we should
++ * host and the URL-path removed, but any additional leading slashes
++ * in the URL-path are retained (because they imply that we should
+ * later do "CWD" with a null argument).
+ *
+ * Examples:
+- * input url output path
++ * input URL output path
+ * --------- -----------
+ * "ftp://host" NULL
+ * "http://host/" NULL
+@@ -484,7 +509,8 @@
+ rval = fetch_ftp(url);
+ goto cleanup_fetch_url;
+ }
+- warnx("Invalid URL (no file after directory) `%s'", url);
++ warnx("no file after directory (you must specify an "
++ "output file) `%s'", url);
+ goto cleanup_fetch_url;
+ } else {
+ if (debug)
+@@ -1372,7 +1398,7 @@
+ dir ? dir : "<null>", file ? file : "<null>");
+
+ dirhasglob = filehasglob = 0;
+- if (doglob && (urltype == CLASSIC_URL_T || urltype == FTP_URL_T)) {
++ if (doglob && urltype == CLASSIC_URL_T) {
+ if (! EMPTYSTRING(dir) && strpbrk(dir, "*?[]{}") != NULL)
+ dirhasglob = 1;
+ if (! EMPTYSTRING(file) && strpbrk(file, "*?[]{}") != NULL)
+@@ -1741,7 +1767,7 @@
+ }
+ }
+ if (debug)
+- fprintf(ttyout, "auto_put: url `%s' argv[2] `%s'\n",
++ fprintf(ttyout, "auto_put: URL `%s' argv[2] `%s'\n",
+ path, uargv[2] ? uargv[2] : "<null>");
+
+ /* connect and cwd */
+diff -Nru src/ftp.1 /home/spock/ftp/ftp.1
+--- src/ftp.1 Sat Jun 15 05:40:35 2002
++++ /home/spock/ftp/ftp.1 Thu Jun 12 02:02:11 2003
+@@ -1,6 +1,6 @@
+-.\" $NetBSD: ftp.1,v 1.83 2002/06/05 10:20:48 lukem Exp $
++.\" $NetBSD: ftp.1,v 1.94 2003/05/14 14:31:00 wiz Exp $
+ .\"
+-.\" Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
++.\" Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
+ .\" All rights reserved.
+ .\"
+ .\" This code is derived from software contributed to The NetBSD Foundation
+@@ -68,7 +68,7 @@
+ .\"
+ .\" @(#)ftp.1 8.3 (Berkeley) 10/9/94
+ .\"
+-.Dd May 18, 2002
++.Dd January 20, 2003
+ .Dt FTP 1
+ .Os
+ .Sh NAME
+@@ -76,7 +76,7 @@
+ .Nd
+ Internet file transfer program
+ .Sh SYNOPSIS
+-.Nm ""
++.Nm
+ .Op Fl 46AadefginpRtvV
+ .Bk -words
+ .Op Fl N Ar netrc
+@@ -88,46 +88,81 @@
+ .Op Fl P Ar port
+ .Ek
+ .Bk -words
++.Op Fl q Ar quittime
++.Ek
++.Bk -words
+ .Op Fl r Ar retry
+ .Ek
+ .Bk -words
++.\" [-T dir,max[,inc]]
+ .Oo
+-.Fl T
++.Fl T Xo
+ .Sm off
+-.Xo
+ .Ar dir ,
+ .Ar max
+ .Op , Ar inc
+-.Xc
+ .Sm on
++.Xc
+ .Oc
+ .Ek
+ .Bk -words
++.\" [[user@]host [port]]
+ .Oo
+-[\fIuser\fR@]\fIhost\fR
++.Oo Ar user Ns Li \&@ Oc Ns Ar host
+ .Op Ar port
+ .Oc
+ .Ek
+ .Bk -words
+-[\fIuser\fR@]\fIhost\fR:[\fIpath\fR][/]
++.\" [[user@]host:[path][/]]
++.Sm off
++.Oo
++.Op Ar user Li \&@
++.Ar host Li \&:
++.Op Ar path
++.Op Li /
++.Oc
++.Sm on
+ .Ek
+ .Bk -words
+-.Op file:///\fIpath\fR
++.\" [file:///path]
++.Sm off
++.Oo
++.Li file:/// Ar path
++.Oc
++.Sm on
+ .Ek
+ .Bk -words
+-.Op ftp://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR[/]
++.\" [ftp://[user[:password]@]host[:port]/path[/]]
++.Sm off
++.Oo
++.Li ftp://
++.Oo Ar user
++.Op Li \&: Ar password
++.Li \&@ Oc
++.Ar host Oo Li \&: Ar port Oc
++.Li / Ar path
++.Op Li /
++.Op Li ;type= Ar X
++.Oc
++.Sm on
+ .Ek
+ .Bk -words
+-.Op http://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR
++.\" [http://[user[:password]@]host[:port]/path]
++.Sm off
++.Oo
++.Li http://
++.Oo Ar user
++.Op Li \&: Ar password
++.Li \&@ Oc
++.Ar host Oo Li \&: Ar port Oc
++.Li / Ar path
++.Oc
++.Sm on
+ .Ek
+ .Op Ar \&.\&.\&.
+-.Nm ""
+-.Fl u Ar url
+-.\".Ar ftp://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR[/[file]]
+-.\"|
+-.\".Ar [\fIuser\fR@]\fIhost\fR:[\fIpath\fR][/[\fIfile\fR]]
++.Nm
+ .Bk -words
+-file
++.Fl u Ar URL Ar file
+ .Ek
+ .Op Ar \&.\&.\&.
+ .Sh DESCRIPTION
+@@ -243,6 +278,10 @@
+ Retry the connection attempt if it failed, pausing for
+ .Ar wait
+ seconds.
++.It Fl q Ar quittime
++Quit if the connection has stalled for
++.Ar quittime
++seconds.
+ .It Fl R
+ Restart all non-proxied auto-fetches.
+ .It Fl t
+@@ -266,11 +305,11 @@
+ Refer to
+ .Ic rate
+ for more information.
+-.It Fl u Ar url file Op \&.\&.\&.
++.It Fl u Ar URL file Op \&.\&.\&.
+ Upload files on the command line to
+-.Ar url
++.Ar URL
+ where
+-.Ar url
++.Ar URL
+ is one of the ftp URL types as supported by auto-fetch
+ (with an optional target filename for single file uploads), and
+ .Ar file
+@@ -869,7 +908,7 @@
+ .Tn FTP
+ server at that port.
+ If the
+-.Ic auto-login
++.Ic "set auto-login"
+ option is on (default),
+ .Nm
+ will also attempt to automatically log the user in to
+@@ -882,10 +921,10 @@
+ and display with the program specified by the
+ .Ic "set pager"
+ option.
+-.It Ic passive Op Ic auto
++.It Ic passive Op Cm auto
+ Toggle passive mode (if no arguments are given).
+ If
+-.Ic auto
++.Cm auto
+ is given, act as if
+ .Ev FTPMODE
+ is set to
+@@ -896,14 +935,17 @@
+ .Dv PASV
+ command for all data connections instead of a
+ .Dv PORT
+-command. The
++command.
++The
+ .Dv PASV
+ command requests that the remote server open a port for the data connection
+-and return the address of that port. The remote server listens on that
+-port and the client connects to it. When using the more traditional
++and return the address of that port.
++The remote server listens on that port and the client connects to it.
++When using the more traditional
+ .Dv PORT
+ command, the client listens on a port and sends that address to the remote
+-server, who connects back to it. Passive mode is useful when using
++server, who connects back to it.
++Passive mode is useful when using
+ .Nm
+ through a gateway router or host that controls the directionality of
+ traffic.
+@@ -965,34 +1007,34 @@
+ .Pp
+ When prompting is on, the following commands are available at a prompt:
+ .Bl -tag -width 2n -offset indent
+-.It Ic a
++.It Cm a
+ Answer
+ .Sq yes
+ to the current file, and automatically answer
+ .Sq yes
+ to any remaining files for the current command.
+-.It Ic n
++.It Cm n
+ Answer
+ .Sq no ,
+ and do not transfer the file.
+-.It Ic p
++.It Cm p
+ Answer
+ .Sq yes
+ to the current file, and turn off prompt mode
+ (as is
+ .Dq prompt off
+ had been given).
+-.It Ic q
++.It Cm q
+ Terminate the current operation.
+-.It Ic y
++.It Cm y
+ Answer
+ .Sq yes ,
+ and transfer the file.
+-.It Ic ?
++.It Cm ?
+ Display a help message.
+ .El
+ .Pp
+-Any other reponse will answer
++Any other response will answer
+ .Sq yes
+ to the current file.
+ .It Ic proxy Ar ftp-command
+@@ -1072,11 +1114,11 @@
+ .Ar direction
+ may be one of:
+ .Bl -tag -width "all" -offset indent -compact
+-.It Ic all
++.It Cm all
+ Both directions.
+-.It Ic get
++.It Cm get
+ Incoming transfers.
+-.It Ic put
++.It Cm put
+ Outgoing transfers.
+ .El
+ .Pp
+@@ -1240,7 +1282,7 @@
+ implementations which do ignore
+ .Dv PORT
+ commands but, incorrectly, indicate they've been accepted.
+-.It Ic set Op Ar "option value"
++.It Ic set Op Ar option Ar value
+ Set
+ .Ar option
+ to
+@@ -1252,25 +1294,25 @@
+ are not given, display all of the options and their values.
+ The currently supported options are:
+ .Bl -tag -width "http_proxy" -offset indent
+-.It anonpass
++.It Cm anonpass
+ Defaults to
+ .Ev $FTPANONPASS
+-.It ftp_proxy
++.It Cm ftp_proxy
+ Defaults to
+ .Ev $ftp_proxy .
+-.It http_proxy
++.It Cm http_proxy
+ Defaults to
+ .Ev $http_proxy .
+-.It no_proxy
++.It Cm no_proxy
+ Defaults to
+ .Ev $no_proxy .
+-.It pager
++.It Cm pager
+ Defaults to
+ .Ev $PAGER .
+-.It prompt
++.It Cm prompt
+ Defaults to
+ .Ev $FTPPROMPT .
+-.It rprompt
++.It Cm rprompt
+ Defaults to
+ .Ev $FTPRPROMPT .
+ .El
+@@ -1415,13 +1457,14 @@
+ interpretation of the argument.
+ Supported suffixes are:
+ .Bl -tag -width 3n -offset indent -compact
+-.It b
+-Causes no modification. (Optional)
+-.It k
++.It Li b
++Causes no modification.
++(Optional)
++.It Li k
+ Kilo; multiply the argument by 1024
+-.It m
++.It Li m
+ Mega; multiply the argument by 1048576
+-.It g
++.It Li g
+ Giga; multiply the argument by 1073741824
+ .El
+ .Pp
+@@ -1447,7 +1490,15 @@
+ .Pp
+ The following formats are valid syntax for an auto-fetch element:
+ .Bl -tag -width "FOO "
+-.It [user@]host:[path][/]
++.\" [user@]host:[path][/]
++.It Xo
++.Sm off
++.Op Ar user Li \&@
++.Ar host Li \&:
++.Op Ar path
++.Op Li /
++.Sm on
++.Xc
+ .Dq Classic
+ .Tn FTP
+ format.
+@@ -1471,7 +1522,19 @@
+ in the current directory.
+ Otherwise, the full remote name is used as the local name,
+ relative to the local root directory.
+-.It ftp://[user[:password]@]host[:port]/path[/][;type=X]
++.\" ftp://[user[:password]@]host[:port]/path[/][;type=X]
++.It Xo
++.Sm off
++.Li ftp://
++.Oo Ar user
++.Op Li \&: Ar password
++.Li \&@ Oc
++.Ar host Oo Li \&: Ar port Oc
++.Li / Ar path
++.Op Li /
++.Op Li ;type= Ar X
++.Sm on
++.Xc
+ An
+ .Tn FTP
+ URL, retrieved using the
+@@ -1493,15 +1556,94 @@
+ .Ar password
+ if supplied, otherwise prompt the user for one.
+ .Pp
++If a suffix of
++.Sq ;type=A
++or
++.Sq ;type=I
++is supplied, then the transfer type will take place as
++ascii or binary (respectively).
++The default transfer type is binary.
++.Pp
+ In order to be compliant with
+ .Cm RFC 1738 ,
+ .Nm
+-strips the leading
+-.Sq /
+-from
++interprets the
++.Ar path
++part of an
++.Dq ftp://
++auto-fetch URL as follows:
++.Bl -bullet
++.It
++The
++.Sq Li /
++immediately after the
++.Ar host Ns Oo Li \&: Ns Ar port Oc
++is interpreted as a separator before the
++.Ar path ,
++and not as part of the
++.Ar path
++itself.
++.It
++The
++.Ar path
++is interpreted as a
++.So Li / Sc Ns -separated
++list of name components.
++For all but the last such component,
++.Nm
++performs the equivalent of a
++.Ic cd
++command.
++For the last path component,
++.Nm
++performs the equivalent of a
++.Ic get
++command.
++.It
++Empty name components,
++which result from
++.Sq Li //
++within the
++.Ar path ,
++or from an extra
++.Sq Li /
++at the beginning of the
+ .Ar path ,
+-resulting in a transfer relative from the default login directory of
+-the user.
++will cause the equivalent of a
++.Ic cd
++command without a directory name.
++This is unlikely to be useful.
++.It
++Any
++.Sq Li \&% Ns Ar XX
++codes within the path components are decoded, with
++.Ar XX
++representing a character code in hexadecimal.
++This decoding takes place after the
++.Ar path
++has been split into components,
++but before each component is used in the equivalent of a
++.Ic cd
++or
++.Ic get
++command.
++Some often-used codes are
++.Sq Li \&%2F
++(which represents
++.Sq Li / )
++and
++.Sq Li \&%7E
++(which represents
++.Sq Li ~ ) .
++.El
++.Pp
++The above interpretation has the following consequences:
++.Bl -bullet
++.It
++The path is interpreted relative to the
++default login directory of the specified user or of the
++.Sq anonymous
++user.
+ If the
+ .Pa /
+ directory is required, use a leading path of
+@@ -1519,15 +1661,57 @@
+ .Sq mypass ,
+ use
+ .Dq ftp://myname:mypass@localhost/%2fetc/motd
+-.Pp
+-If a suffix of
+-.Sq ;type=A
+-or
+-.Sq ;type=I
+-is supplied, then the transfer type will take place as
+-ascii or binary (respectively).
+-The default transfer type is binary.
+-.It http://[user[:password]@]host[:port]/path
++.It
++The exact
++.Ic cd
++and
++.Ic get
++commands can be controlled by careful choice of
++where to use
++.Sq /
++and where to use
++.Sq %2F
++(or
++.Sq %2f ) .
++For example, the following URLs correspond to the
++equivalents of the indicated commands:
++.Bl -tag -width "ftp://host/%2Fdir1%2Fdir2%2Ffile"
++.It ftp://host/dir1/dir2/file
++.Dq "cd dir1" ,
++.Dq "cd dir2" ,
++.Dq "get file" .
++.It ftp://host/%2Fdir1/dir2/file
++.Dq "cd /dir1" ,
++.Dq "cd dir2" ,
++.Dq "get file" .
++.It ftp://host/dir1%2Fdir2/file
++.Dq "cd dir1/dir2" ,
++.Dq "get file" .
++.It ftp://host/%2Fdir1%2Fdir2/file
++.Dq "cd /dir1/dir2" ,
++.Dq "get file" .
++.It ftp://host/dir1%2Fdir2%2Ffile
++.Dq "get dir1/dir2/file" .
++.It ftp://host/%2Fdir1%2Fdir2%2Ffile
++.Dq "get /dir1/dir2/file" .
++.El
++.It
++You must have appropriate access permission for each of the
++intermediate directories that is used in the equivalent of a
++.Ic cd
++command.
++.El
++.\" http://[user[:password]@]host[:port]/path
++.It Xo
++.Sm off
++.Li http://
++.Oo Ar user
++.Op Li \&: Ar password
++.Li \&@ Oc
++.Ar host Oo Li \&: Ar port Oc
++.Li / Ar path
++.Sm on
++.Xc
+ An
+ .Tn HTTP
+ URL, retrieved using the
+@@ -1540,16 +1724,22 @@
+ proxy server.
+ If
+ .Tn HTTP
+-authorisation is required to retrieve
++authorization is required to retrieve
+ .Ar path ,
+ and
+ .Sq user
+ (and optionally
+ .Sq password )
+ is in the URL, use them for the first attempt to authenticate.
+-.It file:///path
++.\" file:///path
++.It Xo
++.Sm off
++.Li file:/// Ar path
++.Sm on
++.Xc
+ A local URL, copied from
+-.Ar /path .
++.Pa / Ns Ar path
++on the local host.
+ .El
+ .Pp
+ Unless noted otherwise above, and
+@@ -1736,7 +1926,7 @@
+ .Nm
+ supports only the default values for the remaining
+ file transfer parameters:
+-.Ic mode ,
++.Ic mode ,
+ .Ic form ,
+ and
+ .Ic struct .
+@@ -1841,6 +2031,14 @@
+ .Ic init
+ is defined, it is automatically executed as the last step in the
+ auto-login process.
++For example,
++.Bd -literal -offset indent
++default
++macdef init
++epsv4 off
++.Ed
++.Pp
++followed by a blank line.
+ .El
+ .Sh COMMAND LINE EDITING
+ .Nm
+@@ -1888,9 +2086,20 @@
+ The following formatting sequences are replaced by the given
+ information:
+ .Bl -tag -width "%% " -offset indent
+-.It %/
++.It Li \&%/
+ The current remote working directory.
+-.It %c[[0]\fIn\fR], %.[[0]\fIn\fR]
++.\" %c[[0]n], %.[[0]n]
++.It Xo
++.Sm off
++.Li \&%c
++.Op Oo Li 0 Oc Ar n
++.Sm on
++.No ,
++.Sm off
++.Li \&%.
++.Op Oo Li 0 Oc Ar n
++.Sm on
++.Xc
+ The trailing component of the current remote working directory, or
+ .Em n
+ trailing components if a digit
+@@ -1902,21 +2111,28 @@
+ .Sq 0 ,
+ the number of skipped components precede the trailing component(s) in
+ the format
+-.Dq /\fI\*[Lt]skipped\*[Gt]\fRtrailing
++.\" ``/<number>trailing''
++.Do
++.Sm off
++.Li / Li \*[Lt] Va number Li \*[Gt]
++.Va trailing
++.Sm on
++.Dc
+ (for
+-.Sq %c )
++.Sq \&%c )
+ or
+-.Dq ...trailing
++.\" ``...trailing''
++.Dq Li \&... Ns Va trailing
+ (for
+-.Sq %. ) .
+-.It %M
++.Sq \&%. ) .
++.It Li \&%M
+ The remote host name.
+-.It %m
++.It Li \&%m
+ The remote host name, up to the first
+ .Sq \&. .
+-.It %n
++.It Li \&%n
+ The remote user name.
+-.It %%
++.It Li \&%%
+ A single
+ .Sq % .
+ .El
+@@ -1934,15 +2150,15 @@
+ Overrides the default operation mode.
+ Support values are:
+ .Bl -tag -width "passive"
+-.It active
++.It Cm active
+ active mode
+ .Tn FTP
+ only
+-.It auto
++.It Cm auto
+ automatic determination of passive or active (this is the default)
+-.It gate
++.It Cm gate
+ gate-ftp mode
+-.It passive
++.It Cm passive
+ passive mode
+ .Tn FTP
+ only
+@@ -2028,6 +2244,21 @@
+ Each entry may have an optional trailing ":port", which restricts
+ the matching to connections to that port.
+ .El
++.Sh EXTENDED PASSIVE MODE AND FIREWALLS
++Some firewall configurations do not allow
++.Nm
++to use extended passive mode.
++If you find that even a simple
++.Ic ls
++appears to hang after printing a message such as this:
++.Pp
++.Dl 229 Entering Extended Passive Mode (|||58551|)
++.Pp
++then you will need to disable extended passive mode with
++.Ic epsv4 off .
++See the above section
++.Sx The .netrc File
++for an example of how to make this automatic.
+ .Sh SEE ALSO
+ .Xr getservbyname 3 ,
+ .Xr editrc 5 ,
+@@ -2061,7 +2292,9 @@
+ were implemented in
+ .Nx 1.3
+ and later releases
+-by Luke Mewburn \*[Lt]lukem@netbsd.org\*[Gt].
++by
++.An Luke Mewburn
++.Aq lukem@NetBSD.org .
+ .Pp
+ IPv6 support was added by the WIDE/KAME project
+ (but may not be present in all non-NetBSD versions of this program, depending
+diff -Nru src/ftp.c /home/spock/ftp/ftp.c
+--- src/ftp.c Sat Jun 15 05:40:36 2002
++++ /home/spock/ftp/ftp.c Thu Jun 12 02:02:11 2003
+@@ -98,9 +98,40 @@
+ * SUCH DAMAGE.
+ */
+
+-#include "lukemftp.h"
++#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.120 2002/06/05 10:20:49 lukem Exp $");
++#endif
++#endif /* not lint */
+
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/socket.h>
++#include <sys/time.h>
++
++#include <netinet/in.h>
++#include <netinet/in_systm.h>
++#include <netinet/ip.h>
++#include <arpa/inet.h>
++#include <arpa/ftp.h>
+ #include <arpa/telnet.h>
++
++#include <ctype.h>
++#include <err.h>
++#include <errno.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <time.h>
++#include <unistd.h>
++#include <stdarg.h>
++#ifndef USE_SELECT
++#include <poll.h>
++#endif
+
+ #include "ftp_var.h"
+
+diff -Nru src/ftp.cat1 /home/spock/ftp/ftp.cat1
+--- src/ftp.cat1 Sat Jun 15 05:40:31 2002
++++ /home/spock/ftp/ftp.cat1 Wed Dec 31 19:00:00 1969
+@@ -1,1055 +0,0 @@
+-FTP(1) NetBSD Reference Manual FTP(1)
+-
+-NNAAMMEE
+- ffttpp - Internet file transfer program
+-
+-SSYYNNOOPPSSIISS
+- ffttpp [--4466AAaaddeeffggiinnppRRttvvVV] [--NN _n_e_t_r_c] [--oo _o_u_t_p_u_t] [--PP _p_o_r_t] [--rr _r_e_t_r_y] [--TT
+- _d_i_r,_m_a_x[,_i_n_c]] [[_u_s_e_r@]_h_o_s_t [_p_o_r_t]] [_u_s_e_r@]_h_o_s_t:[_p_a_t_h][/]
+- [file:///_p_a_t_h] [ftp://[_u_s_e_r[:_p_a_s_s_w_o_r_d]@]_h_o_s_t[:_p_o_r_t]/_p_a_t_h[/]]
+- [http://[_u_s_e_r[:_p_a_s_s_w_o_r_d]@]_h_o_s_t[:_p_o_r_t]/_p_a_t_h] [_._._.]
+- ffttpp --uu _u_r_l file [_._._.]
+-
+-DDEESSCCRRIIPPTTIIOONN
+- ffttpp is the user interface to the Internet standard File Transfer Proto-
+- col. The program allows a user to transfer files to and from a remote
+- network site.
+-
+- The last five arguments will fetch a file using the FTP or HTTP proto-
+- cols, or by direct copying, into the current directory. This is ideal
+- for scripts. Refer to _A_U_T_O_-_F_E_T_C_H_I_N_G _F_I_L_E_S below for more information.
+-
+- Options may be specified at the command line, or to the command inter-
+- preter.
+-
+- --44 Forces ffttpp to only use IPv4 addresses.
+-
+- --66 Forces ffttpp to only use IPv6 addresses.
+-
+- --AA Force active mode ftp. By default, ffttpp will try to use passive
+- mode ftp and fall back to active mode if passive is not support-
+- ed by the server. This option causes ffttpp to always use an ac-
+- tive connection. It is only useful for connecting to very old
+- servers that do not implement passive mode properly.
+-
+- --aa Causes ffttpp to bypass normal login procedure, and use an anony-
+- mous login instead.
+-
+- --dd Enables debugging.
+-
+- --ee Disables command line editing. This is useful for Emacs ange-
+- ftp mode.
+-
+- --ff Forces a cache reload for transfers that go through the FTP or
+- HTTP proxies.
+-
+- --gg Disables file name globbing.
+-
+- --ii Turns off interactive prompting during multiple file transfers.
+-
+- --nn Restrains ffttpp from attempting ``auto-login'' upon initial con-
+- nection. If auto-login is enabled, ffttpp will check the _._n_e_t_r_c
+- (see below) file in the user's home directory for an entry de-
+- scribing an account on the remote machine. If no entry exists,
+- ffttpp will prompt for the remote machine login name (default is
+- the user identity on the local machine), and, if necessary,
+- prompt for a password and an account with which to login.
+-
+- --NN _n_e_t_r_c
+- Use _n_e_t_r_c instead of _~_/_._n_e_t_r_c. Refer to _T_H_E _._n_e_t_r_c _F_I_L_E for
+- more information.
+-
+- --oo _o_u_t_p_u_t
+- When auto-fetching files, save the contents in _o_u_t_p_u_t. _o_u_t_p_u_t
+- is parsed according to the _F_I_L_E _N_A_M_I_N_G _C_O_N_V_E_N_T_I_O_N_S below. If
+- _o_u_t_p_u_t is not `-' or doesn't start with `|', then only the first
+- file specified will be retrieved into _o_u_t_p_u_t; all other files
+- will be retrieved into the basename of their remote name.
+-
+- --pp Enable passive mode operation for use behind connection filter-
+- ing firewalls. This option has been deprecated as ffttpp now tries
+- to use passive mode by default, falling back to active mode if
+- the server does not support passive connections.
+-
+- --PP _p_o_r_t Sets the port number to _p_o_r_t.
+-
+- --rr _w_a_i_t Retry the connection attempt if it failed, pausing for _w_a_i_t sec-
+- onds.
+-
+- --RR Restart all non-proxied auto-fetches.
+-
+- --tt Enables packet tracing.
+-
+- --TT _d_i_r_e_c_t_i_o_n,_m_a_x_i_m_u_m[,_i_n_c_r_e_m_e_n_t]
+- Set the maximum transfer rate for _d_i_r_e_c_t_i_o_n to _m_a_x_i_m_u_m
+- bytes/second, and if specified, the increment to _i_n_c_r_e_m_e_n_t
+- bytes/second. Refer to rraattee for more information.
+-
+- --uu _u_r_l _f_i_l_e [...]
+- Upload files on the command line to _u_r_l where _u_r_l is one of the
+- ftp URL types as supported by auto-fetch (with an optional tar-
+- get filename for single file uploads), and _f_i_l_e is one or more
+- local files to be uploaded.
+-
+- --vv Enable vveerrbboossee and pprrooggrreessss. This is the default if output is
+- to a terminal (and in the case of pprrooggrreessss, ffttpp is the fore-
+- ground process). Forces ffttpp to show all responses from the re-
+- mote server, as well as report on data transfer statistics.
+-
+- --VV Disable vveerrbboossee and pprrooggrreessss, overriding the default of enabled
+- when output is to a terminal.
+-
+- The client host with which ffttpp is to communicate may be specified on the
+- command line. If this is done, ffttpp will immediately attempt to establish
+- a connection to an FTP server on that host; otherwise, ffttpp will enter its
+- command interpreter and await instructions from the user. When ffttpp is
+- awaiting commands from the user the prompt `ftp>' is provided to the us-
+- er. The following commands are recognized by ffttpp:
+-
+- !! [_c_o_m_m_a_n_d [_a_r_g_s]]
+- Invoke an interactive shell on the local machine. If there
+- are arguments, the first is taken to be a command to execute
+- directly, with the rest of the arguments as its arguments.
+-
+- $$ _m_a_c_r_o_-_n_a_m_e [_a_r_g_s]
+- Execute the macro _m_a_c_r_o_-_n_a_m_e that was defined with the mmaaccddeeff
+- command. Arguments are passed to the macro unglobbed.
+-
+- aaccccoouunntt [_p_a_s_s_w_d]
+- Supply a supplemental password required by a remote system
+- for access to resources once a login has been successfully
+- completed. If no argument is included, the user will be
+- prompted for an account password in a non-echoing input mode.
+-
+- aappppeenndd _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e]
+- Append a local file to a file on the remote machine. If
+- _r_e_m_o_t_e_-_f_i_l_e is left unspecified, the local file name is used
+- in naming the remote file after being altered by any nnttrraannss
+- or nnmmaapp setting. File transfer uses the current settings for
+- ttyyppee, ffoorrmmaatt, mmooddee, and ssttrruuccttuurree.
+-
+- aasscciiii Set the file transfer ttyyppee to network ASCII. This is the de-
+- fault type.
+-
+- bbeellll Arrange that a bell be sounded after each file transfer com-
+- mand is completed.
+-
+- bbiinnaarryy Set the file transfer ttyyppee to support binary image transfer.
+-
+- bbyyee Terminate the FTP session with the remote server and exit
+- ffttpp. An end of file will also terminate the session and ex-
+- it.
+-
+- ccaassee Toggle remote computer file name case mapping during ggeett,
+- mmggeett and mmppuutt commands. When ccaassee is on (default is off),
+- remote computer file names with all letters in upper case are
+- written in the local directory with the letters mapped to
+- lower case.
+-
+- ccdd _r_e_m_o_t_e_-_d_i_r_e_c_t_o_r_y
+- Change the working directory on the remote machine to _r_e_m_o_t_e_-
+- _d_i_r_e_c_t_o_r_y.
+-
+- ccdduupp Change the remote machine working directory to the parent of
+- the current remote machine working directory.
+-
+- cchhmmoodd _m_o_d_e _r_e_m_o_t_e_-_f_i_l_e
+- Change the permission modes of the file _r_e_m_o_t_e_-_f_i_l_e on the
+- remote system to _m_o_d_e.
+-
+- cclloossee Terminate the FTP session with the remote server, and return
+- to the command interpreter. Any defined macros are erased.
+-
+- ccrr Toggle carriage return stripping during ascii type file re-
+- trieval. Records are denoted by a carriage return/linefeed
+- sequence during ascii type file transfer. When ccrr is on (the
+- default), carriage returns are stripped from this sequence to
+- conform with the UNIX single linefeed record delimiter.
+- Records on non-UNIX remote systems may contain single line-
+- feeds; when an ascii type transfer is made, these linefeeds
+- may be distinguished from a record delimiter only when ccrr is
+- off.
+-
+- ddeebbuugg [_d_e_b_u_g_-_v_a_l_u_e]
+- Toggle debugging mode. If an optional _d_e_b_u_g_-_v_a_l_u_e is speci-
+- fied it is used to set the debugging level. When debugging
+- is on, ffttpp prints each command sent to the remote machine,
+- preceded by the string `-->'
+-
+- ddeelleettee _r_e_m_o_t_e_-_f_i_l_e
+- Delete the file _r_e_m_o_t_e_-_f_i_l_e on the remote machine.
+-
+- ddiirr [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]]
+- Print a listing of the contents of a directory on the remote
+- machine. The listing includes any system-dependent informa-
+- tion that the server chooses to include; for example, most
+- UNIX systems will produce output from the command `ls -l'.
+- If _r_e_m_o_t_e_-_p_a_t_h is left unspecified, the current working di-
+- rectory is used. If interactive prompting is on, ffttpp will
+- prompt the user to verify that the last argument is indeed
+- the target local file for receiving ddiirr output. If no local
+- file is specified, or if _l_o_c_a_l_-_f_i_l_e is `--', the output is
+- sent to the terminal.
+-
+- ddiissccoonnnneecctt A synonym for cclloossee.
+-
+- eeddiitt Toggle command line editing, and context sensitive command
+- and file completion. This is automatically enabled if input
+- is from a terminal, and disabled otherwise.
+-
+- eeppssvv44 Toggle the use of the extended EPSV and EPRT commands on IPv4
+- connections; first try EPSV / EPRT, and then PASV / PORT.
+- This is enabled by default. If an extended command fails
+- then this option will be temporarily disabled for the dura-
+- tion of the current connection, or until eeppssvv44 is executed
+- again.
+-
+- eexxiitt A synonym for bbyyee.
+-
+- ffeeaattuurreess Display what features the remote server supports (using the
+- FEAT command).
+-
+- ffggeett _l_o_c_a_l_f_i_l_e
+- Retrieve the files listed in _l_o_c_a_l_f_i_l_e, which has one line
+- per filename.
+-
+- ffoorrmm _f_o_r_m_a_t
+- Set the file transfer ffoorrmm to _f_o_r_m_a_t. The default (and only
+- supported) format is ``non-print''.
+-
+- ffttpp _h_o_s_t [_p_o_r_t]
+- A synonym for ooppeenn.
+-
+- ggaattee [_h_o_s_t [_p_o_r_t]]
+- Toggle gate-ftp mode, which used to connect through the TIS
+- FWTK and Gauntlet ftp proxies. This will not be permitted if
+- the gate-ftp server hasn't been set (either explicitly by the
+- user, or from the FTPSERVER environment variable). If _h_o_s_t
+- is given, then gate-ftp mode will be enabled, and the gate-
+- ftp server will be set to _h_o_s_t. If _p_o_r_t is also given, that
+- will be used as the port to connect to on the gate-ftp serv-
+- er.
+-
+- ggeett _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
+- Retrieve the _r_e_m_o_t_e_-_f_i_l_e and store it on the local machine.
+- If the local file name is not specified, it is given the same
+- name it has on the remote machine, subject to alteration by
+- the current ccaassee, nnttrraannss, and nnmmaapp settings. The current
+- settings for ttyyppee, ffoorrmm, mmooddee, and ssttrruuccttuurree are used while
+- transferring the file.
+-
+- gglloobb Toggle filename expansion for mmddeelleettee, mmggeett, mmppuutt, and
+- mmrreeggeett. If globbing is turned off with gglloobb, the file name
+- arguments are taken literally and not expanded. Globbing for
+- mmppuutt is done as in csh(1). For mmddeelleettee, mmggeett, and mmrreeggeett,
+- each remote file name is expanded separately on the remote
+- machine and the lists are not merged. Expansion of a direc-
+- tory name is likely to be different from expansion of the
+- name of an ordinary file: the exact result depends on the
+- foreign operating system and ftp server, and can be previewed
+- by doing `mls remote-files -' Note: mmggeett, mmppuutt and mmrreeggeett are
+- not meant to transfer entire directory subtrees of files.
+- That can be done by transferring a tar(1) archive of the sub-
+- tree (in binary mode).
+-
+- hhaasshh [_s_i_z_e]
+- Toggle hash-sign (``#'') printing for each data block trans-
+- ferred. The size of a data block defaults to 1024 bytes.
+- This can be changed by specifying _s_i_z_e in bytes. Enabling
+- hhaasshh disables pprrooggrreessss.
+-
+- hheellpp [_c_o_m_m_a_n_d]
+- Print an informative message about the meaning of _c_o_m_m_a_n_d.
+- If no argument is given, ffttpp prints a list of the known com-
+- mands.
+-
+- iiddllee [_s_e_c_o_n_d_s]
+- Set the inactivity timer on the remote server to _s_e_c_o_n_d_s sec-
+- onds. If _s_e_c_o_n_d_s is omitted, the current inactivity timer is
+- printed.
+-
+- iimmaaggee A synonym for bbiinnaarryy.
+-
+- llccdd [_d_i_r_e_c_t_o_r_y]
+- Change the working directory on the local machine. If no
+- _d_i_r_e_c_t_o_r_y is specified, the user's home directory is used.
+-
+- lleessss _f_i_l_e A synonym for ppaaggee.
+-
+- llppaaggee _l_o_c_a_l_-_f_i_l_e
+- Display _l_o_c_a_l_-_f_i_l_e with the program specified by the sseett
+- ppaaggeerr option.
+-
+- llppwwdd Print the working directory on the local machine.
+-
+- llss [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]]
+- A synonym for ddiirr.
+-
+- mmaaccddeeff _m_a_c_r_o_-_n_a_m_e
+- Define a macro. Subsequent lines are stored as the macro
+- _m_a_c_r_o_-_n_a_m_e; a null line (consecutive newline characters in a
+- file or carriage returns from the terminal) terminates macro
+- input mode. There is a limit of 16 macros and 4096 total
+- characters in all defined macros. Macros remain defined un-
+- til a cclloossee command is executed. The macro processor inter-
+- prets `$' and `\' as special characters. A `$' followed by a
+- number (or numbers) is replaced by the corresponding argument
+- on the macro invocation command line. A `$' followed by an
+- `i' signals that macro processor that the executing macro is
+- to be looped. On the first pass `$i' is replaced by the
+- first argument on the macro invocation command line, on the
+- second pass it is replaced by the second argument, and so on.
+- A `\' followed by any character is replaced by that charac-
+- ter. Use the `\' to prevent special treatment of the `$'.
+-
+- mmddeelleettee [_r_e_m_o_t_e_-_f_i_l_e_s]
+- Delete the _r_e_m_o_t_e_-_f_i_l_e_s on the remote machine.
+-
+- mmddiirr _r_e_m_o_t_e_-_f_i_l_e_s _l_o_c_a_l_-_f_i_l_e
+- Like ddiirr, except multiple remote files may be specified. If
+- interactive prompting is on, ffttpp will prompt the user to ver-
+- ify that the last argument is indeed the target local file
+- for receiving mmddiirr output.
+-
+- mmggeett _r_e_m_o_t_e_-_f_i_l_e_s
+- Expand the _r_e_m_o_t_e_-_f_i_l_e_s on the remote machine and do a ggeett
+- for each file name thus produced. See gglloobb for details on
+- the filename expansion. Resulting file names will then be
+- processed according to ccaassee, nnttrraannss, and nnmmaapp settings.
+- Files are transferred into the local working directory, which
+- can be changed with `lcd directory'; new local directories
+- can be created with `! mkdir directory'.
+-
+- mmkkddiirr _d_i_r_e_c_t_o_r_y_-_n_a_m_e
+- Make a directory on the remote machine.
+-
+- mmllss _r_e_m_o_t_e_-_f_i_l_e_s _l_o_c_a_l_-_f_i_l_e
+- Like llss, except multiple remote files may be specified, and
+- the _l_o_c_a_l_-_f_i_l_e must be specified. If interactive prompting
+- is on, ffttpp will prompt the user to verify that the last argu-
+- ment is indeed the target local file for receiving mmllss out-
+- put.
+-
+- mmllssdd [_r_e_m_o_t_e_-_p_a_t_h]
+- Display the contents of _r_e_m_o_t_e_-_p_a_t_h (which should default to
+- the current directory if not given) in a machine-parsable
+- form, using MLSD. The format of display can be changed with
+- `remopts mlst ...'.
+-
+- mmllsstt [_r_e_m_o_t_e_-_p_a_t_h]
+- Display the details about _r_e_m_o_t_e_-_p_a_t_h (which should default
+- to the current directory if not given) in a machine-parsable
+- form, using MLST. The format of display can be changed with
+- `remopts mlst ...'.
+-
+- mmooddee _m_o_d_e_-_n_a_m_e
+- Set the file transfer mmooddee to _m_o_d_e_-_n_a_m_e. The default (and
+- only supported) mode is ``stream''.
+-
+- mmooddttiimmee _r_e_m_o_t_e_-_f_i_l_e
+- Show the last modification time of the file on the remote ma-
+- chine.
+-
+- mmoorree _f_i_l_e A synonym for ppaaggee.
+-
+- mmppuutt _l_o_c_a_l_-_f_i_l_e_s
+- Expand wild cards in the list of local files given as argu-
+- ments and do a ppuutt for each file in the resulting list. See
+- gglloobb for details of filename expansion. Resulting file names
+- will then be processed according to nnttrraannss and nnmmaapp settings.
+-
+- mmrreeggeett _r_e_m_o_t_e_-_f_i_l_e_s
+- As per mmggeett, but performs a rreeggeett instead of ggeett.
+-
+- mmsseenndd _l_o_c_a_l_-_f_i_l_e_s
+- A synonym for mmppuutt.
+-
+- nneewweerr _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
+- Get the file only if the modification time of the remote file
+- is more recent that the file on the current system. If the
+- file does not exist on the current system, the remote file is
+- considered nneewweerr. Otherwise, this command is identical to
+- _g_e_t.
+-
+- nnlliisstt [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]]
+- A synonym for llss.
+-
+- nnmmaapp [_i_n_p_a_t_t_e_r_n _o_u_t_p_a_t_t_e_r_n]
+- Set or unset the filename mapping mechanism. If no arguments
+- are specified, the filename mapping mechanism is unset. If
+- arguments are specified, remote filenames are mapped during
+- mmppuutt commands and ppuutt commands issued without a specified re-
+- mote target filename. If arguments are specified, local
+- filenames are mapped during mmggeett commands and ggeett commands
+- issued without a specified local target filename. This com-
+- mand is useful when connecting to a non-UNIX remote computer
+- with different file naming conventions or practices. The
+- mapping follows the pattern set by _i_n_p_a_t_t_e_r_n and _o_u_t_p_a_t_t_e_r_n.
+- [_I_n_p_a_t_t_e_r_n] is a template for incoming filenames (which may
+- have already been processed according to the nnttrraannss and ccaassee
+- settings). Variable templating is accomplished by including
+- the sequences `$1', `$2', ..., `$9' in _i_n_p_a_t_t_e_r_n. Use `\' to
+- prevent this special treatment of the `$' character. All
+- other characters are treated literally, and are used to de-
+- termine the nnmmaapp [_i_n_p_a_t_t_e_r_n] variable values. For example,
+- given _i_n_p_a_t_t_e_r_n $1.$2 and the remote file name "mydata.data",
+- $1 would have the value "mydata", and $2 would have the value
+- "data". The _o_u_t_p_a_t_t_e_r_n determines the resulting mapped file-
+- name. The sequences `$1', `$2', ...., `$9' are replaced by
+- any value resulting from the _i_n_p_a_t_t_e_r_n template. The se-
+- quence `$0' is replace by the original filename. Additional-
+- ly, the sequence `[_s_e_q_1, _s_e_q_2]' is replaced by [_s_e_q_1] if _s_e_q_1
+- is not a null string; otherwise it is replaced by _s_e_q_2. For
+- example, the command
+-
+- nmap $1.$2.$3 [$1,$2].[$2,file]
+-
+- would yield the output filename "myfile.data" for input file-
+- names "myfile.data" and "myfile.data.old", "myfile.file" for
+- the input filename "myfile", and "myfile.myfile" for the in-
+- put filename ".myfile". Spaces may be included in
+- _o_u_t_p_a_t_t_e_r_n, as in the example: `nmap $1 sed "s/ *$//" > $1'
+- . Use the `\' character to prevent special treatment of the
+- `$','[',']', and `,' characters.
+-
+- nnttrraannss [_i_n_c_h_a_r_s [_o_u_t_c_h_a_r_s]]
+- Set or unset the filename character translation mechanism.
+- If no arguments are specified, the filename character trans-
+- lation mechanism is unset. If arguments are specified, char-
+- acters in remote filenames are translated during mmppuutt com-
+- mands and ppuutt commands issued without a specified remote tar-
+- get filename. If arguments are specified, characters in lo-
+- cal filenames are translated during mmggeett commands and ggeett
+- commands issued without a specified local target filename.
+- This command is useful when connecting to a non-UNIX remote
+- computer with different file naming conventions or practices.
+- Characters in a filename matching a character in _i_n_c_h_a_r_s are
+- replaced with the corresponding character in _o_u_t_c_h_a_r_s. If
+- the character's position in _i_n_c_h_a_r_s is longer than the length
+- of _o_u_t_c_h_a_r_s, the character is deleted from the file name.
+-
+- ooppeenn _h_o_s_t [_p_o_r_t]
+- Establish a connection to the specified _h_o_s_t FTP server. An
+- optional port number may be supplied, in which case, ffttpp will
+- attempt to contact an FTP server at that port. If the aauuttoo--
+- llooggiinn option is on (default), ffttpp will also attempt to auto-
+- matically log the user in to the FTP server (see below).
+-
+- ppaaggee _f_i_l_e Retrieve ffiillee and display with the program specified by the
+- sseett ppaaggeerr option.
+-
+- ppaassssiivvee [aauuttoo]
+- Toggle passive mode (if no arguments are given). If aauuttoo is
+- given, act as if FTPMODE is set to `auto'. If passive mode
+- is turned on (default), ffttpp will send a PASV command for all
+- data connections instead of a PORT command. The PASV command
+- requests that the remote server open a port for the data con-
+- nection and return the address of that port. The remote
+- server listens on that port and the client connects to it.
+- When using the more traditional PORT command, the client lis-
+- tens on a port and sends that address to the remote server,
+- who connects back to it. Passive mode is useful when using
+- ffttpp through a gateway router or host that controls the direc-
+- tionality of traffic. (Note that though FTP servers are re-
+- quired to support the PASV command by RFC 1123, some do not.)
+-
+- ppddiirr [_r_e_m_o_t_e_-_p_a_t_h]
+- Perform ddiirr [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the
+- program specified by the sseett ppaaggeerr option.
+-
+- ppllss [_r_e_m_o_t_e_-_p_a_t_h]
+- Perform llss [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the
+- program specified by the sseett ppaaggeerr option.
+-
+- ppmmllssdd [_r_e_m_o_t_e_-_p_a_t_h]
+- Perform mmllssdd [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the
+- program specified by the sseett ppaaggeerr option.
+-
+- pprreesseerrvvee Toggle preservation of modification times on retrieved files.
+-
+- pprrooggrreessss Toggle display of transfer progress bar. The progress bar
+- will be disabled for a transfer that has _l_o_c_a_l_-_f_i_l_e as `--' or
+- a command that starts with `|'. Refer to _F_I_L_E _N_A_M_I_N_G
+- _C_O_N_V_E_N_T_I_O_N_S for more information. Enabling pprrooggrreessss disables
+- hhaasshh.
+-
+- pprroommpptt Toggle interactive prompting. Interactive prompting occurs
+- during multiple file transfers to allow the user to selec-
+- tively retrieve or store files. If prompting is turned off
+- (default is on), any mmggeett or mmppuutt will transfer all files,
+- and any mmddeelleettee will delete all files.
+-
+- When prompting is on, the following commands are available at
+- a prompt:
+-
+- aa Answer `yes' to the current file, and automatically
+- answer `yes' to any remaining files for the current
+- command.
+-
+- nn Answer `no', and do not transfer the file.
+-
+- pp Answer `yes' to the current file, and turn off
+- prompt mode (as is ``prompt off'' had been given).
+-
+- qq Terminate the current operation.
+-
+- yy Answer `yes', and transfer the file.
+-
+- ?? Display a help message.
+-
+- Any other reponse will answer `yes' to the current file.
+-
+- pprrooxxyy _f_t_p_-_c_o_m_m_a_n_d
+- Execute an ftp command on a secondary control connection.
+- This command allows simultaneous connection to two remote FTP
+- servers for transferring files between the two servers. The
+- first pprrooxxyy command should be an ooppeenn, to establish the sec-
+- ondary control connection. Enter the command "proxy ?" to
+- see other FTP commands executable on the secondary connec-
+- tion. The following commands behave differently when pref-
+- aced by pprrooxxyy: ooppeenn will not define new macros during the au-
+- to-login process, cclloossee will not erase existing macro defini-
+- tions, ggeett and mmggeett transfer files from the host on the pri-
+- mary control connection to the host on the secondary control
+- connection, and ppuutt, mmppuutt, and aappppeenndd transfer files from the
+- host on the secondary control connection to the host on the
+- primary control connection. Third party file transfers de-
+- pend upon support of the FTP protocol PASV command by the
+- server on the secondary control connection.
+-
+- ppuutt _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e]
+- Store a local file on the remote machine. If _r_e_m_o_t_e_-_f_i_l_e is
+- left unspecified, the local file name is used after process-
+- ing according to any nnttrraannss or nnmmaapp settings in naming the
+- remote file. File transfer uses the current settings for
+- ttyyppee, ffoorrmmaatt, mmooddee, and ssttrruuccttuurree.
+-
+- ppwwdd Print the name of the current working directory on the remote
+- machine.
+-
+- qquuiitt A synonym for bbyyee.
+-
+- qquuoottee _a_r_g_1 _a_r_g_2 _._._.
+- The arguments specified are sent, verbatim, to the remote FTP
+- server.
+-
+- rraattee _d_i_r_e_c_t_i_o_n [_m_a_x_i_m_u_m [_i_n_c_r_e_m_e_n_t]]
+- Throttle the maximum transfer rate to _m_a_x_i_m_u_m bytes/second.
+- If _m_a_x_i_m_u_m is 0, disable the throttle.
+-
+- _d_i_r_e_c_t_i_o_n may be one of:
+- aallll Both directions.
+- ggeett Incoming transfers.
+- ppuutt Outgoing transfers.
+-
+- _m_a_x_i_m_u_m can by modified on the fly by _i_n_c_r_e_m_e_n_t bytes (de-
+- fault: 1024) each time a given signal is received:
+-
+- SIGUSR1 Increment _m_a_x_i_m_u_m by _i_n_c_r_e_m_e_n_t bytes.
+-
+- SIGUSR2 Decrement _m_a_x_i_m_u_m by _i_n_c_r_e_m_e_n_t bytes. The re-
+- sult must be a positive number.
+-
+- If _m_a_x_i_m_u_m is not supplied, the current throttle rates are
+- displayed.
+-
+- Note: rraattee is not yet implemented for ascii mode transfers.
+-
+- rrccvvbbuuff _s_i_z_e
+- Set the size of the socket receive buffer to _s_i_z_e.
+-
+- rreeccvv _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
+- A synonym for ggeett.
+-
+- rreeggeett _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
+- rreeggeett acts like ggeett, except that if _l_o_c_a_l_-_f_i_l_e exists and is
+- smaller than _r_e_m_o_t_e_-_f_i_l_e, _l_o_c_a_l_-_f_i_l_e is presumed to be a par-
+- tially transferred copy of _r_e_m_o_t_e_-_f_i_l_e and the transfer is
+- continued from the apparent point of failure. This command
+- is useful when transferring very large files over networks
+- that are prone to dropping connections.
+-
+- rreemmooppttss _c_o_m_m_a_n_d [_c_o_m_m_a_n_d_-_o_p_t_i_o_n_s]
+- Set options on the remote FTP server for _c_o_m_m_a_n_d to _c_o_m_m_a_n_d_-
+- _o_p_t_i_o_n_s (whose absence is handled on a command-specific ba-
+- sis). Remote FTP commands known to support options include:
+- `MLST' (used for MLSD and MLST).
+-
+- rreennaammee [_f_r_o_m [_t_o]]
+- Rename the file _f_r_o_m on the remote machine, to the file _t_o.
+-
+- rreesseett Clear reply queue. This command re-synchronizes command/re-
+- ply sequencing with the remote FTP server. Resynchronization
+- may be necessary following a violation of the FTP protocol by
+- the remote server.
+-
+- rreessttaarrtt _m_a_r_k_e_r
+- Restart the immediately following ggeett or ppuutt at the indicated
+- _m_a_r_k_e_r. On UNIX systems, marker is usually a byte offset in-
+- to the file.
+-
+- rrhheellpp [_c_o_m_m_a_n_d_-_n_a_m_e]
+- Request help from the remote FTP server. If a _c_o_m_m_a_n_d_-_n_a_m_e
+- is specified it is supplied to the server as well.
+-
+- rrmmddiirr _d_i_r_e_c_t_o_r_y_-_n_a_m_e
+- Delete a directory on the remote machine.
+-
+- rrssttaattuuss [_r_e_m_o_t_e_-_f_i_l_e]
+- With no arguments, show status of remote machine. If _r_e_m_o_t_e_-
+- _f_i_l_e is specified, show status of _r_e_m_o_t_e_-_f_i_l_e on remote ma-
+- chine.
+-
+- rruunniiqquuee Toggle storing of files on the local system with unique file-
+- names. If a file already exists with a name equal to the
+- target local filename for a ggeett or mmggeett command, a ".1" is
+- appended to the name. If the resulting name matches another
+- existing file, a ".2" is appended to the original name. If
+- this process continues up to ".99", an error message is
+- printed, and the transfer does not take place. The generated
+- unique filename will be reported. Note that rruunniiqquuee will not
+- affect local files generated from a shell command (see be-
+- low). The default value is off.
+-
+- sseenndd _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e]
+- A synonym for ppuutt.
+-
+- sseennddppoorrtt Toggle the use of PORT commands. By default, ffttpp will at-
+- tempt to use a PORT command when establishing a connection
+- for each data transfer. The use of PORT commands can prevent
+- delays when performing multiple file transfers. If the PORT
+- command fails, ffttpp will use the default data port. When the
+- use of PORT commands is disabled, no attempt will be made to
+- use PORT commands for each data transfer. This is useful for
+- certain FTP implementations which do ignore PORT commands
+- but, incorrectly, indicate they've been accepted.
+-
+- sseett [_o_p_t_i_o_n _v_a_l_u_e]
+- Set _o_p_t_i_o_n to _v_a_l_u_e. If _o_p_t_i_o_n and _v_a_l_u_e are not given, dis-
+- play all of the options and their values. The currently sup-
+- ported options are:
+-
+- anonpass Defaults to $FTPANONPASS
+-
+- ftp_proxy Defaults to $ftp_proxy.
+-
+- http_proxy Defaults to $http_proxy.
+-
+- no_proxy Defaults to $no_proxy.
+-
+- pager Defaults to $PAGER.
+-
+- prompt Defaults to $FTPPROMPT.
+-
+- rprompt Defaults to $FTPRPROMPT.
+-
+- ssiittee _a_r_g_1 _a_r_g_2 _._._.
+- The arguments specified are sent, verbatim, to the remote FTP
+- server as a SITE command.
+-
+- ssiizzee _r_e_m_o_t_e_-_f_i_l_e
+- Return size of _r_e_m_o_t_e_-_f_i_l_e on remote machine.
+-
+- ssnnddbbuuff _s_i_z_e
+- Set the size of the socket send buffer to _s_i_z_e.
+-
+- ssttaattuuss Show the current status of ffttpp.
+-
+- ssttrruucctt _s_t_r_u_c_t_-_n_a_m_e
+- Set the file transfer _s_t_r_u_c_t_u_r_e to _s_t_r_u_c_t_-_n_a_m_e. The default
+- (and only supported) structure is ``file''.
+-
+- ssuunniiqquuee Toggle storing of files on remote machine under unique file
+- names. The remote FTP server must support FTP protocol STOU
+- command for successful completion. The remote server will
+- report unique name. Default value is off.
+-
+- ssyysstteemm Show the type of operating system running on the remote ma-
+- chine.
+-
+- tteenneexx Set the file transfer type to that needed to talk to TENEX
+- machines.
+-
+- tthhrroottttllee A synonym for rraattee.
+-
+- ttrraaccee Toggle packet tracing.
+-
+- ttyyppee [_t_y_p_e_-_n_a_m_e]
+- Set the file transfer ttyyppee to _t_y_p_e_-_n_a_m_e. If no type is spec-
+- ified, the current type is printed. The default type is net-
+- work ASCII.
+-
+- uummaasskk [_n_e_w_m_a_s_k]
+- Set the default umask on the remote server to _n_e_w_m_a_s_k. If
+- _n_e_w_m_a_s_k is omitted, the current umask is printed.
+-
+- uunnsseett _o_p_t_i_o_n
+- Unset _o_p_t_i_o_n. Refer to sseett for more information.
+-
+- uussaaggee _c_o_m_m_a_n_d
+- Print the usage message for _c_o_m_m_a_n_d.
+-
+- uusseerr _u_s_e_r_-_n_a_m_e [_p_a_s_s_w_o_r_d [_a_c_c_o_u_n_t]]
+- Identify yourself to the remote FTP server. If the _p_a_s_s_w_o_r_d
+- is not specified and the server requires it, ffttpp will prompt
+- the user for it (after disabling local echo). If an _a_c_c_o_u_n_t
+- field is not specified, and the FTP server requires it, the
+- user will be prompted for it. If an _a_c_c_o_u_n_t field is speci-
+- fied, an account command will be relayed to the remote server
+- after the login sequence is completed if the remote server
+- did not require it for logging in. Unless ffttpp is invoked
+- with ``auto-login'' disabled, this process is done automati-
+- cally on initial connection to the FTP server.
+-
+- vveerrbboossee Toggle verbose mode. In verbose mode, all responses from the
+- FTP server are displayed to the user. In addition, if ver-
+- bose is on, when a file transfer completes, statistics re-
+- garding the efficiency of the transfer are reported. By de-
+- fault, verbose is on.
+-
+- xxffeerrbbuuff _s_i_z_e
+- Set the size of the socket send and receive buffers to _s_i_z_e.
+-
+- ?? [_c_o_m_m_a_n_d]
+- A synonym for hheellpp.
+-
+- Command arguments which have embedded spaces may be quoted with quote `"'
+- marks.
+-
+- Commands which toggle settings can take an explicit oonn or ooffff argument to
+- force the setting appropriately.
+-
+- Commands which take a byte count as an argument (e.g., hhaasshh, rraattee, and
+- xxffeerrbbuuff) support an optional suffix on the argument which changes the in-
+- terpretation of the argument. Supported suffixes are:
+- b Causes no modification. (Optional)
+- k Kilo; multiply the argument by 1024
+- m Mega; multiply the argument by 1048576
+- g Giga; multiply the argument by 1073741824
+-
+- If ffttpp receives a SIGINFO (see the ``status'' argument of stty(1)) or
+- SIGQUIT signal whilst a transfer is in progress, the current transfer
+- rate statistics will be written to the standard error output, in the same
+- format as the standard completion message.
+-
+-AAUUTTOO--FFEETTCCHHIINNGG FFIILLEESS
+- In addition to standard commands, this version of ffttpp supports an auto-
+- fetch feature. To enable auto-fetch, simply pass the list of host-
+- names/files on the command line.
+-
+- The following formats are valid syntax for an auto-fetch element:
+-
+- [user@]host:[path][/]
+- ``Classic'' FTP format.
+-
+- If _p_a_t_h contains a glob character and globbing is enabled, (see
+- gglloobb), then the equivalent of `mget path' is performed.
+-
+- If the directory component of _p_a_t_h contains no globbing characters,
+- it is stored locally with the name basename (see basename(1)) of
+- ppaatthh, in the current directory. Otherwise, the full remote name is
+- used as the local name, relative to the local root directory.
+-
+- ftp://[user[:password]@]host[:port]/path[/][;type=X]
+- An FTP URL, retrieved using the FTP protocol if sseett ffttpp__pprrooxxyy isn't
+- defined. Otherwise, transfer the URL using HTTP via the proxy de-
+- fined in sseett ffttpp__pprrooxxyy. If sseett ffttpp__pprrooxxyy isn't defined and _u_s_e_r is
+- given, login as _u_s_e_r. In this case, use _p_a_s_s_w_o_r_d if supplied, oth-
+- erwise prompt the user for one.
+-
+- In order to be compliant with RRFFCC 11773388, ffttpp strips the leading `/'
+- from _p_a_t_h, resulting in a transfer relative from the default login
+- directory of the user. If the _/ directory is required, use a lead-
+- ing path of ``%2F''. If a user's home directory is required (and
+- the remote server supports the syntax), use a leading path of
+- ``%7Euser/''. For example, to retrieve _/_e_t_c_/_m_o_t_d from `localhost'
+- as the user `myname' with the password `mypass', use
+- ``ftp://myname:mypass@localhost/%2fetc/motd''
+-
+- If a suffix of `;type=A' or `;type=I' is supplied, then the trans-
+- fer type will take place as ascii or binary (respectively). The
+- default transfer type is binary.
+-
+- http://[user[:password]@]host[:port]/path
+- An HTTP URL, retrieved using the HTTP protocol. If sseett hhttttpp__pprrooxxyy
+- is defined, it is used as a URL to an HTTP proxy server. If HTTP
+- authorisation is required to retrieve _p_a_t_h, and `user' (and option-
+- ally `password') is in the URL, use them for the first attempt to
+- authenticate.
+-
+- file:///path
+- A local URL, copied from _/_p_a_t_h.
+-
+- Unless noted otherwise above, and --oo _o_u_t_p_u_t is not given, the file is
+- stored in the current directory as the basename(1) of _p_a_t_h.
+-
+- If a classic format or an FTP URL format has a trailing `/' or an empty
+- _p_a_t_h component, then ffttpp will connect to the site and ccdd to the directory
+- given as the path, and leave the user in interactive mode ready for fur-
+- ther input. This will not work if sseett ffttpp__pprrooxxyy is being used.
+-
+- Direct HTTP transfers use HTTP 1.1. Proxied FTP and HTTP transfers use
+- HTTP 1.0.
+-
+- If --RR is given, all auto-fetches that don't go via the FTP or HTTP prox-
+- ies will be restarted. For FTP, this is implemented by using rreeggeett in-
+- stead of ggeett. For HTTP, this is implemented by using the `Range: bytes='
+- HTTP/1.1 directive.
+-
+- If WWW or proxy WWW authentication is required, you will be prompted to
+- enter a username and password to authenticate with.
+-
+- When specifying IPv6 numeric addresses in a URL, you need to surround the
+- address in square brackets. E.g.: ``ftp://[::1]:21/''. This is because
+- colons are used in IPv6 numeric address as well as being the separator
+- for the port number.
+-
+-AABBOORRTTIINNGG AA FFIILLEE TTRRAANNSSFFEERR
+- To abort a file transfer, use the terminal interrupt key (usually Ctrl-
+- C). Sending transfers will be immediately halted. Receiving transfers
+- will be halted by sending an FTP protocol ABOR command to the remote
+- server, and discarding any further data received. The speed at which
+- this is accomplished depends upon the remote server's support for ABOR
+- processing. If the remote server does not support the ABOR command, the
+- prompt will not appear until the remote server has completed sending the
+- requested file.
+-
+- If the terminal interrupt key sequence is used whilst ffttpp is awaiting a
+- reply from the remote server for the ABOR processing, then the connection
+- will be closed. This is different from the traditional behaviour (which
+- ignores the terminal interrupt during this phase), but is considered more
+- useful.
+-
+-FFIILLEE NNAAMMIINNGG CCOONNVVEENNTTIIOONNSS
+- Files specified as arguments to ffttpp commands are processed according to
+- the following rules.
+-
+- 1. If the file name `--' is specified, the _s_t_d_i_n (for reading) or _s_t_d_o_u_t
+- (for writing) is used.
+-
+- 2. If the first character of the file name is `|', the remainder of the
+- argument is interpreted as a shell command. ffttpp then forks a shell,
+- using popen(3) with the argument supplied, and reads (writes) from
+- the stdout (stdin). If the shell command includes spaces, the argu-
+- ment must be quoted; e.g. ``"| ls -lt"''. A particularly useful
+- example of this mechanism is: ``dir "" |more''.
+-
+- 3. Failing the above checks, if ``globbing'' is enabled, local file
+- names are expanded according to the rules used in the csh(1); c.f.
+- the gglloobb command. If the ffttpp command expects a single local file
+- (e.g. ppuutt), only the first filename generated by the "globbing" op-
+- eration is used.
+-
+- 4. For mmggeett commands and ggeett commands with unspecified local file
+- names, the local filename is the remote filename, which may be al-
+- tered by a ccaassee, nnttrraannss, or nnmmaapp setting. The resulting filename
+- may then be altered if rruunniiqquuee is on.
+-
+- 5. For mmppuutt commands and ppuutt commands with unspecified remote file
+- names, the remote filename is the local filename, which may be al-
+- tered by a nnttrraannss or nnmmaapp setting. The resulting filename may then
+- be altered by the remote server if ssuunniiqquuee is on.
+-
+-FFIILLEE TTRRAANNSSFFEERR PPAARRAAMMEETTEERRSS
+- The FTP specification specifies many parameters which may affect a file
+- transfer. The ttyyppee may be one of ``ascii'', ``image'' (binary),
+- ``ebcdic'', and ``local byte size'' (for PDP-10's and PDP-20's mostly).
+- ffttpp supports the ascii and image types of file transfer, plus local byte
+- size 8 for tteenneexx mode transfers.
+-
+- ffttpp supports only the default values for the remaining file transfer pa-
+- rameters: mmooddee, ffoorrmm, and ssttrruucctt.
+-
+-TTHHEE ..nneettrrcc FFIILLEE
+- The _._n_e_t_r_c file contains login and initialization information used by the
+- auto-login process. It resides in the user's home directory, unless
+- overridden with the --NN _n_e_t_r_c option, or specified in the NETRC environ-
+- ment variable. The following tokens are recognized; they may be separat-
+- ed by spaces, tabs, or new-lines:
+-
+- mmaacchhiinnee _n_a_m_e
+- Identify a remote machine _n_a_m_e. The auto-login process search-
+- es the _._n_e_t_r_c file for a mmaacchhiinnee token that matches the remote
+- machine specified on the ffttpp command line or as an ooppeenn command
+- argument. Once a match is made, the subsequent _._n_e_t_r_c tokens
+- are processed, stopping when the end of file is reached or an-
+- other mmaacchhiinnee or a ddeeffaauulltt token is encountered.
+-
+- ddeeffaauulltt This is the same as mmaacchhiinnee _n_a_m_e except that ddeeffaauulltt matches
+- any name. There can be only one ddeeffaauulltt token, and it must be
+- after all mmaacchhiinnee tokens. This is normally used as:
+-
+- default login anonymous password user@site
+-
+- thereby giving the user an automatic anonymous FTP login to ma-
+- chines not specified in _._n_e_t_r_c. This can be overridden by us-
+- ing the --nn flag to disable auto-login.
+-
+- llooggiinn _n_a_m_e
+- Identify a user on the remote machine. If this token is pre-
+- sent, the auto-login process will initiate a login using the
+- specified _n_a_m_e.
+-
+- ppaasssswwoorrdd _s_t_r_i_n_g
+- Supply a password. If this token is present, the auto-login
+- process will supply the specified string if the remote server
+- requires a password as part of the login process. Note that if
+- this token is present in the _._n_e_t_r_c file for any user other
+- than _a_n_o_n_y_m_o_u_s, ffttpp will abort the auto-login process if the
+- _._n_e_t_r_c is readable by anyone besides the user.
+-
+- aaccccoouunntt _s_t_r_i_n_g
+- Supply an additional account password. If this token is pre-
+- sent, the auto-login process will supply the specified string
+- if the remote server requires an additional account password,
+- or the auto-login process will initiate an ACCT command if it
+- does not.
+-
+- mmaaccddeeff _n_a_m_e
+- Define a macro. This token functions like the ffttpp mmaaccddeeff com-
+- mand functions. A macro is defined with the specified name;
+- its contents begin with the next _._n_e_t_r_c line and continue until
+- a blank line (consecutive new-line characters) is encountered.
+- If a macro named iinniitt is defined, it is automatically executed
+- as the last step in the auto-login process.
+-
+-CCOOMMMMAANNDD LLIINNEE EEDDIITTIINNGG
+- ffttpp supports interactive command line editing, via the editline(3) li-
+- brary. It is enabled with the eeddiitt command, and is enabled by default if
+- input is from a tty. Previous lines can be recalled and edited with the
+- arrow keys, and other GNU Emacs-style editing keys may be used as well.
+-
+- The editline(3) library is configured with a _._e_d_i_t_r_c file - refer to
+- editrc(5) for more information.
+-
+- An extra key binding is available to ffttpp to provide context sensitive
+- command and filename completion (including remote file completion). To
+- use this, bind a key to the editline(3) command ffttpp--ccoommpplleettee. By de-
+- fault, this is bound to the TAB key.
+-
+-CCOOMMMMAANNDD LLIINNEE PPRROOMMPPTT
+- By default, ffttpp displays a command line prompt of ``ftp>'' to the user.
+- This can be changed with the sseett pprroommpptt command.
+-
+- A prompt can be displayed on the right side of the screen (after the com-
+- mand input) with the sseett rrpprroommpptt command.
+-
+- The following formatting sequences are replaced by the given information:
+-
+- %/ The current remote working directory.
+-
+- %c[[0]_n], %.[[0]_n]
+- The trailing component of the current remote working directo-
+- ry, or _n trailing components if a digit _n is given. If _n be-
+- gins with `0', the number of skipped components precede the
+- trailing component(s) in the format ``/_<_s_k_i_p_p_e_d_>trailing''
+- (for `%c') or ``...trailing'' (for `%.').
+-
+- %M The remote host name.
+-
+- %m The remote host name, up to the first `.'.
+-
+- %n The remote user name.
+-
+- %% A single `%'.
+-
+-EENNVVIIRROONNMMEENNTT
+- ffttpp uses the following environment variables.
+-
+- FTPANONPASS Password to send in an anonymous FTP transfer. Defaults
+- to ```whoami`@''.
+-
+- FTPMODE Overrides the default operation mode. Support values are:
+-
+- active active mode FTP only
+-
+- auto automatic determination of passive or active
+- (this is the default)
+-
+- gate gate-ftp mode
+-
+- passive passive mode FTP only
+-
+- FTPPROMPT Command-line prompt to use. Defaults to ``ftp>''. Refer
+- to _C_O_M_M_A_N_D _L_I_N_E _P_R_O_M_P_T for more information.
+-
+- FTPRPROMPT Command-line right side prompt to use. Defaults to ``''.
+- Refer to _C_O_M_M_A_N_D _L_I_N_E _P_R_O_M_P_T for more information.
+-
+- FTPSERVER Host to use as gate-ftp server when ggaattee is enabled.
+-
+- FTPSERVERPORT Port to use when connecting to gate-ftp server when ggaattee
+- is enabled. Default is port returned by a ggeettsseerrvvbbyynnaammee()
+- lookup of ``ftpgate/tcp''.
+-
+- HOME For default location of a _._n_e_t_r_c file, if one exists.
+-
+- NETRC An alternate location of the _._n_e_t_r_c file.
+-
+- PAGER Used by various commands to display files. Defaults to
+- more(1) if empty or not set.
+-
+- SHELL For default shell.
+-
+- ftp_proxy URL of FTP proxy to use when making FTP URL requests (if
+- not defined, use the standard FTP protocol).
+-
+- _N_O_T_E: this is not used for interactive sessions, only for
+- command-line fetches.
+-
+- http_proxy URL of HTTP proxy to use when making HTTP URL requests.
+- If proxy authentication is required and there is a user-
+- name and password in this URL, they will automatically be
+- used in the first attempt to authenticate to the proxy.
+-
+- Note that the use of a username and password in ftp_proxy
+- and http_proxy may be incompatible with other programs
+- that use it (such as lynx(1)).
+-
+- _N_O_T_E: this is not used for interactive sessions, only for
+- command-line fetches.
+-
+- no_proxy A space or comma separated list of hosts (or domains) for
+- which proxying is not to be used. Each entry may have an
+- optional trailing ":port", which restricts the matching to
+- connections to that port.
+-
+-SSEEEE AALLSSOO
+- getservbyname(3), editrc(5), services(5), ftpd(8)
+-
+-SSTTAANNDDAARRDDSS
+- ffttpp attempts to be compliant with RRFFCC 995599, RRFFCC 11112233, RRFFCC 11773388, RRFFCC 22006688,
+- RRFFCC 22338899, RRFFCC 22442288, RRFFCC 22773322, and ddrraafftt--iieettff--ffttppeexxtt--mmllsstt--1111.
+-
+-HHIISSTTOORRYY
+- The ffttpp command appeared in 4.2BSD.
+-
+- Various features such as command line editing, context sensitive command
+- and file completion, dynamic progress bar, automatic fetching of files
+- and URLs, modification time preservation, transfer rate throttling, con-
+- figurable command line prompt, and other enhancements over the standard
+- BSD ffttpp were implemented in NetBSD 1.3 and later releases by Luke Mewburn
+- <lukem@netbsd.org>.
+-
+- IPv6 support was added by the WIDE/KAME project (but may not be present
+- in all non-NetBSD versions of this program, depending if the operating
+- system supports IPv6 in a similar manner to KAME).
+-
+-BBUUGGSS
+- Correct execution of many commands depends upon proper behavior by the
+- remote server.
+-
+- An error in the treatment of carriage returns in the 4.2BSD ascii-mode
+- transfer code has been corrected. This correction may result in incor-
+- rect transfers of binary files to and from 4.2BSD servers using the ascii
+- type. Avoid this problem by using the binary image type.
+-
+- ffttpp assumes that all IPv4 mapped addresses (IPv6 addresses with a form
+- like ::ffff:10.1.1.1) indicate IPv4 destinations which can be handled by
+- AF_INET sockets. However, in certain IPv6 network configurations, this
+- assumption is not true. In such an environment, IPv4 mapped addresses
+- must be passed to AF_INET6 sockets directly. For example, if your site
+- uses a SIIT translator for IPv6-to-IPv4 translation, ffttpp is unable to
+- support your configuration.
+-
+-NetBSD 1.6_BETA1 May 18, 2002 16
+diff -Nru src/ftp_var.h /home/spock/ftp/ftp_var.h
+--- src/ftp_var.h Sat Jun 15 05:40:36 2002
++++ /home/spock/ftp/ftp_var.h Thu Jun 12 02:02:11 2003
+@@ -1,7 +1,7 @@
+-/* $NetBSD: ftp_var.h,v 1.62 2001/12/26 09:40:16 lukem Exp $ */
++/* $NetBSD: ftp_var.h,v 1.64 2003/01/21 16:08:07 jhawk Exp $ */
+
+ /*-
+- * Copyright (c) 1996-2001 The NetBSD Foundation, Inc.
++ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+@@ -111,14 +111,20 @@
+ #define NO_PROGRESS
+ #endif
+
++#include <sys/param.h>
++
++#include <netinet/in.h>
++#include <arpa/inet.h>
++
++#include <setjmp.h>
++#include <stringlist.h>
++
+ #ifndef NO_EDITCOMPLETE
+ #include <histedit.h>
+ #endif /* !NO_EDITCOMPLETE */
+
+-typedef void (*sigfunc)(int);
+-
+ #include "extern.h"
+-
++#include "progressbar.h"
+
+ /*
+ * Format of command table.
+@@ -175,7 +181,6 @@
+
+ #define HASHBYTES 1024 /* default mark for `hash' command */
+ #define DEFAULTINCR 1024 /* default increment for `rate' command */
+-#define STALLTIME 5 /* # of seconds of no xfer before "stalling" */
+
+ #define FTP_PORT 21 /* default if ! getservbyname("ftp/tcp") */
+ #define HTTP_PORT 80 /* default if ! getservbyname("http/tcp") */
+@@ -204,9 +209,7 @@
+ GLOBAL int hash; /* print # for each buffer transferred */
+ GLOBAL int mark; /* number of bytes between hashes */
+ GLOBAL int sendport; /* use PORT/LPRT cmd for each data connection */
+-GLOBAL int verbose; /* print messages coming back from server */
+ GLOBAL int connected; /* 1 = connected to server, -1 = logged in */
+-GLOBAL int fromatty; /* input is from a terminal */
+ GLOBAL int interactive; /* interactively prompt on m* cmds */
+ GLOBAL int confirmrest; /* confirm rest of current m* cmd */
+ GLOBAL int debug; /* debugging level */
+@@ -223,7 +226,6 @@
+ GLOBAL int ntflag; /* use ntin ntout tables for name translation */
+ GLOBAL int mapflag; /* use mapin mapout templates on file names */
+ GLOBAL int preserve; /* preserve modification time on files */
+-GLOBAL int progress; /* display transfer progress bar */
+ GLOBAL int code; /* return/reply code for ftp command */
+ GLOBAL int crflag; /* if 1, strip car. rets. on ascii gets */
+ GLOBAL int passivemode; /* passive mode enabled */
+@@ -252,9 +254,7 @@
+ GLOBAL int rate_put; /* maximum put xfer rate */
+ GLOBAL int rate_put_incr; /* increment for put xfer rate */
+ GLOBAL int retry_connect; /* seconds between retrying connection */
+-GLOBAL int ttywidth; /* width of tty */
+ GLOBAL char *tmpdir; /* temporary directory */
+-GLOBAL FILE *ttyout; /* stdout, or stderr if retrieving to stdout */
+ GLOBAL int epsv4; /* use EPSV/EPRT on IPv4 connections */
+ GLOBAL int epsv4bad; /* EPSV doesn't work on the current server */
+ GLOBAL int editing; /* command line editing enabled */
+@@ -268,10 +268,7 @@
+ GLOBAL size_t cursor_argo; /* offset of cursor in margv[cursor_argc] */
+ #endif /* !NO_EDITCOMPLETE */
+
+-GLOBAL off_t bytes; /* current # of bytes read */
+-GLOBAL off_t filesize; /* size of file being transferred */
+ GLOBAL char *direction; /* direction transfer is occurring */
+-GLOBAL off_t restart_point; /* offset to restart transfer */
+
+ GLOBAL char *hostname; /* name of host connected to */
+ GLOBAL int unix_server; /* server is unix, can use binary for ascii */
+@@ -287,8 +284,6 @@
+ GLOBAL char *outfile; /* filename to output URLs to */
+ GLOBAL int restartautofetch; /* restart auto-fetch */
+
+-GLOBAL sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */
+-
+ GLOBAL char line[FTPBUFLEN]; /* input line buffer */
+ GLOBAL char *stringbase; /* current scan point in line buffer */
+ GLOBAL char argbuf[FTPBUFLEN]; /* argument storage buffer */
+@@ -336,29 +331,7 @@
+ #endif
+
+ #ifdef NO_LONG_LONG
+-# define LLF "%ld"
+-# define LLFP(x) "%" x "ld"
+-# define LLT long
+-# define ULLF "%lu"
+-# define ULLFP(x) "%" x "lu"
+-# define ULLT unsigned long
+ # define STRTOLL(x,y,z) strtol(x,y,z)
+ #else
+-#if 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
+-# define STRTOLL(x,y,z) strtoll(x,y,z)
+-#else
+-# 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
+ # define STRTOLL(x,y,z) strtoll(x,y,z)
+-#endif
+ #endif
+diff -Nru src/main.c /home/spock/ftp/main.c
+--- src/main.c Sat Jun 15 05:40:36 2002
++++ /home/spock/ftp/main.c Thu Jun 12 02:02:11 2003
+@@ -1,4 +1,4 @@
+-/* $NetBSD: main.c,v 1.82 2002/06/05 13:51:54 lukem Exp $ */
++/* $NetBSD: main.c,v 1.84 2003/05/14 14:31:00 wiz Exp $ */
+
+ /*-
+ * Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
+@@ -98,11 +98,36 @@
+ * SUCH DAMAGE.
+ */
+
++#include <sys/cdefs.h>
++#ifndef lint
++__COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\n\
++ The Regents of the University of California. All rights reserved.\n");
++#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.84 2003/05/14 14:31:00 wiz Exp $");
++#endif
++#endif /* not lint */
++
+ /*
+ * FTP User Program -- Command Interface.
+ */
++#include <sys/types.h>
++#include <sys/socket.h>
+
+-#include "lukemftp.h"
++#include <err.h>
++#include <errno.h>
++#include <netdb.h>
++#include <paths.h>
++#include <pwd.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <locale.h>
+
+ #define GLOBAL /* force GLOBAL decls in ftp_var.h to be declared */
+ #include "ftp_var.h"
+@@ -123,9 +148,7 @@
+ char *cp, *ep, *anonuser, *anonpass, *upload_path;
+ int dumbterm, s, len, isupload;
+
+-#if 0 /* XXX */
+ setlocale(LC_ALL, "");
+-#endif
+ setprogname(argv[0]);
+
+ ftpport = "ftp";
+@@ -258,7 +281,7 @@
+ }
+ }
+
+- while ((ch = getopt(argc, argv, "46AadefginN:o:pP:r:RtT:u:vV")) != -1) {
++ while ((ch = getopt(argc, argv, "46AadefginN:o:pP:q:r:RtT:u:vV")) != -1) {
+ switch (ch) {
+ case '4':
+ family = AF_INET;
+@@ -330,6 +353,12 @@
+ ftpport = optarg;
+ break;
+
++ case 'q':
++ quit_time = strtol(optarg, &ep, 10);
++ if (quit_time < 1 || *ep != '\0')
++ errx(1, "bad quit value: %s", optarg);
++ break;
++
+ case 'r':
+ retry_connect = strtol(optarg, &ep, 10);
+ if (retry_connect < 1 || *ep != '\0')
+@@ -1003,6 +1032,6 @@
+ " [-T dir,max[,inc][[user@]host [port]]] [host:path[/]]\n"
+ " [file:///file] [ftp://[user[:pass]@]host[:port]/path[/]]\n"
+ " [http://[user[:pass]@]host[:port]/path] [...]\n"
+-" %s -u url file [...]\n", progname, progname);
++" %s -u URL file [...]\n", progname, progname);
+ exit(1);
+ }
+diff -Nru src/progressbar.c /home/spock/ftp/progressbar.c
+--- src/progressbar.c Wed Dec 31 19:00:00 1969
++++ /home/spock/ftp/progressbar.c Thu Jun 12 02:02:11 2003
+@@ -0,0 +1,460 @@
++/* $NetBSD: progressbar.c,v 1.3 2003/02/28 09:53:49 lukem Exp $ */
++
++/*-
++ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
++ * All rights reserved.
++ *
++ * This code is derived from software contributed to The NetBSD Foundation
++ * by Luke Mewburn.
++ *
++ * This code is derived from software contributed to The NetBSD Foundation
++ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
++ * NASA Ames Research Center.
++ *
++ * 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.
++ */
++
++#include <sys/cdefs.h>
++#ifndef lint
++__RCSID("$NetBSD: progressbar.c,v 1.3 2003/02/28 09:53:49 lukem Exp $");
++#endif /* not lint */
++
++/*
++ * FTP User Program -- Misc support routines
++ */
++#include <sys/types.h>
++#include <sys/param.h>
++
++#include <err.h>
++#include <errno.h>
++#include <signal.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <time.h>
++#include <tzfile.h>
++#include <unistd.h>
++
++#include "progressbar.h"
++
++#if !defined(NO_PROGRESS)
++/*
++ * return non-zero if we're the current foreground process
++ */
++int
++foregroundproc(void)
++{
++ static pid_t pgrp = -1;
++
++ if (pgrp == -1)
++ pgrp = getpgrp();
++
++ return (tcgetpgrp(fileno(ttyout)) == pgrp);
++}
++#endif /* !defined(NO_PROGRESS) */
++
++
++#ifndef NO_PROGRESS
++static void updateprogressmeter(int);
++
++/*
++ * SIGALRM handler to update the progress meter
++ */
++static void
++updateprogressmeter(int dummy)
++{
++ int oerrno = errno;
++
++ progressmeter(0);
++ errno = oerrno;
++}
++#endif /* NO_PROGRESS */
++
++
++/*
++ * List of order of magnitude prefixes.
++ * The last is `P', as 2^64 = 16384 Petabytes
++ */
++static const char prefixes[] = " KMGTP";
++
++/*
++ * Display a transfer progress bar if progress is non-zero.
++ * SIGALRM is hijacked for use by this function.
++ * - Before the transfer, set filesize to size of file (or -1 if unknown),
++ * and call with flag = -1. This starts the once per second timer,
++ * and a call to updateprogressmeter() upon SIGALRM.
++ * - During the transfer, updateprogressmeter will call progressmeter
++ * with flag = 0
++ * - After the transfer, call with flag = 1
++ */
++static struct timeval start;
++static struct timeval lastupdate;
++
++#define BUFLEFT (sizeof(buf) - len)
++
++void
++progressmeter(int flag)
++{
++ static off_t lastsize;
++ off_t cursize;
++ struct timeval now, wait;
++#ifndef NO_PROGRESS
++ struct timeval td;
++ off_t abbrevsize, bytespersec;
++ double elapsed;
++ int ratio, barlength, i, len, remaining;
++
++ /*
++ * Work variables for progress bar.
++ *
++ * XXX: if the format of the progress bar changes
++ * (especially the number of characters in the
++ * `static' portion of it), be sure to update
++ * these appropriately.
++ */
++ char buf[256]; /* workspace for progress bar */
++#define BAROVERHEAD 43 /* non `*' portion of progress bar */
++ /*
++ * stars should contain at least
++ * sizeof(buf) - BAROVERHEAD entries
++ */
++ static const char stars[] =
++"*****************************************************************************"
++"*****************************************************************************"
++"*****************************************************************************";
++
++#endif
++
++ if (flag == -1) {
++ (void)gettimeofday(&start, NULL);
++ lastupdate = start;
++ lastsize = restart_point;
++ }
++
++ (void)gettimeofday(&now, NULL);
++ cursize = bytes + restart_point;
++ timersub(&now, &lastupdate, &wait);
++ if (cursize > lastsize) {
++ lastupdate = now;
++ lastsize = cursize;
++ wait.tv_sec = 0;
++ } else {
++#ifndef STANDALONE_PROGRESS
++ if (quit_time > 0 && wait.tv_sec > quit_time) {
++ len = snprintf(buf, sizeof(buf), "\r\n%s: "
++ "transfer aborted because stalled for %lu sec.\r\n",
++ getprogname(), (unsigned long)wait.tv_sec);
++ (void)write(fileno(ttyout), buf, len);
++ (void)xsignal(SIGALRM, SIG_DFL);
++ alarmtimer(0);
++ siglongjmp(toplevel, 1);
++ }
++#endif /* !STANDALONE_PROGRESS */
++ }
++ /*
++ * Always set the handler even if we are not the foreground process.
++ */
++#ifdef STANDALONE_PROGRESS
++ if (progress) {
++#else
++ if (quit_time > 0 || progress) {
++#endif /* !STANDALONE_PROGRESS */
++ if (flag == -1) {
++ (void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
++ alarmtimer(1); /* set alarm timer for 1 Hz */
++ } else if (flag == 1) {
++ (void)xsignal(SIGALRM, SIG_DFL);
++ alarmtimer(0);
++ }
++ }
++#ifndef NO_PROGRESS
++ if (!progress)
++ return;
++ len = 0;
++
++ /*
++ * print progress bar only if we are foreground process.
++ */
++ if (! foregroundproc())
++ return;
++
++ len += snprintf(buf + len, BUFLEFT, "\r");
++ if (filesize > 0) {
++ ratio = (int)((double)cursize * 100.0 / (double)filesize);
++ ratio = MAX(ratio, 0);
++ ratio = MIN(ratio, 100);
++ len += snprintf(buf + len, BUFLEFT, "%3d%% ", ratio);
++
++ /*
++ * calculate the length of the `*' bar, ensuring that
++ * the number of stars won't exceed the buffer size
++ */
++ barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
++ if (barlength > 0) {
++ i = barlength * ratio / 100;
++ len += snprintf(buf + len, BUFLEFT,
++ "|%.*s%*s|", i, stars, barlength - i, "");
++ }
++ }
++
++ abbrevsize = cursize;
++ for (i = 0; abbrevsize >= 100000 && i < sizeof(prefixes); i++)
++ abbrevsize >>= 10;
++ len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %c%c ",
++ (LLT)abbrevsize,
++ prefixes[i],
++ i == 0 ? ' ' : 'B');
++
++ timersub(&now, &start, &td);
++ elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
++
++ bytespersec = 0;
++ if (bytes > 0) {
++ bytespersec = bytes;
++ if (elapsed > 0.0)
++ bytespersec /= elapsed;
++ }
++ for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
++ bytespersec >>= 10;
++ len += snprintf(buf + len, BUFLEFT,
++ " " LLFP("3") ".%02d %cB/s ",
++ (LLT)(bytespersec / 1024),
++ (int)((bytespersec % 1024) * 100 / 1024),
++ prefixes[i]);
++
++ if (filesize > 0) {
++ if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
++ len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
++ } else if (wait.tv_sec >= STALLTIME) {
++ len += snprintf(buf + len, BUFLEFT, " - stalled -");
++ } else {
++ remaining = (int)
++ ((filesize - restart_point) / (bytes / elapsed) -
++ elapsed);
++ if (remaining >= 100 * SECSPERHOUR)
++ len += snprintf(buf + len, BUFLEFT,
++ " --:-- ETA");
++ else {
++ i = remaining / SECSPERHOUR;
++ if (i)
++ len += snprintf(buf + len, BUFLEFT,
++ "%2d:", i);
++ else
++ len += snprintf(buf + len, BUFLEFT,
++ " ");
++ i = remaining % SECSPERHOUR;
++ len += snprintf(buf + len, BUFLEFT,
++ "%02d:%02d ETA", i / 60, i % 60);
++ }
++ }
++ }
++ if (flag == 1)
++ len += snprintf(buf + len, BUFLEFT, "\n");
++ (void)write(fileno(ttyout), buf, len);
++
++#endif /* !NO_PROGRESS */
++}
++
++#ifndef STANDALONE_PROGRESS
++/*
++ * Display transfer statistics.
++ * Requires start to be initialised by progressmeter(-1),
++ * direction to be defined by xfer routines, and filesize and bytes
++ * to be updated by xfer routines
++ * If siginfo is nonzero, an ETA is displayed, and the output goes to stderr
++ * instead of ttyout.
++ */
++void
++ptransfer(int siginfo)
++{
++ struct timeval now, td, wait;
++ double elapsed;
++ off_t bytespersec;
++ int remaining, hh, i, len;
++
++ char buf[256]; /* Work variable for transfer status. */
++
++ if (!verbose && !progress && !siginfo)
++ return;
++
++ (void)gettimeofday(&now, NULL);
++ timersub(&now, &start, &td);
++ elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
++ bytespersec = 0;
++ if (bytes > 0) {
++ bytespersec = bytes;
++ if (elapsed > 0.0)
++ bytespersec /= elapsed;
++ }
++ len = 0;
++ len += snprintf(buf + len, BUFLEFT, LLF " byte%s %s in ",
++ (LLT)bytes, bytes == 1 ? "" : "s", direction);
++ remaining = (int)elapsed;
++ if (remaining > SECSPERDAY) {
++ int days;
++
++ days = remaining / SECSPERDAY;
++ remaining %= SECSPERDAY;
++ len += snprintf(buf + len, BUFLEFT,
++ "%d day%s ", days, days == 1 ? "" : "s");
++ }
++ hh = remaining / SECSPERHOUR;
++ remaining %= SECSPERHOUR;
++ if (hh)
++ len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
++ len += snprintf(buf + len, BUFLEFT,
++ "%02d:%02d ", remaining / 60, remaining % 60);
++
++ for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
++ bytespersec >>= 10;
++ len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %cB/s)",
++ (LLT)(bytespersec / 1024),
++ (int)((bytespersec % 1024) * 100 / 1024),
++ prefixes[i]);
++
++ if (siginfo && bytes > 0 && elapsed > 0.0 && filesize >= 0
++ && bytes + restart_point <= filesize) {
++ remaining = (int)((filesize - restart_point) /
++ (bytes / elapsed) - elapsed);
++ hh = remaining / SECSPERHOUR;
++ remaining %= SECSPERHOUR;
++ len += snprintf(buf + len, BUFLEFT, " ETA: ");
++ if (hh)
++ len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
++ len += snprintf(buf + len, BUFLEFT, "%02d:%02d",
++ remaining / 60, remaining % 60);
++ timersub(&now, &lastupdate, &wait);
++ if (wait.tv_sec >= STALLTIME)
++ len += snprintf(buf + len, BUFLEFT, " (stalled)");
++ }
++ len += snprintf(buf + len, BUFLEFT, "\n");
++ (void)write(siginfo ? STDERR_FILENO : fileno(ttyout), buf, len);
++}
++
++/*
++ * SIG{INFO,QUIT} handler to print transfer stats if a transfer is in progress
++ */
++void
++psummary(int notused)
++{
++ int oerrno = errno;
++
++ if (bytes > 0) {
++ if (fromatty)
++ write(fileno(ttyout), "\n", 1);
++ ptransfer(1);
++ }
++ errno = oerrno;
++}
++#endif /* !STANDALONE_PROGRESS */
++
++
++/*
++ * Set the SIGALRM interval timer for wait seconds, 0 to disable.
++ */
++void
++alarmtimer(int wait)
++{
++ struct itimerval itv;
++
++ itv.it_value.tv_sec = wait;
++ itv.it_value.tv_usec = 0;
++ itv.it_interval = itv.it_value;
++ setitimer(ITIMER_REAL, &itv, NULL);
++}
++
++
++/*
++ * Install a POSIX signal handler, allowing the invoker to set whether
++ * the signal should be restartable or not
++ */
++sigfunc
++xsignal_restart(int sig, sigfunc func, int restartable)
++{
++ struct sigaction act, oact;
++ act.sa_handler = func;
++
++ sigemptyset(&act.sa_mask);
++#if defined(SA_RESTART) /* 4.4BSD, Posix(?), SVR4 */
++ act.sa_flags = restartable ? SA_RESTART : 0;
++#elif defined(SA_INTERRUPT) /* SunOS 4.x */
++ act.sa_flags = restartable ? 0 : SA_INTERRUPT;
++#else
++#error "system must have SA_RESTART or SA_INTERRUPT"
++#endif
++ if (sigaction(sig, &act, &oact) < 0)
++ return (SIG_ERR);
++ return (oact.sa_handler);
++}
++
++/*
++ * Install a signal handler with the `restartable' flag set dependent upon
++ * which signal is being set. (This is a wrapper to xsignal_restart())
++ */
++sigfunc
++xsignal(int sig, sigfunc func)
++{
++ int restartable;
++
++ /*
++ * Some signals print output or change the state of the process.
++ * There should be restartable, so that reads and writes are
++ * not affected. Some signals should cause program flow to change;
++ * these signals should not be restartable, so that the system call
++ * will return with EINTR, and the program will go do something
++ * different. If the signal handler calls longjmp() or siglongjmp(),
++ * it doesn't matter if it's restartable.
++ */
++
++ switch(sig) {
++#ifdef SIGINFO
++ case SIGINFO:
++#endif
++ case SIGQUIT:
++ case SIGUSR1:
++ case SIGUSR2:
++ case SIGWINCH:
++ restartable = 1;
++ break;
++
++ case SIGALRM:
++ case SIGINT:
++ case SIGPIPE:
++ restartable = 0;
++ break;
++
++ default:
++ /*
++ * This is unpleasant, but I don't know what would be better.
++ * Right now, this "can't happen"
++ */
++ errx(1, "xsignal_restart called with signal %d", sig);
++ }
++
++ return(xsignal_restart(sig, func, restartable));
++}
+diff -Nru src/progressbar.h /home/spock/ftp/progressbar.h
+--- src/progressbar.h Wed Dec 31 19:00:00 1969
++++ /home/spock/ftp/progressbar.h Thu Jun 12 02:02:11 2003
+@@ -0,0 +1,99 @@
++/* $NetBSD: progressbar.h,v 1.3 2003/02/28 09:53:49 lukem Exp $ */
++
++/*-
++ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
++ * All rights reserved.
++ *
++ * This code is derived from software contributed to The NetBSD Foundation
++ * by Luke Mewburn.
++ *
++ * 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.
++ */
++
++#ifndef STANDALONE_PROGRESS
++#include <setjmp.h>
++#endif /* !STANDALONE_PROGRESS */
++
++#ifndef GLOBAL
++#define GLOBAL extern
++#endif
++
++
++#define STALLTIME 5 /* # of seconds of no xfer before "stalling" */
++
++typedef void (*sigfunc)(int);
++
++
++GLOBAL FILE *ttyout; /* stdout, or stderr if retrieving to stdout */
++
++GLOBAL int progress; /* display transfer progress bar */
++GLOBAL int ttywidth; /* width of tty */
++
++GLOBAL off_t bytes; /* current # of bytes read */
++GLOBAL off_t filesize; /* size of file being transferred */
++GLOBAL off_t restart_point; /* offset to restart transfer */
++
++
++#ifndef STANDALONE_PROGRESS
++GLOBAL int fromatty; /* input is from a terminal */
++GLOBAL int verbose; /* print messages coming back from server */
++GLOBAL int quit_time; /* maximum time to wait if stalled */
++
++GLOBAL char *direction; /* direction transfer is occurring */
++
++GLOBAL sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */
++#endif /* !STANDALONE_PROGRESS */
++
++int foregroundproc(void);
++void alarmtimer(int);
++void progressmeter(int);
++sigfunc xsignal(int, sigfunc);
++sigfunc xsignal_restart(int, sigfunc, int);
++
++#ifndef STANDALONE_PROGRESS
++void psummary(int);
++void ptransfer(int);
++#endif /* !STANDALONE_PROGRESS */
++
++
++#ifdef NO_LONG_LONG
++# define LLF "%ld"
++# define LLFP(x) "%" x "ld"
++# define LLT long
++# define ULLF "%lu"
++# define ULLFP(x) "%" x "lu"
++# define ULLT unsigned long
++#else
++# 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
+diff -Nru src/ruserpass.c /home/spock/ftp/ruserpass.c
+--- src/ruserpass.c Sat Jun 15 05:40:36 2002
++++ /home/spock/ftp/ruserpass.c Thu Jun 12 02:02:11 2003
+@@ -33,7 +33,26 @@
+ * SUCH DAMAGE.
+ */
+
+-#include "lukemftp.h"
++#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.28 2000/11/15 00:11:04 lukem Exp $");
++#endif
++#endif /* not lint */
++
++#include <sys/types.h>
++#include <sys/stat.h>
++
++#include <ctype.h>
++#include <err.h>
++#include <errno.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
+
+ #include "ftp_var.h"
+
+diff -Nru src/util.c /home/spock/ftp/util.c
+--- src/util.c Sat Jun 15 05:40:37 2002
++++ /home/spock/ftp/util.c Thu Jun 12 02:02:11 2003
+@@ -1,7 +1,7 @@
+-/* $NetBSD: util.c,v 1.107 2002/06/05 10:20:50 lukem Exp $ */
++/* $NetBSD: util.c,v 1.111 2003/02/28 09:54:51 lukem Exp $ */
+
+ /*-
+- * Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
++ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+@@ -73,11 +73,36 @@
+ * SUCH DAMAGE.
+ */
+
++#include <sys/cdefs.h>
++#ifndef lint
++__RCSID("$NetBSD: util.c,v 1.111 2003/02/28 09:54:51 lukem Exp $");
++#endif /* not lint */
++
+ /*
+ * FTP User Program -- Misc support routines
+ */
+-
+-#include "lukemftp.h"
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <sys/ioctl.h>
++#include <sys/time.h>
++#include <netinet/in.h>
++#include <arpa/ftp.h>
++
++#include <ctype.h>
++#include <err.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <glob.h>
++#include <signal.h>
++#include <limits.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <termios.h>
++#include <time.h>
++#include <tzfile.h>
++#include <unistd.h>
+
+ #include "ftp_var.h"
+
+@@ -775,303 +800,6 @@
+ code = ocode;
+ }
+
+-#ifndef NO_PROGRESS
+-
+-/*
+- * return non-zero if we're the current foreground process
+- */
+-int
+-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);
+-}
+-
+-
+-static void updateprogressmeter(int);
+-
+-/*
+- * SIGALRM handler to update the progress meter
+- */
+-static void
+-updateprogressmeter(int dummy)
+-{
+- int oerrno = errno;
+-
+- progressmeter(0);
+- errno = oerrno;
+-}
+-#endif /* NO_PROGRESS */
+-
+-
+-/*
+- * List of order of magnitude prefixes.
+- * The last is `P', as 2^64 = 16384 Petabytes
+- */
+-static const char prefixes[] = " KMGTP";
+-
+-/*
+- * Display a transfer progress bar if progress is non-zero.
+- * SIGALRM is hijacked for use by this function.
+- * - Before the transfer, set filesize to size of file (or -1 if unknown),
+- * and call with flag = -1. This starts the once per second timer,
+- * and a call to updateprogressmeter() upon SIGALRM.
+- * - During the transfer, updateprogressmeter will call progressmeter
+- * with flag = 0
+- * - After the transfer, call with flag = 1
+- */
+-static struct timeval start;
+-static struct timeval lastupdate;
+-
+-#define BUFLEFT (sizeof(buf) - len)
+-
+-void
+-progressmeter(int flag)
+-{
+- static off_t lastsize;
+-#ifndef NO_PROGRESS
+- struct timeval now, td, wait;
+- off_t cursize, abbrevsize, bytespersec;
+- double elapsed;
+- int ratio, barlength, i, len, remaining;
+-
+- /*
+- * Work variables for progress bar.
+- *
+- * XXX: if the format of the progress bar changes
+- * (especially the number of characters in the
+- * `static' portion of it), be sure to update
+- * these appropriately.
+- */
+- char buf[256]; /* workspace for progress bar */
+-#define BAROVERHEAD 43 /* non `*' portion of progress bar */
+- /*
+- * stars should contain at least
+- * sizeof(buf) - BAROVERHEAD entries
+- */
+- const char stars[] =
+-"*****************************************************************************"
+-"*****************************************************************************"
+-"*****************************************************************************";
+-
+-#endif
+-
+- if (flag == -1) {
+- (void)gettimeofday(&start, NULL);
+- lastupdate = start;
+- lastsize = restart_point;
+- }
+-#ifndef NO_PROGRESS
+- if (!progress)
+- return;
+- len = 0;
+-
+- /*
+- * print progress bar only if we are foreground process.
+- */
+- if (! foregroundproc())
+- return;
+-
+- (void)gettimeofday(&now, NULL);
+- cursize = bytes + restart_point;
+- timersub(&now, &lastupdate, &wait);
+- if (cursize > lastsize) {
+- lastupdate = now;
+- lastsize = cursize;
+- wait.tv_sec = 0;
+- }
+-
+- len += snprintf(buf + len, BUFLEFT, "\r");
+- if (filesize > 0) {
+- ratio = (int)((double)cursize * 100.0 / (double)filesize);
+- ratio = MAX(ratio, 0);
+- ratio = MIN(ratio, 100);
+- len += snprintf(buf + len, BUFLEFT, "%3d%% ", ratio);
+-
+- /*
+- * calculate the length of the `*' bar, ensuring that
+- * the number of stars won't exceed the buffer size
+- */
+- barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
+- if (barlength > 0) {
+- i = barlength * ratio / 100;
+- len += snprintf(buf + len, BUFLEFT,
+- "|%.*s%*s|", i, stars, barlength - i, "");
+- }
+- }
+-
+- abbrevsize = cursize;
+- for (i = 0; abbrevsize >= 100000 && i < sizeof(prefixes); i++)
+- abbrevsize >>= 10;
+- len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %c%c ",
+- (LLT)abbrevsize,
+- prefixes[i],
+- i == 0 ? ' ' : 'B');
+-
+- timersub(&now, &start, &td);
+- elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
+-
+- bytespersec = 0;
+- if (bytes > 0) {
+- bytespersec = bytes;
+- if (elapsed > 0.0)
+- bytespersec /= elapsed;
+- }
+- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
+- bytespersec >>= 10;
+- len += snprintf(buf + len, BUFLEFT,
+- " " LLFP("3") ".%02d %cB/s ",
+- (LLT)(bytespersec / 1024),
+- (int)((bytespersec % 1024) * 100 / 1024),
+- prefixes[i]);
+-
+- if (filesize > 0) {
+- if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
+- len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
+- } else if (flag == 1) {
+- i = elapsed / SECSPERHOUR;
+- if (i)
+- len += snprintf(buf + len, BUFLEFT, "%2d:", i);
+- else
+- len += snprintf(buf + len, BUFLEFT, " ");
+- i = (int)elapsed % SECSPERHOUR;
+- len += snprintf(buf + len, BUFLEFT,
+- "%02d:%02d ", i / 60, i % 60);
+- } else if (wait.tv_sec >= STALLTIME) {
+- len += snprintf(buf + len, BUFLEFT, " - stalled -");
+- } else {
+- remaining = (int)
+- ((filesize - restart_point) / (bytes / elapsed) -
+- elapsed);
+- if (remaining >= 100 * SECSPERHOUR)
+- len += snprintf(buf + len, BUFLEFT,
+- " --:-- ETA");
+- else {
+- i = remaining / SECSPERHOUR;
+- if (i)
+- len += snprintf(buf + len, BUFLEFT,
+- "%2d:", i);
+- else
+- len += snprintf(buf + len, BUFLEFT,
+- " ");
+- i = remaining % SECSPERHOUR;
+- len += snprintf(buf + len, BUFLEFT,
+- "%02d:%02d ETA", i / 60, i % 60);
+- }
+- }
+- }
+- if (flag == 1)
+- len += snprintf(buf + len, BUFLEFT, "\n");
+- (void)write(fileno(ttyout), buf, len);
+-
+- if (flag == -1) {
+- (void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
+- alarmtimer(1); /* set alarm timer for 1 Hz */
+- } else if (flag == 1) {
+- (void)xsignal(SIGALRM, SIG_DFL);
+- alarmtimer(0);
+- }
+-#endif /* !NO_PROGRESS */
+-}
+-
+-/*
+- * Display transfer statistics.
+- * Requires start to be initialised by progressmeter(-1),
+- * direction to be defined by xfer routines, and filesize and bytes
+- * to be updated by xfer routines
+- * If siginfo is nonzero, an ETA is displayed, and the output goes to stderr
+- * instead of ttyout.
+- */
+-void
+-ptransfer(int siginfo)
+-{
+- struct timeval now, td, wait;
+- double elapsed;
+- off_t bytespersec;
+- int remaining, hh, i, len;
+-
+- char buf[256]; /* Work variable for transfer status. */
+-
+- if (!verbose && !progress && !siginfo)
+- return;
+-
+- (void)gettimeofday(&now, NULL);
+- timersub(&now, &start, &td);
+- elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
+- bytespersec = 0;
+- if (bytes > 0) {
+- bytespersec = bytes;
+- if (elapsed > 0.0)
+- bytespersec /= elapsed;
+- }
+- len = 0;
+- len += snprintf(buf + len, BUFLEFT, LLF " byte%s %s in ",
+- (LLT)bytes, bytes == 1 ? "" : "s", direction);
+- remaining = (int)elapsed;
+- if (remaining > SECSPERDAY) {
+- int days;
+-
+- days = remaining / SECSPERDAY;
+- remaining %= SECSPERDAY;
+- len += snprintf(buf + len, BUFLEFT,
+- "%d day%s ", days, days == 1 ? "" : "s");
+- }
+- hh = remaining / SECSPERHOUR;
+- remaining %= SECSPERHOUR;
+- if (hh)
+- len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
+- len += snprintf(buf + len, BUFLEFT,
+- "%02d:%02d ", remaining / 60, remaining % 60);
+-
+- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
+- bytespersec >>= 10;
+- len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %cB/s)",
+- (LLT)(bytespersec / 1024),
+- (int)((bytespersec % 1024) * 100 / 1024),
+- prefixes[i]);
+-
+- if (siginfo && bytes > 0 && elapsed > 0.0 && filesize >= 0
+- && bytes + restart_point <= filesize) {
+- remaining = (int)((filesize - restart_point) /
+- (bytes / elapsed) - elapsed);
+- hh = remaining / SECSPERHOUR;
+- remaining %= SECSPERHOUR;
+- len += snprintf(buf + len, BUFLEFT, " ETA: ");
+- if (hh)
+- len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
+- len += snprintf(buf + len, BUFLEFT, "%02d:%02d",
+- remaining / 60, remaining % 60);
+- timersub(&now, &lastupdate, &wait);
+- if (wait.tv_sec >= STALLTIME)
+- len += snprintf(buf + len, BUFLEFT, " (stalled)");
+- }
+- len += snprintf(buf + len, BUFLEFT, "\n");
+- (void)write(siginfo ? STDERR_FILENO : fileno(ttyout), buf, len);
+-}
+-
+-/*
+- * SIG{INFO,QUIT} handler to print transfer stats if a transfer is in progress
+- */
+-void
+-psummary(int notused)
+-{
+- int oerrno = errno;
+-
+- if (bytes > 0) {
+- if (fromatty)
+- write(fileno(ttyout), "\n", 1);
+- ptransfer(1);
+- }
+- errno = oerrno;
+-}
+
+ /*
+ * List words in stringlist, vertically arranged
+@@ -1158,20 +886,6 @@
+
+
+ /*
+- * Set the SIGALRM interval timer for wait seconds, 0 to disable.
+- */
+-void
+-alarmtimer(int wait)
+-{
+- struct itimerval itv;
+-
+- itv.it_value.tv_sec = wait;
+- itv.it_value.tv_usec = 0;
+- itv.it_interval = itv.it_value;
+- setitimer(ITIMER_REAL, &itv, NULL);
+-}
+-
+-/*
+ * Setup or cleanup EditLine structures
+ */
+ #ifndef NO_EDITCOMPLETE
+@@ -1552,85 +1266,4 @@
+ if (s == NULL)
+ err(1, "Unable to allocate memory for string copy");
+ return (s);
+-}
+-
+-/*
+- * Install a POSIX signal handler, allowing the invoker to set whether
+- * the signal should be restartable or not
+- */
+-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;
+-
+- sigemptyset(&act.sa_mask);
+-#if defined(SA_RESTART) /* 4.4BSD, Posix(?), SVR4 */
+- act.sa_flags = restartable ? SA_RESTART : 0;
+-#elif defined(SA_INTERRUPT) /* SunOS 4.x */
+- act.sa_flags = restartable ? 0 : SA_INTERRUPT;
+-#else
+-#error "system must have SA_RESTART or SA_INTERRUPT"
+-#endif
+- if (sigaction(sig, &act, &oact) < 0)
+- return (SIG_ERR);
+- return (oact.sa_handler);
+-#endif /* ! ultrix */
+-}
+-
+-/*
+- * Install a signal handler with the `restartable' flag set dependent upon
+- * which signal is being set. (This is a wrapper to xsignal_restart())
+- */
+-sigfunc
+-xsignal(int sig, sigfunc func)
+-{
+- int restartable;
+-
+- /*
+- * Some signals print output or change the state of the process.
+- * There should be restartable, so that reads and writes are
+- * not affected. Some signals should cause program flow to change;
+- * these signals should not be restartable, so that the system call
+- * will return with EINTR, and the program will go do something
+- * different. If the signal handler calls longjmp() or siglongjmp(),
+- * it doesn't matter if it's restartable.
+- */
+-
+- switch(sig) {
+-#ifdef SIGINFO
+- case SIGINFO:
+-#endif
+- case SIGQUIT:
+- case SIGUSR1:
+- case SIGUSR2:
+- case SIGWINCH:
+- restartable = 1;
+- break;
+-
+- case SIGALRM:
+- case SIGINT:
+- case SIGPIPE:
+- restartable = 0;
+- break;
+-
+- default:
+- /*
+- * This is unpleasant, but I don't know what would be better.
+- * Right now, this "can't happen"
+- */
+- errx(1, "xsignal_restart called with signal %d", sig);
+- }
+-
+- return(xsignal_restart(sig, func, restartable));
+ }
+diff -Nru src/version.h /home/spock/ftp/version.h
+--- src/version.h Sat Jun 15 05:40:37 2002
++++ /home/spock/ftp/version.h Thu Jun 12 02:02:11 2003
+@@ -1,6 +1,6 @@
+-/* $NetBSD: version.h,v 1.29 2002/06/05 10:20:51 lukem Exp $ */
++/* $NetBSD: version.h,v 1.30 2003/02/28 09:54:20 lukem Exp $ */
+ /*-
+- * Copyright (c) 1999-2002 The NetBSD Foundation, Inc.
++ * Copyright (c) 1999-2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+@@ -40,5 +40,5 @@
+ #endif
+
+ #ifndef FTP_VERSION
+-#define FTP_VERSION "20020605"
++#define FTP_VERSION "20030228"
+ #endif
diff --git a/contrib/lukemftp/src/Makefile b/contrib/lukemftp/src/Makefile
new file mode 100644
index 000000000000..4ba5e9202efa
--- /dev/null
+++ b/contrib/lukemftp/src/Makefile
@@ -0,0 +1,26 @@
+# $NetBSD: Makefile,v 1.26 2003/01/21 16:08:06 jhawk Exp $
+# from: @(#)Makefile 8.2 (Berkeley) 4/3/94
+
+PROG= ftp
+SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c \
+ progressbar.c ruserpass.c util.c
+
+# Uncomment the following to provide defaults for gate-ftp operation
+#
+#CPPFLAGS+=-DGATE_SERVER=\"ftp-gw.host\" # -DGATE_PORT=21
+
+.if defined(SMALLPROG)
+CPPFLAGS+=-DNO_EDITCOMPLETE -DNO_ABOUT
+.else
+LDADD+= -ledit -ltermcap
+DPADD+= ${LIBEDIT} ${LIBTERMCAP}
+.endif
+
+.if !defined(SMALLPROG) || defined(SMALLPROG_INET6)
+CPPFLAGS+= -DINET6
+.endif
+
+cmds.o fetch.o: version.h
+main.o: ftp_var.h
+
+.include <bsd.prog.mk>
diff --git a/contrib/lukemftp/src/cmds.c b/contrib/lukemftp/src/cmds.c
index e13240007222..69aebedf8d14 100644
--- a/contrib/lukemftp/src/cmds.c
+++ b/contrib/lukemftp/src/cmds.c
@@ -1,4 +1,4 @@
-/* $NetBSD: cmds.c,v 1.98 2002/06/05 10:20:46 lukem Exp $ */
+/* $NetBSD: cmds.c,v 1.100 2002/11/30 03:10:55 lukem Exp $ */
/*-
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
@@ -102,11 +102,36 @@
* SUCH DAMAGE.
*/
+#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.100 2002/11/30 03:10:55 lukem Exp $");
+#endif
+#endif /* not lint */
+
/*
* FTP User Program -- Command Routines.
*/
-
-#include "lukemftp.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <arpa/ftp.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <glob.h>
+#include <limits.h>
+#include <netdb.h>
+#include <paths.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <libutil.h>
#include "ftp_var.h"
#include "version.h"
@@ -1008,7 +1033,7 @@ setgate(int argc, char *argv[])
gatemode = 0;
else {
if (argc == 3)
- gateport = strdup(argv[2]);
+ gateport = xstrdup(argv[2]);
(void)strlcpy(gsbuf, argv[1], sizeof(gsbuf));
gateserver = gsbuf;
gatemode = 1;
diff --git a/contrib/lukemftp/src/cmdtab.c b/contrib/lukemftp/src/cmdtab.c
index 0f52fe26682b..0d013b46ef81 100644
--- a/contrib/lukemftp/src/cmdtab.c
+++ b/contrib/lukemftp/src/cmdtab.c
@@ -1,4 +1,4 @@
-/* $NetBSD: cmdtab.c,v 1.39 2000/11/15 00:10:59 lukem Exp $ */
+/* $NetBSD: cmdtab.c,v 1.40 2002/07/29 04:24:47 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
@@ -69,8 +69,16 @@
* SUCH DAMAGE.
*/
-#include "lukemftp.h"
+#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.40 2002/07/29 04:24:47 lukem Exp $");
+#endif
+#endif /* not lint */
+#include <stdio.h>
#include "ftp_var.h"
/*
@@ -123,7 +131,7 @@ char nmaphelp[] = "set templates for default file name mapping";
char ntranshelp[] = "set translation table for default file name mapping";
char optshelp[] = "show or set options for remote commands";
char pagehelp[] = "view a remote file through your pager";
-char passivehelp[] = "enter passive transfer mode";
+char passivehelp[] = "toggle use of passive transfer mode";
char plshelp[] = "list contents of remote path through your pager";
char pmlsdhelp[] = "list contents of remote directory in a machine "
"parsable form through your pager";
diff --git a/contrib/lukemftp/src/complete.c b/contrib/lukemftp/src/complete.c
index 5d68361ee76a..8831bc199420 100644
--- a/contrib/lukemftp/src/complete.c
+++ b/contrib/lukemftp/src/complete.c
@@ -36,11 +36,23 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: complete.c,v 1.38 2000/05/01 10:35:17 lukem Exp $");
+#endif /* not lint */
+
/*
* FTP user program - command and file completion routines
*/
-#include "lukemftp.h"
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include "ftp_var.h"
diff --git a/contrib/lukemftp/src/domacro.c b/contrib/lukemftp/src/domacro.c
index 09109b01b0c4..5a4c736c30e5 100644
--- a/contrib/lukemftp/src/domacro.c
+++ b/contrib/lukemftp/src/domacro.c
@@ -33,7 +33,18 @@
* SUCH DAMAGE.
*/
-#include "lukemftp.h"
+#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.19 2002/02/01 05:04:43 itojun Exp $");
+#endif
+#endif /* not lint */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
#include "ftp_var.h"
diff --git a/contrib/lukemftp/src/extern.h b/contrib/lukemftp/src/extern.h
index 0136f43b5f60..06fdc407fd31 100644
--- a/contrib/lukemftp/src/extern.h
+++ b/contrib/lukemftp/src/extern.h
@@ -1,7 +1,7 @@
-/* $NetBSD: extern.h,v 1.60 2000/10/11 14:46:03 is Exp $ */
+/* $NetBSD: extern.h,v 1.61 2003/01/21 16:08:07 jhawk Exp $ */
/*-
- * Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -110,7 +110,6 @@ void abortpt(int);
void abortxfer(int);
void account(int, char **);
void ai_unmapped(struct addrinfo *);
-void alarmtimer(int);
int another(int *, char ***, const char *);
int auto_fetch(int, char **);
int auto_put(int, char **, const char *);
@@ -123,7 +122,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);
@@ -183,14 +182,11 @@ void newer(int, char **);
void page(int, char **);
int parseport(const char *, int);
int parserate(int, char **, int);
-void progressmeter(int);
char *prompt(void);
void proxabort(int);
void proxtrans(const char *, const char *, const char *);
void psabort(int);
-void psummary(int);
void pswitch(int);
-void ptransfer(int);
void put(int, char **);
void pwd(int, char **);
void quit(int, char **);
@@ -263,5 +259,3 @@ void *xmalloc(size_t);
StringList *xsl_init(void);
void xsl_add(StringList *, char *);
char *xstrdup(const char *);
-sigfunc xsignal(int, sigfunc);
-sigfunc xsignal_restart(int, sigfunc, int);
diff --git a/contrib/lukemftp/src/fetch.c b/contrib/lukemftp/src/fetch.c
index 1827abd85d4c..b442e0cf5037 100644
--- a/contrib/lukemftp/src/fetch.c
+++ b/contrib/lukemftp/src/fetch.c
@@ -1,7 +1,7 @@
-/* $NetBSD: fetch.c,v 1.136 2002/06/05 10:20:48 lukem Exp $ */
+/* $NetBSD: fetch.c,v 1.141 2003/05/14 14:31:00 wiz Exp $ */
/*-
- * Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -39,11 +39,37 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: fetch.c,v 1.141 2003/05/14 14:31:00 wiz Exp $");
+#endif /* not lint */
+
/*
* FTP User Program -- Command line file retrieval
*/
-#include "lukemftp.h"
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#include <netinet/in.h>
+
+#include <arpa/ftp.h>
+#include <arpa/inet.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <libutil.h>
#include "ftp_var.h"
#include "version.h"
@@ -155,7 +181,7 @@ auth_url(const char *challenge, char **response, const char *guser,
*response = (char *)xmalloc(rlen);
(void)strlcpy(*response, scheme, rlen);
len = strlcat(*response, " ", rlen);
- base64_encode(clear, clen, *response + len);
+ base64_encode(clear, clen, (u_char *)*response + len);
memset(clear, 0, clen);
rval = 0;
@@ -235,12 +261,12 @@ url_decode(char *url)
* XXX: this is not totally RFC 1738 compliant; <path> will have the
* leading `/' unless it's an ftp:// URL, as this makes things easier
* for file:// and http:// URLs. ftp:// URLs have the `/' between the
- * host and the url-path removed, but any additional leading slashes
- * in the url-path are retained (because they imply that we should
+ * host and the URL-path removed, but any additional leading slashes
+ * in the URL-path are retained (because they imply that we should
* later do "CWD" with a null argument).
*
* Examples:
- * input url output path
+ * input URL output path
* --------- -----------
* "ftp://host" NULL
* "http://host/" NULL
@@ -484,7 +510,8 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
rval = fetch_ftp(url);
goto cleanup_fetch_url;
}
- warnx("Invalid URL (no file after directory) `%s'", url);
+ warnx("no file after directory (you must specify an "
+ "output file) `%s'", url);
goto cleanup_fetch_url;
} else {
if (debug)
@@ -1741,7 +1768,7 @@ auto_put(int argc, char **argv, const char *uploadserver)
}
}
if (debug)
- fprintf(ttyout, "auto_put: url `%s' argv[2] `%s'\n",
+ fprintf(ttyout, "auto_put: URL `%s' argv[2] `%s'\n",
path, uargv[2] ? uargv[2] : "<null>");
/* connect and cwd */
diff --git a/contrib/lukemftp/src/ftp.1 b/contrib/lukemftp/src/ftp.1
index f162ca66153b..c719c861f501 100644
--- a/contrib/lukemftp/src/ftp.1
+++ b/contrib/lukemftp/src/ftp.1
@@ -1,6 +1,6 @@
-.\" $NetBSD: ftp.1,v 1.83 2002/06/05 10:20:48 lukem Exp $
+.\" $NetBSD: ftp.1,v 1.94 2003/05/14 14:31:00 wiz Exp $
.\"
-.\" Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
+.\" Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to The NetBSD Foundation
@@ -68,7 +68,7 @@
.\"
.\" @(#)ftp.1 8.3 (Berkeley) 10/9/94
.\"
-.Dd May 18, 2002
+.Dd January 20, 2003
.Dt FTP 1
.Os
.Sh NAME
@@ -76,7 +76,7 @@
.Nd
Internet file transfer program
.Sh SYNOPSIS
-.Nm ""
+.Nm
.Op Fl 46AadefginpRtvV
.Bk -words
.Op Fl N Ar netrc
@@ -88,46 +88,81 @@ Internet file transfer program
.Op Fl P Ar port
.Ek
.Bk -words
+.Op Fl q Ar quittime
+.Ek
+.Bk -words
.Op Fl r Ar retry
.Ek
.Bk -words
+.\" [-T dir,max[,inc]]
.Oo
-.Fl T
+.Fl T Xo
.Sm off
-.Xo
.Ar dir ,
.Ar max
.Op , Ar inc
-.Xc
.Sm on
+.Xc
.Oc
.Ek
.Bk -words
+.\" [[user@]host [port]]
.Oo
-[\fIuser\fR@]\fIhost\fR
+.Oo Ar user Ns Li \&@ Oc Ns Ar host
.Op Ar port
.Oc
.Ek
.Bk -words
-[\fIuser\fR@]\fIhost\fR:[\fIpath\fR][/]
+.\" [[user@]host:[path][/]]
+.Sm off
+.Oo
+.Op Ar user Li \&@
+.Ar host Li \&:
+.Op Ar path
+.Op Li /
+.Oc
+.Sm on
.Ek
.Bk -words
-.Op file:///\fIpath\fR
+.\" [file:///path]
+.Sm off
+.Oo
+.Li file:/// Ar path
+.Oc
+.Sm on
.Ek
.Bk -words
-.Op ftp://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR[/]
+.\" [ftp://[user[:password]@]host[:port]/path[/]]
+.Sm off
+.Oo
+.Li ftp://
+.Oo Ar user
+.Op Li \&: Ar password
+.Li \&@ Oc
+.Ar host Oo Li \&: Ar port Oc
+.Li / Ar path
+.Op Li /
+.Op Li ;type= Ar X
+.Oc
+.Sm on
.Ek
.Bk -words
-.Op http://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR
+.\" [http://[user[:password]@]host[:port]/path]
+.Sm off
+.Oo
+.Li http://
+.Oo Ar user
+.Op Li \&: Ar password
+.Li \&@ Oc
+.Ar host Oo Li \&: Ar port Oc
+.Li / Ar path
+.Oc
+.Sm on
.Ek
.Op Ar \&.\&.\&.
-.Nm ""
-.Fl u Ar url
-.\".Ar ftp://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR[/[file]]
-.\"|
-.\".Ar [\fIuser\fR@]\fIhost\fR:[\fIpath\fR][/[\fIfile\fR]]
+.Nm
.Bk -words
-file
+.Fl u Ar URL Ar file
.Ek
.Op Ar \&.\&.\&.
.Sh DESCRIPTION
@@ -243,6 +278,10 @@ Sets the port number to
Retry the connection attempt if it failed, pausing for
.Ar wait
seconds.
+.It Fl q Ar quittime
+Quit if the connection has stalled for
+.Ar quittime
+seconds.
.It Fl R
Restart all non-proxied auto-fetches.
.It Fl t
@@ -266,11 +305,11 @@ bytes/second.
Refer to
.Ic rate
for more information.
-.It Fl u Ar url file Op \&.\&.\&.
+.It Fl u Ar URL file Op \&.\&.\&.
Upload files on the command line to
-.Ar url
+.Ar URL
where
-.Ar url
+.Ar URL
is one of the ftp URL types as supported by auto-fetch
(with an optional target filename for single file uploads), and
.Ar file
@@ -869,7 +908,7 @@ will attempt to contact an
.Tn FTP
server at that port.
If the
-.Ic auto-login
+.Ic "set auto-login"
option is on (default),
.Nm
will also attempt to automatically log the user in to
@@ -882,10 +921,10 @@ Retrieve
and display with the program specified by the
.Ic "set pager"
option.
-.It Ic passive Op Ic auto
+.It Ic passive Op Cm auto
Toggle passive mode (if no arguments are given).
If
-.Ic auto
+.Cm auto
is given, act as if
.Ev FTPMODE
is set to
@@ -896,14 +935,17 @@ will send a
.Dv PASV
command for all data connections instead of a
.Dv PORT
-command. The
+command.
+The
.Dv PASV
command requests that the remote server open a port for the data connection
-and return the address of that port. The remote server listens on that
-port and the client connects to it. When using the more traditional
+and return the address of that port.
+The remote server listens on that port and the client connects to it.
+When using the more traditional
.Dv PORT
command, the client listens on a port and sends that address to the remote
-server, who connects back to it. Passive mode is useful when using
+server, who connects back to it.
+Passive mode is useful when using
.Nm
through a gateway router or host that controls the directionality of
traffic.
@@ -965,34 +1007,34 @@ will delete all files.
.Pp
When prompting is on, the following commands are available at a prompt:
.Bl -tag -width 2n -offset indent
-.It Ic a
+.It Cm a
Answer
.Sq yes
to the current file, and automatically answer
.Sq yes
to any remaining files for the current command.
-.It Ic n
+.It Cm n
Answer
.Sq no ,
and do not transfer the file.
-.It Ic p
+.It Cm p
Answer
.Sq yes
to the current file, and turn off prompt mode
(as is
.Dq prompt off
had been given).
-.It Ic q
+.It Cm q
Terminate the current operation.
-.It Ic y
+.It Cm y
Answer
.Sq yes ,
and transfer the file.
-.It Ic ?
+.It Cm ?
Display a help message.
.El
.Pp
-Any other reponse will answer
+Any other response will answer
.Sq yes
to the current file.
.It Ic proxy Ar ftp-command
@@ -1072,11 +1114,11 @@ is 0, disable the throttle.
.Ar direction
may be one of:
.Bl -tag -width "all" -offset indent -compact
-.It Ic all
+.It Cm all
Both directions.
-.It Ic get
+.It Cm get
Incoming transfers.
-.It Ic put
+.It Cm put
Outgoing transfers.
.El
.Pp
@@ -1240,7 +1282,7 @@ for certain
implementations which do ignore
.Dv PORT
commands but, incorrectly, indicate they've been accepted.
-.It Ic set Op Ar "option value"
+.It Ic set Op Ar option Ar value
Set
.Ar option
to
@@ -1252,25 +1294,25 @@ and
are not given, display all of the options and their values.
The currently supported options are:
.Bl -tag -width "http_proxy" -offset indent
-.It anonpass
+.It Cm anonpass
Defaults to
.Ev $FTPANONPASS
-.It ftp_proxy
+.It Cm ftp_proxy
Defaults to
.Ev $ftp_proxy .
-.It http_proxy
+.It Cm http_proxy
Defaults to
.Ev $http_proxy .
-.It no_proxy
+.It Cm no_proxy
Defaults to
.Ev $no_proxy .
-.It pager
+.It Cm pager
Defaults to
.Ev $PAGER .
-.It prompt
+.It Cm prompt
Defaults to
.Ev $FTPPROMPT .
-.It rprompt
+.It Cm rprompt
Defaults to
.Ev $FTPRPROMPT .
.El
@@ -1415,13 +1457,14 @@ support an optional suffix on the argument which changes the
interpretation of the argument.
Supported suffixes are:
.Bl -tag -width 3n -offset indent -compact
-.It b
-Causes no modification. (Optional)
-.It k
+.It Li b
+Causes no modification.
+(Optional)
+.It Li k
Kilo; multiply the argument by 1024
-.It m
+.It Li m
Mega; multiply the argument by 1048576
-.It g
+.It Li g
Giga; multiply the argument by 1073741824
.El
.Pp
@@ -1447,7 +1490,15 @@ on the command line.
.Pp
The following formats are valid syntax for an auto-fetch element:
.Bl -tag -width "FOO "
-.It [user@]host:[path][/]
+.\" [user@]host:[path][/]
+.It Xo
+.Sm off
+.Op Ar user Li \&@
+.Ar host Li \&:
+.Op Ar path
+.Op Li /
+.Sm on
+.Xc
.Dq Classic
.Tn FTP
format.
@@ -1471,7 +1522,19 @@ of
in the current directory.
Otherwise, the full remote name is used as the local name,
relative to the local root directory.
-.It ftp://[user[:password]@]host[:port]/path[/][;type=X]
+.\" ftp://[user[:password]@]host[:port]/path[/][;type=X]
+.It Xo
+.Sm off
+.Li ftp://
+.Oo Ar user
+.Op Li \&: Ar password
+.Li \&@ Oc
+.Ar host Oo Li \&: Ar port Oc
+.Li / Ar path
+.Op Li /
+.Op Li ;type= Ar X
+.Sm on
+.Xc
An
.Tn FTP
URL, retrieved using the
@@ -1493,15 +1556,94 @@ In this case, use
.Ar password
if supplied, otherwise prompt the user for one.
.Pp
+If a suffix of
+.Sq ;type=A
+or
+.Sq ;type=I
+is supplied, then the transfer type will take place as
+ascii or binary (respectively).
+The default transfer type is binary.
+.Pp
In order to be compliant with
.Cm RFC 1738 ,
.Nm
-strips the leading
-.Sq /
-from
+interprets the
+.Ar path
+part of an
+.Dq ftp://
+auto-fetch URL as follows:
+.Bl -bullet
+.It
+The
+.Sq Li /
+immediately after the
+.Ar host Ns Oo Li \&: Ns Ar port Oc
+is interpreted as a separator before the
.Ar path ,
-resulting in a transfer relative from the default login directory of
-the user.
+and not as part of the
+.Ar path
+itself.
+.It
+The
+.Ar path
+is interpreted as a
+.So Li / Sc Ns -separated
+list of name components.
+For all but the last such component,
+.Nm
+performs the equivalent of a
+.Ic cd
+command.
+For the last path component,
+.Nm
+performs the equivalent of a
+.Ic get
+command.
+.It
+Empty name components,
+which result from
+.Sq Li //
+within the
+.Ar path ,
+or from an extra
+.Sq Li /
+at the beginning of the
+.Ar path ,
+will cause the equivalent of a
+.Ic cd
+command without a directory name.
+This is unlikely to be useful.
+.It
+Any
+.Sq Li \&% Ns Ar XX
+codes within the path components are decoded, with
+.Ar XX
+representing a character code in hexadecimal.
+This decoding takes place after the
+.Ar path
+has been split into components,
+but before each component is used in the equivalent of a
+.Ic cd
+or
+.Ic get
+command.
+Some often-used codes are
+.Sq Li \&%2F
+(which represents
+.Sq Li / )
+and
+.Sq Li \&%7E
+(which represents
+.Sq Li ~ ) .
+.El
+.Pp
+The above interpretation has the following consequences:
+.Bl -bullet
+.It
+The path is interpreted relative to the
+default login directory of the specified user or of the
+.Sq anonymous
+user.
If the
.Pa /
directory is required, use a leading path of
@@ -1519,15 +1661,57 @@ with the password
.Sq mypass ,
use
.Dq ftp://myname:mypass@localhost/%2fetc/motd
-.Pp
-If a suffix of
-.Sq ;type=A
-or
-.Sq ;type=I
-is supplied, then the transfer type will take place as
-ascii or binary (respectively).
-The default transfer type is binary.
-.It http://[user[:password]@]host[:port]/path
+.It
+The exact
+.Ic cd
+and
+.Ic get
+commands can be controlled by careful choice of
+where to use
+.Sq /
+and where to use
+.Sq %2F
+(or
+.Sq %2f ) .
+For example, the following URLs correspond to the
+equivalents of the indicated commands:
+.Bl -tag -width "ftp://host/%2Fdir1%2Fdir2%2Ffile"
+.It ftp://host/dir1/dir2/file
+.Dq "cd dir1" ,
+.Dq "cd dir2" ,
+.Dq "get file" .
+.It ftp://host/%2Fdir1/dir2/file
+.Dq "cd /dir1" ,
+.Dq "cd dir2" ,
+.Dq "get file" .
+.It ftp://host/dir1%2Fdir2/file
+.Dq "cd dir1/dir2" ,
+.Dq "get file" .
+.It ftp://host/%2Fdir1%2Fdir2/file
+.Dq "cd /dir1/dir2" ,
+.Dq "get file" .
+.It ftp://host/dir1%2Fdir2%2Ffile
+.Dq "get dir1/dir2/file" .
+.It ftp://host/%2Fdir1%2Fdir2%2Ffile
+.Dq "get /dir1/dir2/file" .
+.El
+.It
+You must have appropriate access permission for each of the
+intermediate directories that is used in the equivalent of a
+.Ic cd
+command.
+.El
+.\" http://[user[:password]@]host[:port]/path
+.It Xo
+.Sm off
+.Li http://
+.Oo Ar user
+.Op Li \&: Ar password
+.Li \&@ Oc
+.Ar host Oo Li \&: Ar port Oc
+.Li / Ar path
+.Sm on
+.Xc
An
.Tn HTTP
URL, retrieved using the
@@ -1540,16 +1724,22 @@ is defined, it is used as a URL to an
proxy server.
If
.Tn HTTP
-authorisation is required to retrieve
+authorization is required to retrieve
.Ar path ,
and
.Sq user
(and optionally
.Sq password )
is in the URL, use them for the first attempt to authenticate.
-.It file:///path
+.\" file:///path
+.It Xo
+.Sm off
+.Li file:/// Ar path
+.Sm on
+.Xc
A local URL, copied from
-.Ar /path .
+.Pa / Ns Ar path
+on the local host.
.El
.Pp
Unless noted otherwise above, and
@@ -1736,7 +1926,7 @@ mode transfers.
.Nm
supports only the default values for the remaining
file transfer parameters:
-.Ic mode ,
+.Ic mode ,
.Ic form ,
and
.Ic struct .
@@ -1841,6 +2031,14 @@ If a macro named
.Ic init
is defined, it is automatically executed as the last step in the
auto-login process.
+For example,
+.Bd -literal -offset indent
+default
+macdef init
+epsv4 off
+.Ed
+.Pp
+followed by a blank line.
.El
.Sh COMMAND LINE EDITING
.Nm
@@ -1888,9 +2086,20 @@ command.
The following formatting sequences are replaced by the given
information:
.Bl -tag -width "%% " -offset indent
-.It %/
+.It Li \&%/
The current remote working directory.
-.It %c[[0]\fIn\fR], %.[[0]\fIn\fR]
+.\" %c[[0]n], %.[[0]n]
+.It Xo
+.Sm off
+.Li \&%c
+.Op Oo Li 0 Oc Ar n
+.Sm on
+.No ,
+.Sm off
+.Li \&%.
+.Op Oo Li 0 Oc Ar n
+.Sm on
+.Xc
The trailing component of the current remote working directory, or
.Em n
trailing components if a digit
@@ -1902,21 +2111,28 @@ begins with
.Sq 0 ,
the number of skipped components precede the trailing component(s) in
the format
-.Dq /\fI\*[Lt]skipped\*[Gt]\fRtrailing
+.\" ``/<number>trailing''
+.Do
+.Sm off
+.Li / Li \*[Lt] Va number Li \*[Gt]
+.Va trailing
+.Sm on
+.Dc
(for
-.Sq %c )
+.Sq \&%c )
or
-.Dq ...trailing
+.\" ``...trailing''
+.Dq Li \&... Ns Va trailing
(for
-.Sq %. ) .
-.It %M
+.Sq \&%. ) .
+.It Li \&%M
The remote host name.
-.It %m
+.It Li \&%m
The remote host name, up to the first
.Sq \&. .
-.It %n
+.It Li \&%n
The remote user name.
-.It %%
+.It Li \&%%
A single
.Sq % .
.El
@@ -1934,15 +2150,15 @@ Defaults to
Overrides the default operation mode.
Support values are:
.Bl -tag -width "passive"
-.It active
+.It Cm active
active mode
.Tn FTP
only
-.It auto
+.It Cm auto
automatic determination of passive or active (this is the default)
-.It gate
+.It Cm gate
gate-ftp mode
-.It passive
+.It Cm passive
passive mode
.Tn FTP
only
@@ -2028,6 +2244,21 @@ proxying is not to be used.
Each entry may have an optional trailing ":port", which restricts
the matching to connections to that port.
.El
+.Sh EXTENDED PASSIVE MODE AND FIREWALLS
+Some firewall configurations do not allow
+.Nm
+to use extended passive mode.
+If you find that even a simple
+.Ic ls
+appears to hang after printing a message such as this:
+.Pp
+.Dl 229 Entering Extended Passive Mode (|||58551|)
+.Pp
+then you will need to disable extended passive mode with
+.Ic epsv4 off .
+See the above section
+.Sx The .netrc File
+for an example of how to make this automatic.
.Sh SEE ALSO
.Xr getservbyname 3 ,
.Xr editrc 5 ,
@@ -2061,7 +2292,9 @@ and other enhancements over the standard
were implemented in
.Nx 1.3
and later releases
-by Luke Mewburn \*[Lt]lukem@netbsd.org\*[Gt].
+by
+.An Luke Mewburn
+.Aq lukem@NetBSD.org .
.Pp
IPv6 support was added by the WIDE/KAME project
(but may not be present in all non-NetBSD versions of this program, depending
diff --git a/contrib/lukemftp/src/ftp.c b/contrib/lukemftp/src/ftp.c
index 6dcc530f80a3..88a7713be0a9 100644
--- a/contrib/lukemftp/src/ftp.c
+++ b/contrib/lukemftp/src/ftp.c
@@ -98,10 +98,41 @@
* SUCH DAMAGE.
*/
-#include "lukemftp.h"
-
+#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.120 2002/06/05 10:20:49 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <arpa/inet.h>
+#include <arpa/ftp.h>
#include <arpa/telnet.h>
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdarg.h>
+#ifndef USE_SELECT
+#include <poll.h>
+#endif
+
#include "ftp_var.h"
volatile int abrtflag = 0;
diff --git a/contrib/lukemftp/src/ftp_var.h b/contrib/lukemftp/src/ftp_var.h
index e06076c41c76..ac7c87ae035d 100644
--- a/contrib/lukemftp/src/ftp_var.h
+++ b/contrib/lukemftp/src/ftp_var.h
@@ -1,7 +1,7 @@
-/* $NetBSD: ftp_var.h,v 1.62 2001/12/26 09:40:16 lukem Exp $ */
+/* $NetBSD: ftp_var.h,v 1.64 2003/01/21 16:08:07 jhawk Exp $ */
/*-
- * Copyright (c) 1996-2001 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -111,14 +111,20 @@
#define NO_PROGRESS
#endif
+#include <sys/param.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <setjmp.h>
+#include <stringlist.h>
+
#ifndef NO_EDITCOMPLETE
#include <histedit.h>
#endif /* !NO_EDITCOMPLETE */
-typedef void (*sigfunc)(int);
-
#include "extern.h"
-
+#include "progressbar.h"
/*
* Format of command table.
@@ -175,7 +181,6 @@ enum {
#define HASHBYTES 1024 /* default mark for `hash' command */
#define DEFAULTINCR 1024 /* default increment for `rate' command */
-#define STALLTIME 5 /* # of seconds of no xfer before "stalling" */
#define FTP_PORT 21 /* default if ! getservbyname("ftp/tcp") */
#define HTTP_PORT 80 /* default if ! getservbyname("http/tcp") */
@@ -204,9 +209,7 @@ GLOBAL int trace; /* trace packets exchanged */
GLOBAL int hash; /* print # for each buffer transferred */
GLOBAL int mark; /* number of bytes between hashes */
GLOBAL int sendport; /* use PORT/LPRT cmd for each data connection */
-GLOBAL int verbose; /* print messages coming back from server */
GLOBAL int connected; /* 1 = connected to server, -1 = logged in */
-GLOBAL int fromatty; /* input is from a terminal */
GLOBAL int interactive; /* interactively prompt on m* cmds */
GLOBAL int confirmrest; /* confirm rest of current m* cmd */
GLOBAL int debug; /* debugging level */
@@ -223,7 +226,6 @@ GLOBAL int mcase; /* map upper to lower case for mget names */
GLOBAL int ntflag; /* use ntin ntout tables for name translation */
GLOBAL int mapflag; /* use mapin mapout templates on file names */
GLOBAL int preserve; /* preserve modification time on files */
-GLOBAL int progress; /* display transfer progress bar */
GLOBAL int code; /* return/reply code for ftp command */
GLOBAL int crflag; /* if 1, strip car. rets. on ascii gets */
GLOBAL int passivemode; /* passive mode enabled */
@@ -252,9 +254,7 @@ GLOBAL int rate_get_incr; /* increment for get xfer rate */
GLOBAL int rate_put; /* maximum put xfer rate */
GLOBAL int rate_put_incr; /* increment for put xfer rate */
GLOBAL int retry_connect; /* seconds between retrying connection */
-GLOBAL int ttywidth; /* width of tty */
GLOBAL char *tmpdir; /* temporary directory */
-GLOBAL FILE *ttyout; /* stdout, or stderr if retrieving to stdout */
GLOBAL int epsv4; /* use EPSV/EPRT on IPv4 connections */
GLOBAL int epsv4bad; /* EPSV doesn't work on the current server */
GLOBAL int editing; /* command line editing enabled */
@@ -268,10 +268,7 @@ GLOBAL size_t cursor_argc; /* location of cursor in margv */
GLOBAL size_t cursor_argo; /* offset of cursor in margv[cursor_argc] */
#endif /* !NO_EDITCOMPLETE */
-GLOBAL off_t bytes; /* current # of bytes read */
-GLOBAL off_t filesize; /* size of file being transferred */
GLOBAL char *direction; /* direction transfer is occurring */
-GLOBAL off_t restart_point; /* offset to restart transfer */
GLOBAL char *hostname; /* name of host connected to */
GLOBAL int unix_server; /* server is unix, can use binary for ascii */
@@ -287,8 +284,6 @@ GLOBAL char *gateport; /* port number to use for gateftp connections */
GLOBAL char *outfile; /* filename to output URLs to */
GLOBAL int restartautofetch; /* restart auto-fetch */
-GLOBAL sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */
-
GLOBAL char line[FTPBUFLEN]; /* input line buffer */
GLOBAL char *stringbase; /* current scan point in line buffer */
GLOBAL char argbuf[FTPBUFLEN]; /* argument storage buffer */
@@ -336,29 +331,7 @@ extern struct option optiontab[];
#endif
#ifdef NO_LONG_LONG
-# define LLF "%ld"
-# define LLFP(x) "%" x "ld"
-# define LLT long
-# define ULLF "%lu"
-# define ULLFP(x) "%" x "lu"
-# define ULLT unsigned long
# define STRTOLL(x,y,z) strtol(x,y,z)
#else
-#if 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
-# define STRTOLL(x,y,z) strtoll(x,y,z)
-#else
-# 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
# define STRTOLL(x,y,z) strtoll(x,y,z)
#endif
-#endif
diff --git a/contrib/lukemftp/src/main.c b/contrib/lukemftp/src/main.c
index cc8dcfb4403c..f83d971e4232 100644
--- a/contrib/lukemftp/src/main.c
+++ b/contrib/lukemftp/src/main.c
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.82 2002/06/05 13:51:54 lukem Exp $ */
+/* $NetBSD: main.c,v 1.84 2003/05/14 14:31:00 wiz Exp $ */
/*-
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
@@ -98,11 +98,36 @@
* SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\n\
+ The Regents of the University of California. All rights reserved.\n");
+#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.84 2003/05/14 14:31:00 wiz Exp $");
+#endif
+#endif /* not lint */
+
/*
* FTP User Program -- Command Interface.
*/
-
-#include "lukemftp.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <err.h>
+#include <errno.h>
+#include <netdb.h>
+#include <paths.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <locale.h>
#define GLOBAL /* force GLOBAL decls in ftp_var.h to be declared */
#include "ftp_var.h"
@@ -123,9 +148,7 @@ main(int argc, char *argv[])
char *cp, *ep, *anonuser, *anonpass, *upload_path;
int dumbterm, s, len, isupload;
-#if 0 /* XXX */
setlocale(LC_ALL, "");
-#endif
setprogname(argv[0]);
ftpport = "ftp";
@@ -258,7 +281,7 @@ main(int argc, char *argv[])
}
}
- while ((ch = getopt(argc, argv, "46AadefginN:o:pP:r:RtT:u:vV")) != -1) {
+ while ((ch = getopt(argc, argv, "46AadefginN:o:pP:q:r:RtT:u:vV")) != -1) {
switch (ch) {
case '4':
family = AF_INET;
@@ -330,6 +353,12 @@ main(int argc, char *argv[])
ftpport = optarg;
break;
+ case 'q':
+ quit_time = strtol(optarg, &ep, 10);
+ if (quit_time < 1 || *ep != '\0')
+ errx(1, "bad quit value: %s", optarg);
+ break;
+
case 'r':
retry_connect = strtol(optarg, &ep, 10);
if (retry_connect < 1 || *ep != '\0')
@@ -1003,6 +1032,6 @@ usage(void)
" [-T dir,max[,inc][[user@]host [port]]] [host:path[/]]\n"
" [file:///file] [ftp://[user[:pass]@]host[:port]/path[/]]\n"
" [http://[user[:pass]@]host[:port]/path] [...]\n"
-" %s -u url file [...]\n", progname, progname);
+" %s -u URL file [...]\n", progname, progname);
exit(1);
}
diff --git a/contrib/lukemftp/src/progressbar.c b/contrib/lukemftp/src/progressbar.c
new file mode 100644
index 000000000000..2020fc706939
--- /dev/null
+++ b/contrib/lukemftp/src/progressbar.c
@@ -0,0 +1,463 @@
+/* $NetBSD: progressbar.c,v 1.3 2003/02/28 09:53:49 lukem Exp $ */
+
+/*-
+ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Luke Mewburn.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: progressbar.c,v 1.3 2003/02/28 09:53:49 lukem Exp $");
+#endif /* not lint */
+
+/*
+ * FTP User Program -- Misc support routines
+ */
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "progressbar.h"
+
+#define SECSPERHOUR 60
+#define SECSPERDAY ((long)60 * 60 * 24)
+
+#if !defined(NO_PROGRESS)
+/*
+ * return non-zero if we're the current foreground process
+ */
+int
+foregroundproc(void)
+{
+ static pid_t pgrp = -1;
+
+ if (pgrp == -1)
+ pgrp = getpgrp();
+
+ return (tcgetpgrp(fileno(ttyout)) == pgrp);
+}
+#endif /* !defined(NO_PROGRESS) */
+
+
+#ifndef NO_PROGRESS
+static void updateprogressmeter(int);
+
+/*
+ * SIGALRM handler to update the progress meter
+ */
+static void
+updateprogressmeter(int dummy)
+{
+ int oerrno = errno;
+
+ progressmeter(0);
+ errno = oerrno;
+}
+#endif /* NO_PROGRESS */
+
+
+/*
+ * List of order of magnitude prefixes.
+ * The last is `P', as 2^64 = 16384 Petabytes
+ */
+static const char prefixes[] = " KMGTP";
+
+/*
+ * Display a transfer progress bar if progress is non-zero.
+ * SIGALRM is hijacked for use by this function.
+ * - Before the transfer, set filesize to size of file (or -1 if unknown),
+ * and call with flag = -1. This starts the once per second timer,
+ * and a call to updateprogressmeter() upon SIGALRM.
+ * - During the transfer, updateprogressmeter will call progressmeter
+ * with flag = 0
+ * - After the transfer, call with flag = 1
+ */
+static struct timeval start;
+static struct timeval lastupdate;
+
+#define BUFLEFT (sizeof(buf) - len)
+
+void
+progressmeter(int flag)
+{
+ static off_t lastsize;
+ off_t cursize;
+ struct timeval now, wait;
+#ifndef NO_PROGRESS
+ struct timeval td;
+ off_t abbrevsize, bytespersec;
+ double elapsed;
+ int ratio, barlength, i, len, remaining;
+
+ /*
+ * Work variables for progress bar.
+ *
+ * XXX: if the format of the progress bar changes
+ * (especially the number of characters in the
+ * `static' portion of it), be sure to update
+ * these appropriately.
+ */
+ char buf[256]; /* workspace for progress bar */
+#define BAROVERHEAD 43 /* non `*' portion of progress bar */
+ /*
+ * stars should contain at least
+ * sizeof(buf) - BAROVERHEAD entries
+ */
+ static const char stars[] =
+"*****************************************************************************"
+"*****************************************************************************"
+"*****************************************************************************";
+
+#endif
+
+ if (flag == -1) {
+ (void)gettimeofday(&start, NULL);
+ lastupdate = start;
+ lastsize = restart_point;
+ }
+
+ (void)gettimeofday(&now, NULL);
+ cursize = bytes + restart_point;
+ timersub(&now, &lastupdate, &wait);
+ if (cursize > lastsize) {
+ lastupdate = now;
+ lastsize = cursize;
+ wait.tv_sec = 0;
+ } else {
+#ifndef STANDALONE_PROGRESS
+ if (quit_time > 0 && wait.tv_sec > quit_time) {
+ len = snprintf(buf, sizeof(buf), "\r\n%s: "
+ "transfer aborted because stalled for %lu sec.\r\n",
+ getprogname(), (unsigned long)wait.tv_sec);
+ (void)write(fileno(ttyout), buf, len);
+ (void)xsignal(SIGALRM, SIG_DFL);
+ alarmtimer(0);
+ siglongjmp(toplevel, 1);
+ }
+#endif /* !STANDALONE_PROGRESS */
+ }
+ /*
+ * Always set the handler even if we are not the foreground process.
+ */
+#ifdef STANDALONE_PROGRESS
+ if (progress) {
+#else
+ if (quit_time > 0 || progress) {
+#endif /* !STANDALONE_PROGRESS */
+ if (flag == -1) {
+ (void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
+ alarmtimer(1); /* set alarm timer for 1 Hz */
+ } else if (flag == 1) {
+ (void)xsignal(SIGALRM, SIG_DFL);
+ alarmtimer(0);
+ }
+ }
+#ifndef NO_PROGRESS
+ if (!progress)
+ return;
+ len = 0;
+
+ /*
+ * print progress bar only if we are foreground process.
+ */
+ if (! foregroundproc())
+ return;
+
+ len += snprintf(buf + len, BUFLEFT, "\r");
+ if (filesize > 0) {
+ ratio = (int)((double)cursize * 100.0 / (double)filesize);
+ ratio = MAX(ratio, 0);
+ ratio = MIN(ratio, 100);
+ len += snprintf(buf + len, BUFLEFT, "%3d%% ", ratio);
+
+ /*
+ * calculate the length of the `*' bar, ensuring that
+ * the number of stars won't exceed the buffer size
+ */
+ barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
+ if (barlength > 0) {
+ i = barlength * ratio / 100;
+ len += snprintf(buf + len, BUFLEFT,
+ "|%.*s%*s|", i, stars, barlength - i, "");
+ }
+ }
+
+ abbrevsize = cursize;
+ for (i = 0; abbrevsize >= 100000 && i < sizeof(prefixes); i++)
+ abbrevsize >>= 10;
+ len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %c%c ",
+ (LLT)abbrevsize,
+ prefixes[i],
+ i == 0 ? ' ' : 'B');
+
+ timersub(&now, &start, &td);
+ elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
+
+ bytespersec = 0;
+ if (bytes > 0) {
+ bytespersec = bytes;
+ if (elapsed > 0.0)
+ bytespersec /= elapsed;
+ }
+ for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
+ bytespersec >>= 10;
+ len += snprintf(buf + len, BUFLEFT,
+ " " LLFP("3") ".%02d %cB/s ",
+ (LLT)(bytespersec / 1024),
+ (int)((bytespersec % 1024) * 100 / 1024),
+ prefixes[i]);
+
+ if (filesize > 0) {
+ if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
+ len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
+ } else if (wait.tv_sec >= STALLTIME) {
+ len += snprintf(buf + len, BUFLEFT, " - stalled -");
+ } else {
+ remaining = (int)
+ ((filesize - restart_point) / (bytes / elapsed) -
+ elapsed);
+ if (remaining >= 100 * SECSPERHOUR)
+ len += snprintf(buf + len, BUFLEFT,
+ " --:-- ETA");
+ else {
+ i = remaining / SECSPERHOUR;
+ if (i)
+ len += snprintf(buf + len, BUFLEFT,
+ "%2d:", i);
+ else
+ len += snprintf(buf + len, BUFLEFT,
+ " ");
+ i = remaining % SECSPERHOUR;
+ len += snprintf(buf + len, BUFLEFT,
+ "%02d:%02d ETA", i / 60, i % 60);
+ }
+ }
+ }
+ if (flag == 1)
+ len += snprintf(buf + len, BUFLEFT, "\n");
+ (void)write(fileno(ttyout), buf, len);
+
+#endif /* !NO_PROGRESS */
+}
+
+#ifndef STANDALONE_PROGRESS
+/*
+ * Display transfer statistics.
+ * Requires start to be initialised by progressmeter(-1),
+ * direction to be defined by xfer routines, and filesize and bytes
+ * to be updated by xfer routines
+ * If siginfo is nonzero, an ETA is displayed, and the output goes to stderr
+ * instead of ttyout.
+ */
+void
+ptransfer(int siginfo)
+{
+ struct timeval now, td, wait;
+ double elapsed;
+ off_t bytespersec;
+ int remaining, hh, i, len;
+
+ char buf[256]; /* Work variable for transfer status. */
+
+ if (!verbose && !progress && !siginfo)
+ return;
+
+ (void)gettimeofday(&now, NULL);
+ timersub(&now, &start, &td);
+ elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
+ bytespersec = 0;
+ if (bytes > 0) {
+ bytespersec = bytes;
+ if (elapsed > 0.0)
+ bytespersec /= elapsed;
+ }
+ len = 0;
+ len += snprintf(buf + len, BUFLEFT, LLF " byte%s %s in ",
+ (LLT)bytes, bytes == 1 ? "" : "s", direction);
+ remaining = (int)elapsed;
+ if (remaining > SECSPERDAY) {
+ int days;
+
+ days = remaining / SECSPERDAY;
+ remaining %= SECSPERDAY;
+ len += snprintf(buf + len, BUFLEFT,
+ "%d day%s ", days, days == 1 ? "" : "s");
+ }
+ hh = remaining / SECSPERHOUR;
+ remaining %= SECSPERHOUR;
+ if (hh)
+ len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
+ len += snprintf(buf + len, BUFLEFT,
+ "%02d:%02d ", remaining / 60, remaining % 60);
+
+ for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
+ bytespersec >>= 10;
+ len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %cB/s)",
+ (LLT)(bytespersec / 1024),
+ (int)((bytespersec % 1024) * 100 / 1024),
+ prefixes[i]);
+
+ if (siginfo && bytes > 0 && elapsed > 0.0 && filesize >= 0
+ && bytes + restart_point <= filesize) {
+ remaining = (int)((filesize - restart_point) /
+ (bytes / elapsed) - elapsed);
+ hh = remaining / SECSPERHOUR;
+ remaining %= SECSPERHOUR;
+ len += snprintf(buf + len, BUFLEFT, " ETA: ");
+ if (hh)
+ len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
+ len += snprintf(buf + len, BUFLEFT, "%02d:%02d",
+ remaining / 60, remaining % 60);
+ timersub(&now, &lastupdate, &wait);
+ if (wait.tv_sec >= STALLTIME)
+ len += snprintf(buf + len, BUFLEFT, " (stalled)");
+ }
+ len += snprintf(buf + len, BUFLEFT, "\n");
+ (void)write(siginfo ? STDERR_FILENO : fileno(ttyout), buf, len);
+}
+
+/*
+ * SIG{INFO,QUIT} handler to print transfer stats if a transfer is in progress
+ */
+void
+psummary(int notused)
+{
+ int oerrno = errno;
+
+ if (bytes > 0) {
+ if (fromatty)
+ write(fileno(ttyout), "\n", 1);
+ ptransfer(1);
+ }
+ errno = oerrno;
+}
+#endif /* !STANDALONE_PROGRESS */
+
+
+/*
+ * Set the SIGALRM interval timer for wait seconds, 0 to disable.
+ */
+void
+alarmtimer(int wait)
+{
+ struct itimerval itv;
+
+ itv.it_value.tv_sec = wait;
+ itv.it_value.tv_usec = 0;
+ itv.it_interval = itv.it_value;
+ setitimer(ITIMER_REAL, &itv, NULL);
+}
+
+
+/*
+ * Install a POSIX signal handler, allowing the invoker to set whether
+ * the signal should be restartable or not
+ */
+sigfunc
+xsignal_restart(int sig, sigfunc func, int restartable)
+{
+ struct sigaction act, oact;
+ act.sa_handler = func;
+
+ sigemptyset(&act.sa_mask);
+#if defined(SA_RESTART) /* 4.4BSD, Posix(?), SVR4 */
+ act.sa_flags = restartable ? SA_RESTART : 0;
+#elif defined(SA_INTERRUPT) /* SunOS 4.x */
+ act.sa_flags = restartable ? 0 : SA_INTERRUPT;
+#else
+#error "system must have SA_RESTART or SA_INTERRUPT"
+#endif
+ if (sigaction(sig, &act, &oact) < 0)
+ return (SIG_ERR);
+ return (oact.sa_handler);
+}
+
+/*
+ * Install a signal handler with the `restartable' flag set dependent upon
+ * which signal is being set. (This is a wrapper to xsignal_restart())
+ */
+sigfunc
+xsignal(int sig, sigfunc func)
+{
+ int restartable;
+
+ /*
+ * Some signals print output or change the state of the process.
+ * There should be restartable, so that reads and writes are
+ * not affected. Some signals should cause program flow to change;
+ * these signals should not be restartable, so that the system call
+ * will return with EINTR, and the program will go do something
+ * different. If the signal handler calls longjmp() or siglongjmp(),
+ * it doesn't matter if it's restartable.
+ */
+
+ switch(sig) {
+#ifdef SIGINFO
+ case SIGINFO:
+#endif
+ case SIGQUIT:
+ case SIGUSR1:
+ case SIGUSR2:
+ case SIGWINCH:
+ restartable = 1;
+ break;
+
+ case SIGALRM:
+ case SIGINT:
+ case SIGPIPE:
+ restartable = 0;
+ break;
+
+ default:
+ /*
+ * This is unpleasant, but I don't know what would be better.
+ * Right now, this "can't happen"
+ */
+ errx(1, "xsignal_restart called with signal %d", sig);
+ }
+
+ return(xsignal_restart(sig, func, restartable));
+}
diff --git a/contrib/lukemftp/src/progressbar.h b/contrib/lukemftp/src/progressbar.h
new file mode 100644
index 000000000000..b7ca63f41a6d
--- /dev/null
+++ b/contrib/lukemftp/src/progressbar.h
@@ -0,0 +1,99 @@
+/* $NetBSD: progressbar.h,v 1.3 2003/02/28 09:53:49 lukem Exp $ */
+
+/*-
+ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Luke Mewburn.
+ *
+ * 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.
+ */
+
+#ifndef STANDALONE_PROGRESS
+#include <setjmp.h>
+#endif /* !STANDALONE_PROGRESS */
+
+#ifndef GLOBAL
+#define GLOBAL extern
+#endif
+
+
+#define STALLTIME 5 /* # of seconds of no xfer before "stalling" */
+
+typedef void (*sigfunc)(int);
+
+
+GLOBAL FILE *ttyout; /* stdout, or stderr if retrieving to stdout */
+
+GLOBAL int progress; /* display transfer progress bar */
+GLOBAL int ttywidth; /* width of tty */
+
+GLOBAL off_t bytes; /* current # of bytes read */
+GLOBAL off_t filesize; /* size of file being transferred */
+GLOBAL off_t restart_point; /* offset to restart transfer */
+
+
+#ifndef STANDALONE_PROGRESS
+GLOBAL int fromatty; /* input is from a terminal */
+GLOBAL int verbose; /* print messages coming back from server */
+GLOBAL int quit_time; /* maximum time to wait if stalled */
+
+GLOBAL char *direction; /* direction transfer is occurring */
+
+GLOBAL sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */
+#endif /* !STANDALONE_PROGRESS */
+
+int foregroundproc(void);
+void alarmtimer(int);
+void progressmeter(int);
+sigfunc xsignal(int, sigfunc);
+sigfunc xsignal_restart(int, sigfunc, int);
+
+#ifndef STANDALONE_PROGRESS
+void psummary(int);
+void ptransfer(int);
+#endif /* !STANDALONE_PROGRESS */
+
+
+#ifdef NO_LONG_LONG
+# define LLF "%ld"
+# define LLFP(x) "%" x "ld"
+# define LLT long
+# define ULLF "%lu"
+# define ULLFP(x) "%" x "lu"
+# define ULLT unsigned long
+#else
+# 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
diff --git a/contrib/lukemftp/src/ruserpass.c b/contrib/lukemftp/src/ruserpass.c
index 0eadfc85c7ca..a773086542f5 100644
--- a/contrib/lukemftp/src/ruserpass.c
+++ b/contrib/lukemftp/src/ruserpass.c
@@ -33,7 +33,26 @@
* SUCH DAMAGE.
*/
-#include "lukemftp.h"
+#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.28 2000/11/15 00:11:04 lukem Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
#include "ftp_var.h"
diff --git a/contrib/lukemftp/src/util.c b/contrib/lukemftp/src/util.c
index aa4f73a04f50..3f25d485a304 100644
--- a/contrib/lukemftp/src/util.c
+++ b/contrib/lukemftp/src/util.c
@@ -1,7 +1,7 @@
-/* $NetBSD: util.c,v 1.107 2002/06/05 10:20:50 lukem Exp $ */
+/* $NetBSD: util.c,v 1.112 2003/06/15 13:49:46 lukem Exp $ */
/*-
- * Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -73,14 +73,40 @@
* SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: util.c,v 1.112 2003/06/15 13:49:46 lukem Exp $");
+#endif /* not lint */
+
/*
* FTP User Program -- Misc support routines
*/
-
-#include "lukemftp.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <netinet/in.h>
+#include <arpa/ftp.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <glob.h>
+#include <signal.h>
+#include <limits.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <time.h>
+#include <unistd.h>
#include "ftp_var.h"
+#define TM_YEAR_BASE 1900
+
/*
* Connect to peer server and auto-login, if possible.
*/
@@ -775,303 +801,6 @@ updateremotepwd(void)
code = ocode;
}
-#ifndef NO_PROGRESS
-
-/*
- * return non-zero if we're the current foreground process
- */
-int
-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);
-}
-
-
-static void updateprogressmeter(int);
-
-/*
- * SIGALRM handler to update the progress meter
- */
-static void
-updateprogressmeter(int dummy)
-{
- int oerrno = errno;
-
- progressmeter(0);
- errno = oerrno;
-}
-#endif /* NO_PROGRESS */
-
-
-/*
- * List of order of magnitude prefixes.
- * The last is `P', as 2^64 = 16384 Petabytes
- */
-static const char prefixes[] = " KMGTP";
-
-/*
- * Display a transfer progress bar if progress is non-zero.
- * SIGALRM is hijacked for use by this function.
- * - Before the transfer, set filesize to size of file (or -1 if unknown),
- * and call with flag = -1. This starts the once per second timer,
- * and a call to updateprogressmeter() upon SIGALRM.
- * - During the transfer, updateprogressmeter will call progressmeter
- * with flag = 0
- * - After the transfer, call with flag = 1
- */
-static struct timeval start;
-static struct timeval lastupdate;
-
-#define BUFLEFT (sizeof(buf) - len)
-
-void
-progressmeter(int flag)
-{
- static off_t lastsize;
-#ifndef NO_PROGRESS
- struct timeval now, td, wait;
- off_t cursize, abbrevsize, bytespersec;
- double elapsed;
- int ratio, barlength, i, len, remaining;
-
- /*
- * Work variables for progress bar.
- *
- * XXX: if the format of the progress bar changes
- * (especially the number of characters in the
- * `static' portion of it), be sure to update
- * these appropriately.
- */
- char buf[256]; /* workspace for progress bar */
-#define BAROVERHEAD 43 /* non `*' portion of progress bar */
- /*
- * stars should contain at least
- * sizeof(buf) - BAROVERHEAD entries
- */
- const char stars[] =
-"*****************************************************************************"
-"*****************************************************************************"
-"*****************************************************************************";
-
-#endif
-
- if (flag == -1) {
- (void)gettimeofday(&start, NULL);
- lastupdate = start;
- lastsize = restart_point;
- }
-#ifndef NO_PROGRESS
- if (!progress)
- return;
- len = 0;
-
- /*
- * print progress bar only if we are foreground process.
- */
- if (! foregroundproc())
- return;
-
- (void)gettimeofday(&now, NULL);
- cursize = bytes + restart_point;
- timersub(&now, &lastupdate, &wait);
- if (cursize > lastsize) {
- lastupdate = now;
- lastsize = cursize;
- wait.tv_sec = 0;
- }
-
- len += snprintf(buf + len, BUFLEFT, "\r");
- if (filesize > 0) {
- ratio = (int)((double)cursize * 100.0 / (double)filesize);
- ratio = MAX(ratio, 0);
- ratio = MIN(ratio, 100);
- len += snprintf(buf + len, BUFLEFT, "%3d%% ", ratio);
-
- /*
- * calculate the length of the `*' bar, ensuring that
- * the number of stars won't exceed the buffer size
- */
- barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
- if (barlength > 0) {
- i = barlength * ratio / 100;
- len += snprintf(buf + len, BUFLEFT,
- "|%.*s%*s|", i, stars, barlength - i, "");
- }
- }
-
- abbrevsize = cursize;
- for (i = 0; abbrevsize >= 100000 && i < sizeof(prefixes); i++)
- abbrevsize >>= 10;
- len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %c%c ",
- (LLT)abbrevsize,
- prefixes[i],
- i == 0 ? ' ' : 'B');
-
- timersub(&now, &start, &td);
- elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
-
- bytespersec = 0;
- if (bytes > 0) {
- bytespersec = bytes;
- if (elapsed > 0.0)
- bytespersec /= elapsed;
- }
- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
- bytespersec >>= 10;
- len += snprintf(buf + len, BUFLEFT,
- " " LLFP("3") ".%02d %cB/s ",
- (LLT)(bytespersec / 1024),
- (int)((bytespersec % 1024) * 100 / 1024),
- prefixes[i]);
-
- if (filesize > 0) {
- if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
- len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
- } else if (flag == 1) {
- i = elapsed / SECSPERHOUR;
- if (i)
- len += snprintf(buf + len, BUFLEFT, "%2d:", i);
- else
- len += snprintf(buf + len, BUFLEFT, " ");
- i = (int)elapsed % SECSPERHOUR;
- len += snprintf(buf + len, BUFLEFT,
- "%02d:%02d ", i / 60, i % 60);
- } else if (wait.tv_sec >= STALLTIME) {
- len += snprintf(buf + len, BUFLEFT, " - stalled -");
- } else {
- remaining = (int)
- ((filesize - restart_point) / (bytes / elapsed) -
- elapsed);
- if (remaining >= 100 * SECSPERHOUR)
- len += snprintf(buf + len, BUFLEFT,
- " --:-- ETA");
- else {
- i = remaining / SECSPERHOUR;
- if (i)
- len += snprintf(buf + len, BUFLEFT,
- "%2d:", i);
- else
- len += snprintf(buf + len, BUFLEFT,
- " ");
- i = remaining % SECSPERHOUR;
- len += snprintf(buf + len, BUFLEFT,
- "%02d:%02d ETA", i / 60, i % 60);
- }
- }
- }
- if (flag == 1)
- len += snprintf(buf + len, BUFLEFT, "\n");
- (void)write(fileno(ttyout), buf, len);
-
- if (flag == -1) {
- (void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
- alarmtimer(1); /* set alarm timer for 1 Hz */
- } else if (flag == 1) {
- (void)xsignal(SIGALRM, SIG_DFL);
- alarmtimer(0);
- }
-#endif /* !NO_PROGRESS */
-}
-
-/*
- * Display transfer statistics.
- * Requires start to be initialised by progressmeter(-1),
- * direction to be defined by xfer routines, and filesize and bytes
- * to be updated by xfer routines
- * If siginfo is nonzero, an ETA is displayed, and the output goes to stderr
- * instead of ttyout.
- */
-void
-ptransfer(int siginfo)
-{
- struct timeval now, td, wait;
- double elapsed;
- off_t bytespersec;
- int remaining, hh, i, len;
-
- char buf[256]; /* Work variable for transfer status. */
-
- if (!verbose && !progress && !siginfo)
- return;
-
- (void)gettimeofday(&now, NULL);
- timersub(&now, &start, &td);
- elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
- bytespersec = 0;
- if (bytes > 0) {
- bytespersec = bytes;
- if (elapsed > 0.0)
- bytespersec /= elapsed;
- }
- len = 0;
- len += snprintf(buf + len, BUFLEFT, LLF " byte%s %s in ",
- (LLT)bytes, bytes == 1 ? "" : "s", direction);
- remaining = (int)elapsed;
- if (remaining > SECSPERDAY) {
- int days;
-
- days = remaining / SECSPERDAY;
- remaining %= SECSPERDAY;
- len += snprintf(buf + len, BUFLEFT,
- "%d day%s ", days, days == 1 ? "" : "s");
- }
- hh = remaining / SECSPERHOUR;
- remaining %= SECSPERHOUR;
- if (hh)
- len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
- len += snprintf(buf + len, BUFLEFT,
- "%02d:%02d ", remaining / 60, remaining % 60);
-
- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
- bytespersec >>= 10;
- len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %cB/s)",
- (LLT)(bytespersec / 1024),
- (int)((bytespersec % 1024) * 100 / 1024),
- prefixes[i]);
-
- if (siginfo && bytes > 0 && elapsed > 0.0 && filesize >= 0
- && bytes + restart_point <= filesize) {
- remaining = (int)((filesize - restart_point) /
- (bytes / elapsed) - elapsed);
- hh = remaining / SECSPERHOUR;
- remaining %= SECSPERHOUR;
- len += snprintf(buf + len, BUFLEFT, " ETA: ");
- if (hh)
- len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
- len += snprintf(buf + len, BUFLEFT, "%02d:%02d",
- remaining / 60, remaining % 60);
- timersub(&now, &lastupdate, &wait);
- if (wait.tv_sec >= STALLTIME)
- len += snprintf(buf + len, BUFLEFT, " (stalled)");
- }
- len += snprintf(buf + len, BUFLEFT, "\n");
- (void)write(siginfo ? STDERR_FILENO : fileno(ttyout), buf, len);
-}
-
-/*
- * SIG{INFO,QUIT} handler to print transfer stats if a transfer is in progress
- */
-void
-psummary(int notused)
-{
- int oerrno = errno;
-
- if (bytes > 0) {
- if (fromatty)
- write(fileno(ttyout), "\n", 1);
- ptransfer(1);
- }
- errno = oerrno;
-}
/*
* List words in stringlist, vertically arranged
@@ -1158,20 +887,6 @@ crankrate(int sig)
/*
- * Set the SIGALRM interval timer for wait seconds, 0 to disable.
- */
-void
-alarmtimer(int wait)
-{
- struct itimerval itv;
-
- itv.it_value.tv_sec = wait;
- itv.it_value.tv_usec = 0;
- itv.it_interval = itv.it_value;
- setitimer(ITIMER_REAL, &itv, NULL);
-}
-
-/*
* Setup or cleanup EditLine structures
*/
#ifndef NO_EDITCOMPLETE
@@ -1389,7 +1104,8 @@ formatbuf(char *buf, size_t len, const char *src)
case 'M':
case 'm':
- for (p2 = connected ? hostname : "-"; *p2; p2++) {
+ for (p2 = connected && username ? username : "-";
+ *p2 ; p2++) {
if (op == 'm' && *p2 == '.')
break;
ADDBUF(*p2);
@@ -1553,84 +1269,3 @@ xstrdup(const char *str)
err(1, "Unable to allocate memory for string copy");
return (s);
}
-
-/*
- * Install a POSIX signal handler, allowing the invoker to set whether
- * the signal should be restartable or not
- */
-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;
-
- sigemptyset(&act.sa_mask);
-#if defined(SA_RESTART) /* 4.4BSD, Posix(?), SVR4 */
- act.sa_flags = restartable ? SA_RESTART : 0;
-#elif defined(SA_INTERRUPT) /* SunOS 4.x */
- act.sa_flags = restartable ? 0 : SA_INTERRUPT;
-#else
-#error "system must have SA_RESTART or SA_INTERRUPT"
-#endif
- if (sigaction(sig, &act, &oact) < 0)
- return (SIG_ERR);
- return (oact.sa_handler);
-#endif /* ! ultrix */
-}
-
-/*
- * Install a signal handler with the `restartable' flag set dependent upon
- * which signal is being set. (This is a wrapper to xsignal_restart())
- */
-sigfunc
-xsignal(int sig, sigfunc func)
-{
- int restartable;
-
- /*
- * Some signals print output or change the state of the process.
- * There should be restartable, so that reads and writes are
- * not affected. Some signals should cause program flow to change;
- * these signals should not be restartable, so that the system call
- * will return with EINTR, and the program will go do something
- * different. If the signal handler calls longjmp() or siglongjmp(),
- * it doesn't matter if it's restartable.
- */
-
- switch(sig) {
-#ifdef SIGINFO
- case SIGINFO:
-#endif
- case SIGQUIT:
- case SIGUSR1:
- case SIGUSR2:
- case SIGWINCH:
- restartable = 1;
- break;
-
- case SIGALRM:
- case SIGINT:
- case SIGPIPE:
- restartable = 0;
- break;
-
- default:
- /*
- * This is unpleasant, but I don't know what would be better.
- * Right now, this "can't happen"
- */
- errx(1, "xsignal_restart called with signal %d", sig);
- }
-
- return(xsignal_restart(sig, func, restartable));
-}
diff --git a/contrib/lukemftp/src/version.h b/contrib/lukemftp/src/version.h
index a47540d86b02..338099704b66 100644
--- a/contrib/lukemftp/src/version.h
+++ b/contrib/lukemftp/src/version.h
@@ -1,6 +1,6 @@
-/* $NetBSD: version.h,v 1.29 2002/06/05 10:20:51 lukem Exp $ */
+/* $NetBSD: version.h,v 1.31 2003/06/15 13:49:46 lukem Exp $ */
/*-
- * Copyright (c) 1999-2002 The NetBSD Foundation, Inc.
+ * Copyright (c) 1999-2003 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -40,5 +40,5 @@
#endif
#ifndef FTP_VERSION
-#define FTP_VERSION "20020605"
+#define FTP_VERSION "20030615"
#endif