From 1f17b0f8d299a66b618d6671fea9597c971de885 Mon Sep 17 00:00:00 2001 From: mikeh Date: Mon, 16 Jun 2003 02:36:38 +0000 Subject: Import the June 15, 2003 CVS version of NetBSD's ftp + patchset to fix 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. --- contrib/lukemftp/FreeBSD-patchset | 64 + contrib/lukemftp/diffout | 3500 ++++++++++++++++++++++++++++++++++++ contrib/lukemftp/src/Makefile | 26 + contrib/lukemftp/src/cmds.c | 33 +- contrib/lukemftp/src/cmdtab.c | 14 +- contrib/lukemftp/src/complete.c | 14 +- contrib/lukemftp/src/domacro.c | 13 +- contrib/lukemftp/src/extern.h | 12 +- contrib/lukemftp/src/fetch.c | 45 +- contrib/lukemftp/src/ftp.1 | 405 ++++- contrib/lukemftp/src/ftp.c | 35 +- contrib/lukemftp/src/ftp_var.h | 49 +- contrib/lukemftp/src/main.c | 43 +- contrib/lukemftp/src/progressbar.c | 463 +++++ contrib/lukemftp/src/progressbar.h | 99 + contrib/lukemftp/src/ruserpass.c | 21 +- contrib/lukemftp/src/util.c | 429 +---- contrib/lukemftp/src/version.h | 6 +- 18 files changed, 4710 insertions(+), 561 deletions(-) create mode 100644 contrib/lukemftp/FreeBSD-patchset create mode 100644 contrib/lukemftp/diffout create mode 100644 contrib/lukemftp/src/Makefile create mode 100644 contrib/lukemftp/src/progressbar.c create mode 100644 contrib/lukemftp/src/progressbar.h (limited to 'contrib/lukemftp') diff --git a/contrib/lukemftp/FreeBSD-patchset b/contrib/lukemftp/FreeBSD-patchset new file mode 100644 index 0000000..cb592b6 --- /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 + #include + #include ++#include + + #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 + #include + #include ++#include + + #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 + #include ++#include + + #include + #include +@@ -57,10 +58,12 @@ + #include + #include + #include +-#include + #include + + #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 + #include + #include +-#include + #include + + #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 0000000..932f748 --- /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 +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 ++#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 ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + + #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 ++#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 + #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 ++#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 ++ ++#include ++#include ++#include ++#include ++#include ++#include + + #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 ++#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 ++#include ++#include + + #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 ++#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 ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + + #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; 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 : "", file ? file : ""); + + 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] : ""); + + /* 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 ++.\" ``/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 ++#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 ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include + #include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#ifndef USE_SELECT ++#include ++#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 +- . +- +- 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 ++ ++#include ++#include ++ ++#include ++#include ++ + #ifndef NO_EDITCOMPLETE + #include + #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 ++#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 ++#include + +-#include "lukemftp.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + + #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 ++#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 ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 ++#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 ++#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 ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + + #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 ++#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 ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + + #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 0000000..4ba5e92 --- /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 diff --git a/contrib/lukemftp/src/cmds.c b/contrib/lukemftp/src/cmds.c index e132400..69aebed 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 +#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 +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #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 0f52fe2..0d013b4 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 +#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 #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 5d68361..8831bc1 100644 --- a/contrib/lukemftp/src/complete.c +++ b/contrib/lukemftp/src/complete.c @@ -36,11 +36,23 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include +#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 + +#include +#include +#include +#include +#include +#include #include "ftp_var.h" diff --git a/contrib/lukemftp/src/domacro.c b/contrib/lukemftp/src/domacro.c index 09109b0..5a4c736 100644 --- a/contrib/lukemftp/src/domacro.c +++ b/contrib/lukemftp/src/domacro.c @@ -33,7 +33,18 @@ * SUCH DAMAGE. */ -#include "lukemftp.h" +#include +#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 +#include +#include #include "ftp_var.h" diff --git a/contrib/lukemftp/src/extern.h b/contrib/lukemftp/src/extern.h index 0136f43..06fdc40 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 1827abd..b442e0c 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 +#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 +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #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; 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] : ""); /* connect and cwd */ diff --git a/contrib/lukemftp/src/ftp.1 b/contrib/lukemftp/src/ftp.1 index f162ca6..c719c86 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 +.\" ``/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 6dcc530..88a7713 100644 --- a/contrib/lukemftp/src/ftp.c +++ b/contrib/lukemftp/src/ftp.c @@ -98,10 +98,41 @@ * SUCH DAMAGE. */ -#include "lukemftp.h" - +#include +#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 +#include +#include +#include + +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef USE_SELECT +#include +#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 e06076c..ac7c87a 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 + +#include +#include + +#include +#include + #ifndef NO_EDITCOMPLETE #include #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 cc8dcfb..f83d971 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 +#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 +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #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 0000000..2020fc7 --- /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 +#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 +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#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 0000000..b7ca63f --- /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 +#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 0eadfc8..a773086 100644 --- a/contrib/lukemftp/src/ruserpass.c +++ b/contrib/lukemftp/src/ruserpass.c @@ -33,7 +33,26 @@ * SUCH DAMAGE. */ -#include "lukemftp.h" +#include +#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 +#include + +#include +#include +#include +#include +#include +#include +#include +#include #include "ftp_var.h" diff --git a/contrib/lukemftp/src/util.c b/contrib/lukemftp/src/util.c index aa4f73a..3f25d48 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 +#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 +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #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 a47540d..3380997 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 -- cgit v1.1