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