diff options
Diffstat (limited to 'contrib/lukemftp/src')
-rw-r--r-- | contrib/lukemftp/src/cmds.c | 113 | ||||
-rw-r--r-- | contrib/lukemftp/src/cmdtab.c | 4 | ||||
-rw-r--r-- | contrib/lukemftp/src/domacro.c | 15 | ||||
-rw-r--r-- | contrib/lukemftp/src/extern.h | 5 | ||||
-rw-r--r-- | contrib/lukemftp/src/fetch.c | 91 | ||||
-rw-r--r-- | contrib/lukemftp/src/ftp.1 | 108 | ||||
-rw-r--r-- | contrib/lukemftp/src/ftp.c | 55 | ||||
-rw-r--r-- | contrib/lukemftp/src/ftp.cat1 | 1055 | ||||
-rw-r--r-- | contrib/lukemftp/src/ftp_var.h | 20 | ||||
-rw-r--r-- | contrib/lukemftp/src/main.c | 82 | ||||
-rw-r--r-- | contrib/lukemftp/src/ruserpass.c | 18 | ||||
-rw-r--r-- | contrib/lukemftp/src/util.c | 86 | ||||
-rw-r--r-- | contrib/lukemftp/src/version.h | 6 |
13 files changed, 1441 insertions, 217 deletions
diff --git a/contrib/lukemftp/src/cmds.c b/contrib/lukemftp/src/cmds.c index d72a1f8..e132400 100644 --- a/contrib/lukemftp/src/cmds.c +++ b/contrib/lukemftp/src/cmds.c @@ -1,7 +1,7 @@ -/* $NetBSD: cmds.c,v 1.90 2000/08/01 22:47:25 lukem Exp $ */ +/* $NetBSD: cmds.c,v 1.98 2002/06/05 10:20:46 lukem Exp $ */ /*- - * Copyright (c) 1996-2000 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -515,26 +515,28 @@ void reget(int argc, char *argv[]) { - (void)getit(argc, argv, 1, "r+w"); + (void)getit(argc, argv, 1, "r+"); } void get(int argc, char *argv[]) { - (void)getit(argc, argv, 0, restart_point ? "r+w" : "w" ); + (void)getit(argc, argv, 0, restart_point ? "r+" : "w" ); } /* * Receive one file. + * If restartit is 1, restart the xfer always. + * If restartit is -1, restart the xfer only if the remote file is newer. */ int getit(int argc, char *argv[], int restartit, const char *mode) { - int loc = 0; - int rval = 0; - char *remfile, *locfile, *olocfile; + int loc, rval; + char *remfile, *locfile, *olocfile; + loc = rval = 0; if (argc == 2) { argc++; argv[2] = argv[1]; @@ -639,8 +641,9 @@ void mget(int argc, char *argv[]) { sigfunc oldintr; - int ch, ointer; - char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN]; + int ointer; + char *cp, *tp; + int restartit; if (argc == 0 || (argc == 1 && !another(&argc, &argv, "remote-files"))) { @@ -650,6 +653,16 @@ mget(int argc, char *argv[]) } mname = argv[0]; mflag = 1; + restart_point = 0; + restartit = 0; + if (strcmp(argv[0], "mreget") == 0) { + if (! features[FEAT_REST_STREAM]) { + fprintf(ttyout, + "Restart is not supported by the remote server.\n"); + return; + } + restartit = 1; + } oldintr = xsignal(SIGINT, mintr); if (sigsetjmp(jabort, 1)) mabort(); @@ -658,30 +671,32 @@ mget(int argc, char *argv[]) mflag = 0; continue; } - if (mflag && confirm(argv[0], cp)) { - tp = cp; - if (mcase) { - for (tp2 = tmpbuf; (ch = *tp++) != 0; ) - *tp2++ = isupper(ch) ? tolower(ch) : ch; - *tp2 = '\0'; - tp = tmpbuf; - } - if (ntflag) { - tp = dotrans(tp); - } - if (mapflag) { - tp = domap(tp); - } - recvrequest("RETR", tp, cp, "w", - tp != cp || !interactive, 1); - if (!mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with", "mget")) { - mflag++; - } - interactive = ointer; - } + if (! mflag || !confirm(argv[0], cp)) + continue; + tp = cp; + if (mcase) + tp = docase(tp); + if (ntflag) + tp = dotrans(tp); + if (mapflag) + tp = domap(tp); + if (restartit) { + struct stat stbuf; + + if (stat(tp, &stbuf) == 0) + restart_point = stbuf.st_size; + else + warn("stat %s", tp); + } + recvrequest("RETR", tp, cp, restart_point ? "r+" : "w", + tp != cp || !interactive, 1); + restart_point = 0; + if (!mflag && fromatty) { + ointer = interactive; + interactive = 1; + if (confirm("Continue with", "mget")) + mflag++; + interactive = ointer; } } (void)xsignal(SIGINT, oldintr); @@ -711,7 +726,7 @@ fget(int argc, char *argv[]) } argv[0] = "get"; - mode = restart_point ? "r+w" : "w"; + mode = restart_point ? "r+" : "w"; for (; (buf = fparseln(fp, NULL, NULL, "\0\0\0", 0)) != NULL; @@ -1111,7 +1126,7 @@ lcd(int argc, char *argv[]) code = -1; if (argc == 1) { argc++; - argv[1] = home; + argv[1] = localhome; } if (argc != 2) { fprintf(ttyout, "usage: %s [local-directory]\n", argv[0]); @@ -1306,7 +1321,7 @@ mls(int argc, char *argv[]) sigfunc oldintr; int ointer, i; int dolist; - char mode[1], *dest, *odest; + char *mode, *dest, *odest; if (argc == 0) goto usage; @@ -1333,7 +1348,7 @@ mls(int argc, char *argv[]) if (sigsetjmp(jabort, 1)) mabort(); for (i = 1; mflag && i < argc-1 && connected; i++) { - *mode = (i == 1) ? 'w' : 'a'; + mode = (i == 1) ? "w" : "a"; recvrequest(dolist ? "LIST" : "NLST", dest, argv[i], mode, 0, 0); if (!mflag && fromatty) { @@ -1620,6 +1635,12 @@ do_chmod(int argc, char *argv[]) (void)command("SITE CHMOD %s %s", argv[1], argv[2]); } +#define COMMAND_1ARG(argc, argv, cmd) \ + if (argc == 1) \ + command(cmd); \ + else \ + command(cmd " %s", argv[1]) + void do_umask(int argc, char *argv[]) { @@ -1631,7 +1652,7 @@ do_umask(int argc, char *argv[]) return; } verbose = 1; - (void)command(argc == 1 ? "SITE UMASK" : "SITE UMASK %s", argv[1]); + COMMAND_1ARG(argc, argv, "SITE UMASK"); verbose = oldverbose; } @@ -1646,7 +1667,7 @@ idlecmd(int argc, char *argv[]) return; } verbose = 1; - (void)command(argc == 1 ? "SITE IDLE" : "SITE IDLE %s", argv[1]); + COMMAND_1ARG(argc, argv, "SITE IDLE"); verbose = oldverbose; } @@ -1664,7 +1685,7 @@ rmthelp(int argc, char *argv[]) return; } verbose = 1; - (void)command(argc == 1 ? "HELP" : "HELP %s", argv[1]); + COMMAND_1ARG(argc, argv, "HELP"); verbose = oldverbose; } @@ -1792,6 +1813,7 @@ doproxy(int argc, char *argv[]) cmdpos = strcspn(line, " \t"); if (cmdpos > 0) /* remove leading "proxy " from input buffer */ memmove(line, line + cmdpos + 1, strlen(line) - cmdpos + 1); + argv[1] = c->c_name; (*c->c_handler)(argc-1, argv+1); if (connected) { proxflag = 1; @@ -2427,7 +2449,7 @@ rmtstatus(int argc, char *argv[]) code = -1; return; } - (void)command(argc > 1 ? "STAT %s" : "STAT" , argv[1]); + COMMAND_1ARG(argc, argv, "STAT"); } /* @@ -2503,7 +2525,7 @@ page(int argc, char *argv[]) orestart_point = restart_point; overbose = verbose; hash = restart_point = verbose = 0; - recvrequest("RETR", pager, argv[1], "r+w", 1, 0); + recvrequest("RETR", pager, argv[1], "r+", 1, 0); hash = ohash; restart_point = orestart_point; verbose = overbose; @@ -2648,7 +2670,7 @@ mlst(int argc, char *argv[]) return; } verbose = 1; /* If we aren't verbose, this doesn't do anything! */ - (void)command(argc == 1 ? "MLST" : "MLST %s", argv[1]); + COMMAND_1ARG(argc, argv, "MLST"); verbose = oldverbose; } @@ -2668,6 +2690,9 @@ opts(int argc, char *argv[]) return; } verbose = 1; /* If we aren't verbose, this doesn't do anything! */ - (void)command(argc == 2 ? "OPTS %s" : "OPTS %s %s", argv[1], argv[2]); + if (argc == 2) + command("OPTS %s", argv[1]); + else + command("OPTS %s %s", argv[1], argv[2]); verbose = oldverbose; } diff --git a/contrib/lukemftp/src/cmdtab.c b/contrib/lukemftp/src/cmdtab.c index 492f7bd..0f52fe2 100644 --- a/contrib/lukemftp/src/cmdtab.c +++ b/contrib/lukemftp/src/cmdtab.c @@ -1,4 +1,4 @@ -/* $NetBSD: cmdtab.c,v 1.38 2000/09/14 13:48:33 lukem Exp $ */ +/* $NetBSD: cmdtab.c,v 1.39 2000/11/15 00:10:59 lukem Exp $ */ /*- * Copyright (c) 1996-2000 The NetBSD Foundation, Inc. @@ -108,6 +108,7 @@ char lshelp[] = "list contents of remote path"; char macdefhelp[] = "define a macro"; char mdeletehelp[] = "delete multiple files"; char mgethelp[] = "get multiple files"; +char mregethelp[] = "get multiple files restarting at end of local file"; char fgethelp[] = "get files using a localfile as a source of names"; char mkdirhelp[] = "make directory on the remote machine"; char mlshelp[] = "list contents of multiple remote directories"; @@ -224,6 +225,7 @@ struct cmd cmdtab[] = { { "modtime", modtimehelp, 0, 1, 1, CMPL(r) modtime }, { "more", pagehelp, 1, 1, 1, CMPL(r) page }, { "mput", mputhelp, 1, 1, 1, CMPL(L) mput }, + { "mreget", mregethelp, 1, 1, 1, CMPL(R) mget }, { "msend", mputhelp, 1, 1, 1, CMPL(L) mput }, { "newer", newerhelp, 1, 1, 1, CMPL(r) newer }, { "nlist", lshelp, 1, 1, 1, CMPL(rl) ls }, diff --git a/contrib/lukemftp/src/domacro.c b/contrib/lukemftp/src/domacro.c index f42011c..09109b0 100644 --- a/contrib/lukemftp/src/domacro.c +++ b/contrib/lukemftp/src/domacro.c @@ -1,4 +1,4 @@ -/* $NetBSD: domacro.c,v 1.17 2000/07/18 06:45:03 lukem Exp $ */ +/* $NetBSD: domacro.c,v 1.19 2002/02/01 05:04:43 itojun Exp $ */ /* * Copyright (c) 1985, 1993, 1994 @@ -41,7 +41,7 @@ void domacro(int argc, char *argv[]) { int i, j, count = 2, loopflg = 0; - char *cp1, *cp2, line2[200]; + char *cp1, *cp2, line2[FTPBUFLEN]; struct cmd *c; if ((argc == 0 && argv != NULL) || @@ -59,7 +59,7 @@ domacro(int argc, char *argv[]) code = -1; return; } - (void)strcpy(line2, line); + (void)strlcpy(line2, line, sizeof(line2)); TOP: cp1 = macros[i].mac_start; while (cp1 != macros[i].mac_end) { @@ -78,7 +78,8 @@ domacro(int argc, char *argv[]) j = 10*j + *cp1 - '0'; cp1--; if (argc - 2 >= j) { - (void)strcpy(cp2, argv[j+1]); + (void)strlcpy(cp2, argv[j+1], + sizeof(line) - (cp2 - line)); cp2 += strlen(argv[j+1]); } break; @@ -87,7 +88,8 @@ domacro(int argc, char *argv[]) loopflg = 1; cp1++; if (count < argc) { - (void)strcpy(cp2, argv[count]); + (void)strlcpy(cp2, argv[count], + sizeof(line) - (cp2 - line)); cp2 += strlen(argv[count]); } break; @@ -117,10 +119,11 @@ domacro(int argc, char *argv[]) fputs(line, ttyout); putc('\n', ttyout); } + margv[0] = c->c_name; (*c->c_handler)(margc, margv); if (bell && c->c_bell) (void)putc('\007', ttyout); - (void)strcpy(line, line2); + (void)strlcpy(line, line2, sizeof(line)); makeargv(); argc = margc; argv = margv; diff --git a/contrib/lukemftp/src/extern.h b/contrib/lukemftp/src/extern.h index ba8402b..0136f43 100644 --- a/contrib/lukemftp/src/extern.h +++ b/contrib/lukemftp/src/extern.h @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.59 2000/08/06 08:51:22 lukem Exp $ */ +/* $NetBSD: extern.h,v 1.60 2000/10/11 14:46:03 is Exp $ */ /*- * Copyright (c) 1996-2000 The NetBSD Foundation, Inc. @@ -122,7 +122,8 @@ void cleanuppeer(void); void cmdabort(int); void cmdtimeout(int); void cmdscanner(void); -int command(const char *, ...); +int command(const char *, ...) + ; #ifndef NO_EDITCOMPLETE unsigned char complete(EditLine *, int); void controlediting(void); diff --git a/contrib/lukemftp/src/fetch.c b/contrib/lukemftp/src/fetch.c index c38e90d..1827abd 100644 --- a/contrib/lukemftp/src/fetch.c +++ b/contrib/lukemftp/src/fetch.c @@ -1,7 +1,7 @@ -/* $NetBSD: fetch.c,v 1.125 2000/09/28 12:29:23 lukem Exp $ */ +/* $NetBSD: fetch.c,v 1.136 2002/06/05 10:20:48 lukem Exp $ */ /*- - * Copyright (c) 1997-2000 The NetBSD Foundation, Inc. + * Copyright (c) 1997-2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -58,7 +58,7 @@ typedef enum { void aborthttp(int); static int auth_url(const char *, char **, const char *, const char *); -static void base64_encode(const char *, size_t, char *); +static void base64_encode(const u_char *, size_t, u_char *); static int go_fetch(const char *); static int fetch_ftp(const char *); static int fetch_url(const char *, const char *, char *, char *); @@ -171,11 +171,11 @@ auth_url(const char *challenge, char **response, const char *guser, * which should be at least ((len + 2) * 4 / 3 + 1) in size. */ static void -base64_encode(const char *clear, size_t len, char *encoded) +base64_encode(const u_char *clear, size_t len, u_char *encoded) { - static const char enc[] = + static const u_char enc[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - char *cp; + u_char *cp; int i; cp = encoded; @@ -373,7 +373,7 @@ parse_url(const char *url, const char *desc, url_t *type, if (tport != NULL) *port = xstrdup(tport); if (*path == NULL) - *path = xstrdup(""); + *path = xstrdup("/"); if (debug) fprintf(ttyout, @@ -393,7 +393,7 @@ sigjmp_buf httpabort; * If proxyenv is set, use that for the proxy, otherwise try ftp_proxy or * http_proxy as appropriate. * Supports HTTP redirects. - * Returns -1 on failure, 0 on completed xfer, 1 if ftp connection + * Returns 1 on failure, 0 on completed xfer, -1 if ftp connection * is still open (e.g, ftp xfer with trailing /) */ static int @@ -574,6 +574,10 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth) } } FREEPTR(np_copy); + if (isproxy == 0 && urltype == FTP_URL_T) { + rval = fetch_ftp(url); + goto cleanup_fetch_url; + } } if (isproxy) { @@ -700,10 +704,13 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth) (p = strchr(h, '%')) != NULL) { *p = '\0'; } - fprintf(fin, "Host: [%s]:%d\r\n", h, portnum); + fprintf(fin, "Host: [%s]", h); free(h); } else - fprintf(fin, "Host: %s:%d\r\n", host, portnum); + fprintf(fin, "Host: %s", host); + if (portnum != HTTP_PORT) + fprintf(fin, ":%u", portnum); + fprintf(fin, "\r\n"); fprintf(fin, "Accept: */*\r\n"); fprintf(fin, "Connection: close\r\n"); if (restart_point) { @@ -801,26 +808,42 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth) } else if (strncasecmp(cp, CONTENTRANGE, sizeof(CONTENTRANGE) - 1) == 0) { cp += sizeof(CONTENTRANGE) - 1; - rangestart = STRTOLL(cp, &ep, 10); - if (rangestart < 0 || *ep != '-') - goto improper; - cp = ep + 1; - rangeend = STRTOLL(cp, &ep, 10); - if (rangeend < 0 || *ep != '/' || - rangeend < rangestart) + if (*cp == '*') { + ep = cp + 1; + } + else { + rangestart = STRTOLL(cp, &ep, 10); + if (rangestart < 0 || *ep != '-') + goto improper; + cp = ep + 1; + rangeend = STRTOLL(cp, &ep, 10); + if (rangeend < 0 || rangeend < rangestart) + goto improper; + } + if (*ep != '/') goto improper; cp = ep + 1; - entitylen = STRTOLL(cp, &ep, 10); - if (entitylen < 0 || *ep != '\0') + if (*cp == '*') { + ep = cp + 1; + } + else { + entitylen = STRTOLL(cp, &ep, 10); + if (entitylen < 0) + goto improper; + } + if (*ep != '\0') goto improper; - if (debug) - fprintf(ttyout, - "parsed range as: " - LLF "-" LLF "/" LLF "\n", - (LLT)rangestart, - (LLT)rangeend, - (LLT)entitylen); + if (debug) { + fprintf(ttyout, "parsed range as: "); + if (rangestart == -1) + fprintf(ttyout, "*"); + else + fprintf(ttyout, LLF "-" LLF, + (LLT)rangestart, + (LLT)rangeend); + fprintf(ttyout, "/" LLF "\n", (LLT)entitylen); + } if (! restart_point) { warnx( "Received unexpected Content-Range header"); @@ -1014,10 +1037,18 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth) } closefunc = pclose; } else { - if (restart_point){ + if ((rangeend != -1 && rangeend <= restart_point) || + (rangestart == -1 && filesize != -1 && filesize <= restart_point)) { + /* already done */ + if (verbose) + fprintf(ttyout, "already done\n"); + rval = 0; + goto cleanup_fetch_url; + } + if (restart_point && rangestart != -1) { if (entitylen != -1) filesize = entitylen; - if (rangestart != -1 && rangestart != restart_point) { + if (rangestart != restart_point) { warnx( "Size of `%s' differs from save file `%s'", url, savefile); @@ -1149,7 +1180,6 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth) goto cleanup_fetch_url; } progressmeter(1); - bytes = 0; (void)fflush(fout); if (closefunc == fclose && mtime != -1) { struct timeval tval[2]; @@ -1168,6 +1198,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth) } if (bytes > 0) ptransfer(0); + bytes = 0; rval = 0; goto cleanup_fetch_url; @@ -1351,7 +1382,7 @@ fetch_ftp(const char *url) /* Set up the connection */ if (connected) disconnect(0, NULL); - xargv[0] = __progname; + xargv[0] = (char *)getprogname(); /* XXX discards const */ xargv[1] = host; xargv[2] = NULL; xargc = 2; diff --git a/contrib/lukemftp/src/ftp.1 b/contrib/lukemftp/src/ftp.1 index 83bff62..f162ca6 100644 --- a/contrib/lukemftp/src/ftp.1 +++ b/contrib/lukemftp/src/ftp.1 @@ -1,6 +1,6 @@ -.\" $NetBSD: ftp.1,v 1.73 2000/09/28 12:26:19 lukem Exp $ +.\" $NetBSD: ftp.1,v 1.83 2002/06/05 10:20:48 lukem Exp $ .\" -.\" Copyright (c) 1996-2000 The NetBSD Foundation, Inc. +.\" Copyright (c) 1996-2002 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 September 28, 2000 +.Dd May 18, 2002 .Dt FTP 1 .Os .Sh NAME @@ -79,6 +79,9 @@ Internet file transfer program .Nm "" .Op Fl 46AadefginpRtvV .Bk -words +.Op Fl N Ar netrc +.Ek +.Bk -words .Op Fl o Ar output .Ek .Bk -words @@ -202,6 +205,14 @@ If no entry exists, 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. +.It Fl N Ar netrc +Use +.Ar netrc +instead of +.Pa ~/.netrc . +Refer to +.Sx THE .netrc FILE +for more information. .It Fl o Ar output When auto-fetching files, save the contents in .Ar output . @@ -299,7 +310,7 @@ from the user. When .Nm is awaiting commands from the user the prompt -.Ql ftp> +.Ql ftp\*[Gt] is provided to the user. The following commands are recognized by @@ -359,7 +370,10 @@ and exit An end of file will also terminate the session and exit. .It Ic case Toggle remote computer file name case mapping during +.Ic get , .Ic mget +and +.Ic mput commands. When .Ic case @@ -413,7 +427,7 @@ When debugging is on, .Nm prints each command sent to the remote machine, preceded by the string -.Ql \-\-> +.Ql \-\-\*[Gt] .It Ic delete Ar remote-file Delete the file .Ar remote-file @@ -481,8 +495,9 @@ Set the file transfer .Ic form to .Ar format . -The default format is -.Dq file . +The default (and only supported) +format is +.Dq non-print . .It Ic ftp Ar host Op Ar port A synonym for .Ic open . @@ -525,9 +540,10 @@ are used while transferring the file. .It Ic glob Toggle filename expansion for .Ic mdelete , -.Ic mget +.Ic mget , +.Ic mput , and -.Ic mput . +.Ic mreget . If globbing is turned off with .Ic glob , the file name arguments @@ -537,9 +553,10 @@ Globbing for is done as in .Xr csh 1 . For -.Ic mdelete +.Ic mdelete , +.Ic mget , and -.Ic mget , +.Ic mreget , each remote file name is expanded separately on the remote machine and the lists are not merged. Expansion of a directory name is likely to be @@ -548,9 +565,10 @@ the exact result depends on the foreign operating system and ftp server, and can be previewed by doing .Ql mls remote-files \- Note: -.Ic mget -and +.Ic mget , .Ic mput +and +.Ic mreget are not meant to transfer entire directory subtrees of files. That can be done by @@ -697,9 +715,9 @@ Set the file transfer .Ic mode to .Ar mode-name . -The default mode is -.Dq stream -mode. +The default (and only supported) +mode is +.Dq stream . .It Ic modtime Ar remote-file Show the last modification time of the file on the remote machine. .It Ic more Ar file @@ -718,6 +736,13 @@ Resulting file names will then be processed according to and .Ic nmap settings. +.It Ic mreget Ar remote-files +As per +.Ic mget , +but performs a +.Ic reget +instead of +.Ic get . .It Ic msend Ar local-files A synonym for .Ic mput . @@ -800,7 +825,7 @@ the output filename "myfile.data" for input filenames "myfile.data" and "myfile.myfile" for the input filename ".myfile". Spaces may be included in .Ar outpattern , -as in the example: `nmap $1 sed "s/ *$//" > $1' . +as in the example: `nmap $1 sed "s/ *$//" \*[Gt] $1' . Use the `\e' character to prevent special treatment of the `$','[',']', and `,' characters. .It Ic ntrans Op Ar inchars Op Ar outchars @@ -1121,7 +1146,7 @@ commands known to support options include: .Sq MLST (used for .Dv MLSD -and +and .Dv MLST ) . .It Ic rename Op Ar from Op Ar to Rename the file @@ -1249,6 +1274,12 @@ Defaults to Defaults to .Ev $FTPRPROMPT . .El +.It Ic site Ar arg1 arg2 ... +The arguments specified are sent, verbatim, to the remote +.Tn FTP +server as a +.Dv SITE +command. .It Ic size Ar remote-file Return size of .Ar remote-file @@ -1256,12 +1287,6 @@ on remote machine. .It Ic sndbuf Ar size Set the size of the socket send buffer to .Ar size . -.It Ic site Ar arg1 arg2 ... -The arguments specified are sent, verbatim, to the remote -.Tn FTP -server as a -.Dv SITE -command. .It Ic status Show the current status of .Nm ftp . @@ -1270,9 +1295,9 @@ Set the file transfer .Ar structure to .Ar struct-name . -By default -.Dq stream -structure is used. +The default (and only supported) +structure is +.Dq file . .It Ic sunique Toggle storing of files on remote machine under unique file names. The remote @@ -1720,7 +1745,12 @@ The .Pa .netrc file contains login and initialization information used by the auto-login process. -It resides in the user's home directory. +It resides in the user's home directory, +unless overridden with the +.Fl N Ar netrc +option, or specified in the +.Ev NETRC +environment variable. The following tokens are recognized; they may be separated by spaces, tabs, or new-lines: .Bl -tag -width password @@ -1844,7 +1874,7 @@ By default, this is bound to the TAB key. By default, .Nm displays a command line prompt of -.Dq "ftp> " +.Dq "ftp\*[Gt] " to the user. This can be changed with the .Ic "set prompt" @@ -1872,7 +1902,7 @@ begins with .Sq 0 , the number of skipped components precede the trailing component(s) in the format -.Dq /\fI<skipped>\fRtrailing +.Dq /\fI\*[Lt]skipped\*[Gt]\fRtrailing (for .Sq %c ) or @@ -1920,7 +1950,7 @@ only .It Ev FTPPROMPT Command-line prompt to use. Defaults to -.Dq "ftp> " . +.Dq "ftp\*[Gt] " . Refer to .Sx COMMAND LINE PROMPT for more information. @@ -1947,6 +1977,10 @@ lookup of For default location of a .Pa .netrc file, if one exists. +.It Ev NETRC +An alternate location of the +.Pa .netrc +file. .It Ev PAGER Used by various commands to display files. Defaults to @@ -1963,6 +1997,10 @@ URL requests (if not defined, use the standard .Tn FTP protocol). +.Pp +.Em NOTE : +this is not used for interactive sessions, only for command-line +fetches. .It Ev http_proxy URL of .Tn HTTP @@ -1979,7 +2017,11 @@ and .Ev http_proxy may be incompatible with other programs that use it (such as -.Xr lynx 1 ). +.Xr lynx 1 ) . +.Pp +.Em NOTE : +this is not used for interactive sessions, only for command-line +fetches. .It Ev no_proxy A space or comma separated list of hosts (or domains) for which proxying is not to be used. @@ -2019,7 +2061,7 @@ and other enhancements over the standard were implemented in .Nx 1.3 and later releases -by Luke Mewburn <lukem@netbsd.org>. +by Luke Mewburn \*[Lt]lukem@netbsd.org\*[Gt]. .Pp IPv6 support was added by the WIDE/KAME project (but may not be present in all non-NetBSD versions of this program, depending diff --git a/contrib/lukemftp/src/ftp.c b/contrib/lukemftp/src/ftp.c index b340e85..6dcc530 100644 --- a/contrib/lukemftp/src/ftp.c +++ b/contrib/lukemftp/src/ftp.c @@ -1,7 +1,7 @@ -/* $NetBSD: ftp.c,v 1.109 2000/09/28 12:29:24 lukem Exp $ */ +/* $NetBSD: ftp.c,v 1.120 2002/06/05 10:20:49 lukem Exp $ */ /*- - * Copyright (c) 1996-2000 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -192,8 +192,9 @@ hookup(char *host, char *port) if (res0->ai_next) /* if we have multiple possibilities */ #endif { - getnameinfo(res->ai_addr, res->ai_addrlen, - hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST); + if (getnameinfo(res->ai_addr, res->ai_addrlen, + hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST)) + strlcpy(hbuf, "?", sizeof(hbuf)); fprintf(ttyout, "Trying %s...\n", hbuf); } ((struct sockaddr_in *)res->ai_addr)->sin_port = htons(portnum); @@ -209,9 +210,10 @@ hookup(char *host, char *port) if (error) { /* this "if" clause is to prevent print warning twice */ if (res->ai_next) { - getnameinfo(res->ai_addr, res->ai_addrlen, + if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf), NULL, 0, - NI_NUMERICHOST); + NI_NUMERICHOST)) + strlcpy(hbuf, "?", sizeof(hbuf)); warn("connect to address %s", hbuf); } cause = "connect"; @@ -703,7 +705,7 @@ sendrequest(const char *cmd, const char *local, const char *remote, } if (command("REST " LLF, (LLT)restart_point) != CONTINUE) goto cleanupsend; - lmode = "r+w"; + lmode = "r+"; } if (remote) { if (command("%s %s", cmd, remote) != PRELIM) @@ -1178,7 +1180,7 @@ recvrequest(const char *cmd, const char *local, const char *remote, bytes++; contin2: ; } -break2: + break2: if (hash && (!progress || filesize < 0)) { if (bytes < hashbytes) (void)putc('#', ttyout); @@ -1300,7 +1302,8 @@ initconn(void) switch (data_addr.su_family) { case AF_INET: if (epsv4 && !epsv4bad) { - result = command(pasvcmd = "EPSV"); + pasvcmd = "EPSV"; + result = command("EPSV"); if (!connected) return (1); /* @@ -1322,14 +1325,16 @@ initconn(void) } } if (result != COMPLETE) { - result = command(pasvcmd = "PASV"); + pasvcmd = "PASV"; + result = command("PASV"); if (!connected) return (1); } break; #ifdef INET6 case AF_INET6: - result = command(pasvcmd = "EPSV"); + pasvcmd = "EPSV"; + result = command("EPSV"); if (!connected) return (1); /* this code is to be friendly with broken BSDI ftpd */ @@ -1339,8 +1344,10 @@ initconn(void) ttyout); result = COMPLETE + 1; } - if (result != COMPLETE) - result = command(pasvcmd = "LPSV"); + if (result != COMPLETE) { + pasvcmd = "LPSV"; + result = command("LPSV"); + } if (!connected) return (1); break; @@ -1573,10 +1580,9 @@ initconn(void) warn("listen"); if (sendport) { -#ifdef INET6 - char hname[INET6_ADDRSTRLEN]; + char hname[NI_MAXHOST], sname[NI_MAXSERV]; int af; -#endif + struct sockinet tmp; switch (data_addr.su_family) { case AF_INET: @@ -1587,14 +1593,20 @@ initconn(void) /* FALLTHROUGH */ #ifdef INET6 case AF_INET6: +#endif af = (data_addr.su_family == AF_INET) ? 1 : 2; - if (getnameinfo((struct sockaddr *)&data_addr.si_su, - data_addr.su_len, hname, sizeof(hname), NULL, 0, - NI_NUMERICHOST)) { + tmp = data_addr; +#ifdef INET6 + if (tmp.su_family == AF_INET6) + tmp.si_su.su_sin6.sin6_scope_id = 0; +#endif + if (getnameinfo((struct sockaddr *)&tmp.si_su, + tmp.su_len, hname, sizeof(hname), sname, + sizeof(sname), NI_NUMERICHOST | NI_NUMERICSERV)) { result = ERROR; } else { - result = command("EPRT |%d|%s|%d|", af, hname, - ntohs(data_addr.su_port)); + result = command("EPRT |%d|%s|%s|", af, hname, + sname); if (!connected) return (1); if (result != COMPLETE) { @@ -1606,7 +1618,6 @@ initconn(void) } } break; -#endif default: result = COMPLETE + 1; break; diff --git a/contrib/lukemftp/src/ftp.cat1 b/contrib/lukemftp/src/ftp.cat1 new file mode 100644 index 0000000..091a119 --- /dev/null +++ b/contrib/lukemftp/src/ftp.cat1 @@ -0,0 +1,1055 @@ +FTP(1) NetBSD Reference Manual FTP(1) + +NNAAMMEE + ffttpp - Internet file transfer program + +SSYYNNOOPPSSIISS + ffttpp [--4466AAaaddeeffggiinnppRRttvvVV] [--NN _n_e_t_r_c] [--oo _o_u_t_p_u_t] [--PP _p_o_r_t] [--rr _r_e_t_r_y] [--TT + _d_i_r,_m_a_x[,_i_n_c]] [[_u_s_e_r@]_h_o_s_t [_p_o_r_t]] [_u_s_e_r@]_h_o_s_t:[_p_a_t_h][/] + [file:///_p_a_t_h] [ftp://[_u_s_e_r[:_p_a_s_s_w_o_r_d]@]_h_o_s_t[:_p_o_r_t]/_p_a_t_h[/]] + [http://[_u_s_e_r[:_p_a_s_s_w_o_r_d]@]_h_o_s_t[:_p_o_r_t]/_p_a_t_h] [_._._.] + ffttpp --uu _u_r_l file [_._._.] + +DDEESSCCRRIIPPTTIIOONN + ffttpp is the user interface to the Internet standard File Transfer Proto- + col. The program allows a user to transfer files to and from a remote + network site. + + The last five arguments will fetch a file using the FTP or HTTP proto- + cols, or by direct copying, into the current directory. This is ideal + for scripts. Refer to _A_U_T_O_-_F_E_T_C_H_I_N_G _F_I_L_E_S below for more information. + + Options may be specified at the command line, or to the command inter- + preter. + + --44 Forces ffttpp to only use IPv4 addresses. + + --66 Forces ffttpp to only use IPv6 addresses. + + --AA Force active mode ftp. By default, ffttpp will try to use passive + mode ftp and fall back to active mode if passive is not support- + ed by the server. This option causes ffttpp to always use an ac- + tive connection. It is only useful for connecting to very old + servers that do not implement passive mode properly. + + --aa Causes ffttpp to bypass normal login procedure, and use an anony- + mous login instead. + + --dd Enables debugging. + + --ee Disables command line editing. This is useful for Emacs ange- + ftp mode. + + --ff Forces a cache reload for transfers that go through the FTP or + HTTP proxies. + + --gg Disables file name globbing. + + --ii Turns off interactive prompting during multiple file transfers. + + --nn Restrains ffttpp from attempting ``auto-login'' upon initial con- + nection. If auto-login is enabled, ffttpp will check the _._n_e_t_r_c + (see below) file in the user's home directory for an entry de- + scribing an account on the remote machine. If no entry exists, + ffttpp will prompt for the remote machine login name (default is + the user identity on the local machine), and, if necessary, + prompt for a password and an account with which to login. + + --NN _n_e_t_r_c + Use _n_e_t_r_c instead of _~_/_._n_e_t_r_c. Refer to _T_H_E _._n_e_t_r_c _F_I_L_E for + more information. + + --oo _o_u_t_p_u_t + When auto-fetching files, save the contents in _o_u_t_p_u_t. _o_u_t_p_u_t + is parsed according to the _F_I_L_E _N_A_M_I_N_G _C_O_N_V_E_N_T_I_O_N_S below. If + _o_u_t_p_u_t is not `-' or doesn't start with `|', then only the first + file specified will be retrieved into _o_u_t_p_u_t; all other files + will be retrieved into the basename of their remote name. + + --pp Enable passive mode operation for use behind connection filter- + ing firewalls. This option has been deprecated as ffttpp now tries + to use passive mode by default, falling back to active mode if + the server does not support passive connections. + + --PP _p_o_r_t Sets the port number to _p_o_r_t. + + --rr _w_a_i_t Retry the connection attempt if it failed, pausing for _w_a_i_t sec- + onds. + + --RR Restart all non-proxied auto-fetches. + + --tt Enables packet tracing. + + --TT _d_i_r_e_c_t_i_o_n,_m_a_x_i_m_u_m[,_i_n_c_r_e_m_e_n_t] + Set the maximum transfer rate for _d_i_r_e_c_t_i_o_n to _m_a_x_i_m_u_m + bytes/second, and if specified, the increment to _i_n_c_r_e_m_e_n_t + bytes/second. Refer to rraattee for more information. + + --uu _u_r_l _f_i_l_e [...] + Upload files on the command line to _u_r_l where _u_r_l is one of the + ftp URL types as supported by auto-fetch (with an optional tar- + get filename for single file uploads), and _f_i_l_e is one or more + local files to be uploaded. + + --vv Enable vveerrbboossee and pprrooggrreessss. This is the default if output is + to a terminal (and in the case of pprrooggrreessss, ffttpp is the fore- + ground process). Forces ffttpp to show all responses from the re- + mote server, as well as report on data transfer statistics. + + --VV Disable vveerrbboossee and pprrooggrreessss, overriding the default of enabled + when output is to a terminal. + + The client host with which ffttpp is to communicate may be specified on the + command line. If this is done, ffttpp will immediately attempt to establish + a connection to an FTP server on that host; otherwise, ffttpp will enter its + command interpreter and await instructions from the user. When ffttpp is + awaiting commands from the user the prompt `ftp>' is provided to the us- + er. The following commands are recognized by ffttpp: + + !! [_c_o_m_m_a_n_d [_a_r_g_s]] + Invoke an interactive shell on the local machine. If there + are arguments, the first is taken to be a command to execute + directly, with the rest of the arguments as its arguments. + + $$ _m_a_c_r_o_-_n_a_m_e [_a_r_g_s] + Execute the macro _m_a_c_r_o_-_n_a_m_e that was defined with the mmaaccddeeff + command. Arguments are passed to the macro unglobbed. + + aaccccoouunntt [_p_a_s_s_w_d] + Supply a supplemental password required by a remote system + for access to resources once a login has been successfully + completed. If no argument is included, the user will be + prompted for an account password in a non-echoing input mode. + + aappppeenndd _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e] + Append a local file to a file on the remote machine. If + _r_e_m_o_t_e_-_f_i_l_e is left unspecified, the local file name is used + in naming the remote file after being altered by any nnttrraannss + or nnmmaapp setting. File transfer uses the current settings for + ttyyppee, ffoorrmmaatt, mmooddee, and ssttrruuccttuurree. + + aasscciiii Set the file transfer ttyyppee to network ASCII. This is the de- + fault type. + + bbeellll Arrange that a bell be sounded after each file transfer com- + mand is completed. + + bbiinnaarryy Set the file transfer ttyyppee to support binary image transfer. + + bbyyee Terminate the FTP session with the remote server and exit + ffttpp. An end of file will also terminate the session and ex- + it. + + ccaassee Toggle remote computer file name case mapping during ggeett, + mmggeett and mmppuutt commands. When ccaassee is on (default is off), + remote computer file names with all letters in upper case are + written in the local directory with the letters mapped to + lower case. + + ccdd _r_e_m_o_t_e_-_d_i_r_e_c_t_o_r_y + Change the working directory on the remote machine to _r_e_m_o_t_e_- + _d_i_r_e_c_t_o_r_y. + + ccdduupp Change the remote machine working directory to the parent of + the current remote machine working directory. + + cchhmmoodd _m_o_d_e _r_e_m_o_t_e_-_f_i_l_e + Change the permission modes of the file _r_e_m_o_t_e_-_f_i_l_e on the + remote system to _m_o_d_e. + + cclloossee Terminate the FTP session with the remote server, and return + to the command interpreter. Any defined macros are erased. + + ccrr Toggle carriage return stripping during ascii type file re- + trieval. Records are denoted by a carriage return/linefeed + sequence during ascii type file transfer. When ccrr is on (the + default), carriage returns are stripped from this sequence to + conform with the UNIX single linefeed record delimiter. + Records on non-UNIX remote systems may contain single line- + feeds; when an ascii type transfer is made, these linefeeds + may be distinguished from a record delimiter only when ccrr is + off. + + ddeebbuugg [_d_e_b_u_g_-_v_a_l_u_e] + Toggle debugging mode. If an optional _d_e_b_u_g_-_v_a_l_u_e is speci- + fied it is used to set the debugging level. When debugging + is on, ffttpp prints each command sent to the remote machine, + preceded by the string `-->' + + ddeelleettee _r_e_m_o_t_e_-_f_i_l_e + Delete the file _r_e_m_o_t_e_-_f_i_l_e on the remote machine. + + ddiirr [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]] + Print a listing of the contents of a directory on the remote + machine. The listing includes any system-dependent informa- + tion that the server chooses to include; for example, most + UNIX systems will produce output from the command `ls -l'. + If _r_e_m_o_t_e_-_p_a_t_h is left unspecified, the current working di- + rectory is used. If interactive prompting is on, ffttpp will + prompt the user to verify that the last argument is indeed + the target local file for receiving ddiirr output. If no local + file is specified, or if _l_o_c_a_l_-_f_i_l_e is `--', the output is + sent to the terminal. + + ddiissccoonnnneecctt A synonym for cclloossee. + + eeddiitt Toggle command line editing, and context sensitive command + and file completion. This is automatically enabled if input + is from a terminal, and disabled otherwise. + + eeppssvv44 Toggle the use of the extended EPSV and EPRT commands on IPv4 + connections; first try EPSV / EPRT, and then PASV / PORT. + This is enabled by default. If an extended command fails + then this option will be temporarily disabled for the dura- + tion of the current connection, or until eeppssvv44 is executed + again. + + eexxiitt A synonym for bbyyee. + + ffeeaattuurreess Display what features the remote server supports (using the + FEAT command). + + ffggeett _l_o_c_a_l_f_i_l_e + Retrieve the files listed in _l_o_c_a_l_f_i_l_e, which has one line + per filename. + + ffoorrmm _f_o_r_m_a_t + Set the file transfer ffoorrmm to _f_o_r_m_a_t. The default (and only + supported) format is ``non-print''. + + ffttpp _h_o_s_t [_p_o_r_t] + A synonym for ooppeenn. + + ggaattee [_h_o_s_t [_p_o_r_t]] + Toggle gate-ftp mode, which used to connect through the TIS + FWTK and Gauntlet ftp proxies. This will not be permitted if + the gate-ftp server hasn't been set (either explicitly by the + user, or from the FTPSERVER environment variable). If _h_o_s_t + is given, then gate-ftp mode will be enabled, and the gate- + ftp server will be set to _h_o_s_t. If _p_o_r_t is also given, that + will be used as the port to connect to on the gate-ftp serv- + er. + + ggeett _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e] + Retrieve the _r_e_m_o_t_e_-_f_i_l_e and store it on the local machine. + If the local file name is not specified, it is given the same + name it has on the remote machine, subject to alteration by + the current ccaassee, nnttrraannss, and nnmmaapp settings. The current + settings for ttyyppee, ffoorrmm, mmooddee, and ssttrruuccttuurree are used while + transferring the file. + + gglloobb Toggle filename expansion for mmddeelleettee, mmggeett, mmppuutt, and + mmrreeggeett. If globbing is turned off with gglloobb, the file name + arguments are taken literally and not expanded. Globbing for + mmppuutt is done as in csh(1). For mmddeelleettee, mmggeett, and mmrreeggeett, + each remote file name is expanded separately on the remote + machine and the lists are not merged. Expansion of a direc- + tory name is likely to be different from expansion of the + name of an ordinary file: the exact result depends on the + foreign operating system and ftp server, and can be previewed + by doing `mls remote-files -' Note: mmggeett, mmppuutt and mmrreeggeett are + not meant to transfer entire directory subtrees of files. + That can be done by transferring a tar(1) archive of the sub- + tree (in binary mode). + + hhaasshh [_s_i_z_e] + Toggle hash-sign (``#'') printing for each data block trans- + ferred. The size of a data block defaults to 1024 bytes. + This can be changed by specifying _s_i_z_e in bytes. Enabling + hhaasshh disables pprrooggrreessss. + + hheellpp [_c_o_m_m_a_n_d] + Print an informative message about the meaning of _c_o_m_m_a_n_d. + If no argument is given, ffttpp prints a list of the known com- + mands. + + iiddllee [_s_e_c_o_n_d_s] + Set the inactivity timer on the remote server to _s_e_c_o_n_d_s sec- + onds. If _s_e_c_o_n_d_s is omitted, the current inactivity timer is + printed. + + iimmaaggee A synonym for bbiinnaarryy. + + llccdd [_d_i_r_e_c_t_o_r_y] + Change the working directory on the local machine. If no + _d_i_r_e_c_t_o_r_y is specified, the user's home directory is used. + + lleessss _f_i_l_e A synonym for ppaaggee. + + llppaaggee _l_o_c_a_l_-_f_i_l_e + Display _l_o_c_a_l_-_f_i_l_e with the program specified by the sseett + ppaaggeerr option. + + llppwwdd Print the working directory on the local machine. + + llss [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]] + A synonym for ddiirr. + + mmaaccddeeff _m_a_c_r_o_-_n_a_m_e + Define a macro. Subsequent lines are stored as the macro + _m_a_c_r_o_-_n_a_m_e; a null line (consecutive newline characters in a + file or carriage returns from the terminal) terminates macro + input mode. There is a limit of 16 macros and 4096 total + characters in all defined macros. Macros remain defined un- + til a cclloossee command is executed. The macro processor inter- + prets `$' and `\' as special characters. A `$' followed by a + number (or numbers) is replaced by the corresponding argument + on the macro invocation command line. A `$' followed by an + `i' signals that macro processor that the executing macro is + to be looped. On the first pass `$i' is replaced by the + first argument on the macro invocation command line, on the + second pass it is replaced by the second argument, and so on. + A `\' followed by any character is replaced by that charac- + ter. Use the `\' to prevent special treatment of the `$'. + + mmddeelleettee [_r_e_m_o_t_e_-_f_i_l_e_s] + Delete the _r_e_m_o_t_e_-_f_i_l_e_s on the remote machine. + + mmddiirr _r_e_m_o_t_e_-_f_i_l_e_s _l_o_c_a_l_-_f_i_l_e + Like ddiirr, except multiple remote files may be specified. If + interactive prompting is on, ffttpp will prompt the user to ver- + ify that the last argument is indeed the target local file + for receiving mmddiirr output. + + mmggeett _r_e_m_o_t_e_-_f_i_l_e_s + Expand the _r_e_m_o_t_e_-_f_i_l_e_s on the remote machine and do a ggeett + for each file name thus produced. See gglloobb for details on + the filename expansion. Resulting file names will then be + processed according to ccaassee, nnttrraannss, and nnmmaapp settings. + Files are transferred into the local working directory, which + can be changed with `lcd directory'; new local directories + can be created with `! mkdir directory'. + + mmkkddiirr _d_i_r_e_c_t_o_r_y_-_n_a_m_e + Make a directory on the remote machine. + + mmllss _r_e_m_o_t_e_-_f_i_l_e_s _l_o_c_a_l_-_f_i_l_e + Like llss, except multiple remote files may be specified, and + the _l_o_c_a_l_-_f_i_l_e must be specified. If interactive prompting + is on, ffttpp will prompt the user to verify that the last argu- + ment is indeed the target local file for receiving mmllss out- + put. + + mmllssdd [_r_e_m_o_t_e_-_p_a_t_h] + Display the contents of _r_e_m_o_t_e_-_p_a_t_h (which should default to + the current directory if not given) in a machine-parsable + form, using MLSD. The format of display can be changed with + `remopts mlst ...'. + + mmllsstt [_r_e_m_o_t_e_-_p_a_t_h] + Display the details about _r_e_m_o_t_e_-_p_a_t_h (which should default + to the current directory if not given) in a machine-parsable + form, using MLST. The format of display can be changed with + `remopts mlst ...'. + + mmooddee _m_o_d_e_-_n_a_m_e + Set the file transfer mmooddee to _m_o_d_e_-_n_a_m_e. The default (and + only supported) mode is ``stream''. + + mmooddttiimmee _r_e_m_o_t_e_-_f_i_l_e + Show the last modification time of the file on the remote ma- + chine. + + mmoorree _f_i_l_e A synonym for ppaaggee. + + mmppuutt _l_o_c_a_l_-_f_i_l_e_s + Expand wild cards in the list of local files given as argu- + ments and do a ppuutt for each file in the resulting list. See + gglloobb for details of filename expansion. Resulting file names + will then be processed according to nnttrraannss and nnmmaapp settings. + + mmrreeggeett _r_e_m_o_t_e_-_f_i_l_e_s + As per mmggeett, but performs a rreeggeett instead of ggeett. + + mmsseenndd _l_o_c_a_l_-_f_i_l_e_s + A synonym for mmppuutt. + + nneewweerr _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e] + Get the file only if the modification time of the remote file + is more recent that the file on the current system. If the + file does not exist on the current system, the remote file is + considered nneewweerr. Otherwise, this command is identical to + _g_e_t. + + nnlliisstt [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]] + A synonym for llss. + + nnmmaapp [_i_n_p_a_t_t_e_r_n _o_u_t_p_a_t_t_e_r_n] + Set or unset the filename mapping mechanism. If no arguments + are specified, the filename mapping mechanism is unset. If + arguments are specified, remote filenames are mapped during + mmppuutt commands and ppuutt commands issued without a specified re- + mote target filename. If arguments are specified, local + filenames are mapped during mmggeett commands and ggeett commands + issued without a specified local target filename. This com- + mand is useful when connecting to a non-UNIX remote computer + with different file naming conventions or practices. The + mapping follows the pattern set by _i_n_p_a_t_t_e_r_n and _o_u_t_p_a_t_t_e_r_n. + [_I_n_p_a_t_t_e_r_n] is a template for incoming filenames (which may + have already been processed according to the nnttrraannss and ccaassee + settings). Variable templating is accomplished by including + the sequences `$1', `$2', ..., `$9' in _i_n_p_a_t_t_e_r_n. Use `\' to + prevent this special treatment of the `$' character. All + other characters are treated literally, and are used to de- + termine the nnmmaapp [_i_n_p_a_t_t_e_r_n] variable values. For example, + given _i_n_p_a_t_t_e_r_n $1.$2 and the remote file name "mydata.data", + $1 would have the value "mydata", and $2 would have the value + "data". The _o_u_t_p_a_t_t_e_r_n determines the resulting mapped file- + name. The sequences `$1', `$2', ...., `$9' are replaced by + any value resulting from the _i_n_p_a_t_t_e_r_n template. The se- + quence `$0' is replace by the original filename. Additional- + ly, the sequence `[_s_e_q_1, _s_e_q_2]' is replaced by [_s_e_q_1] if _s_e_q_1 + is not a null string; otherwise it is replaced by _s_e_q_2. For + example, the command + + nmap $1.$2.$3 [$1,$2].[$2,file] + + would yield the output filename "myfile.data" for input file- + names "myfile.data" and "myfile.data.old", "myfile.file" for + the input filename "myfile", and "myfile.myfile" for the in- + put filename ".myfile". Spaces may be included in + _o_u_t_p_a_t_t_e_r_n, as in the example: `nmap $1 sed "s/ *$//" > $1' + . Use the `\' character to prevent special treatment of the + `$','[',']', and `,' characters. + + nnttrraannss [_i_n_c_h_a_r_s [_o_u_t_c_h_a_r_s]] + Set or unset the filename character translation mechanism. + If no arguments are specified, the filename character trans- + lation mechanism is unset. If arguments are specified, char- + acters in remote filenames are translated during mmppuutt com- + mands and ppuutt commands issued without a specified remote tar- + get filename. If arguments are specified, characters in lo- + cal filenames are translated during mmggeett commands and ggeett + commands issued without a specified local target filename. + This command is useful when connecting to a non-UNIX remote + computer with different file naming conventions or practices. + Characters in a filename matching a character in _i_n_c_h_a_r_s are + replaced with the corresponding character in _o_u_t_c_h_a_r_s. If + the character's position in _i_n_c_h_a_r_s is longer than the length + of _o_u_t_c_h_a_r_s, the character is deleted from the file name. + + ooppeenn _h_o_s_t [_p_o_r_t] + Establish a connection to the specified _h_o_s_t FTP server. An + optional port number may be supplied, in which case, ffttpp will + attempt to contact an FTP server at that port. If the aauuttoo-- + llooggiinn option is on (default), ffttpp will also attempt to auto- + matically log the user in to the FTP server (see below). + + ppaaggee _f_i_l_e Retrieve ffiillee and display with the program specified by the + sseett ppaaggeerr option. + + ppaassssiivvee [aauuttoo] + Toggle passive mode (if no arguments are given). If aauuttoo is + given, act as if FTPMODE is set to `auto'. If passive mode + is turned on (default), ffttpp will send a PASV command for all + data connections instead of a PORT command. The PASV command + requests that the remote server open a port for the data con- + nection and return the address of that port. The remote + server listens on that port and the client connects to it. + When using the more traditional PORT command, the client lis- + tens on a port and sends that address to the remote server, + who connects back to it. Passive mode is useful when using + ffttpp through a gateway router or host that controls the direc- + tionality of traffic. (Note that though FTP servers are re- + quired to support the PASV command by RFC 1123, some do not.) + + ppddiirr [_r_e_m_o_t_e_-_p_a_t_h] + Perform ddiirr [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the + program specified by the sseett ppaaggeerr option. + + ppllss [_r_e_m_o_t_e_-_p_a_t_h] + Perform llss [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the + program specified by the sseett ppaaggeerr option. + + ppmmllssdd [_r_e_m_o_t_e_-_p_a_t_h] + Perform mmllssdd [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the + program specified by the sseett ppaaggeerr option. + + pprreesseerrvvee Toggle preservation of modification times on retrieved files. + + pprrooggrreessss Toggle display of transfer progress bar. The progress bar + will be disabled for a transfer that has _l_o_c_a_l_-_f_i_l_e as `--' or + a command that starts with `|'. Refer to _F_I_L_E _N_A_M_I_N_G + _C_O_N_V_E_N_T_I_O_N_S for more information. Enabling pprrooggrreessss disables + hhaasshh. + + pprroommpptt Toggle interactive prompting. Interactive prompting occurs + during multiple file transfers to allow the user to selec- + tively retrieve or store files. If prompting is turned off + (default is on), any mmggeett or mmppuutt will transfer all files, + and any mmddeelleettee will delete all files. + + When prompting is on, the following commands are available at + a prompt: + + aa Answer `yes' to the current file, and automatically + answer `yes' to any remaining files for the current + command. + + nn Answer `no', and do not transfer the file. + + pp Answer `yes' to the current file, and turn off + prompt mode (as is ``prompt off'' had been given). + + qq Terminate the current operation. + + yy Answer `yes', and transfer the file. + + ?? Display a help message. + + Any other reponse will answer `yes' to the current file. + + pprrooxxyy _f_t_p_-_c_o_m_m_a_n_d + Execute an ftp command on a secondary control connection. + This command allows simultaneous connection to two remote FTP + servers for transferring files between the two servers. The + first pprrooxxyy command should be an ooppeenn, to establish the sec- + ondary control connection. Enter the command "proxy ?" to + see other FTP commands executable on the secondary connec- + tion. The following commands behave differently when pref- + aced by pprrooxxyy: ooppeenn will not define new macros during the au- + to-login process, cclloossee will not erase existing macro defini- + tions, ggeett and mmggeett transfer files from the host on the pri- + mary control connection to the host on the secondary control + connection, and ppuutt, mmppuutt, and aappppeenndd transfer files from the + host on the secondary control connection to the host on the + primary control connection. Third party file transfers de- + pend upon support of the FTP protocol PASV command by the + server on the secondary control connection. + + ppuutt _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e] + Store a local file on the remote machine. If _r_e_m_o_t_e_-_f_i_l_e is + left unspecified, the local file name is used after process- + ing according to any nnttrraannss or nnmmaapp settings in naming the + remote file. File transfer uses the current settings for + ttyyppee, ffoorrmmaatt, mmooddee, and ssttrruuccttuurree. + + ppwwdd Print the name of the current working directory on the remote + machine. + + qquuiitt A synonym for bbyyee. + + qquuoottee _a_r_g_1 _a_r_g_2 _._._. + The arguments specified are sent, verbatim, to the remote FTP + server. + + rraattee _d_i_r_e_c_t_i_o_n [_m_a_x_i_m_u_m [_i_n_c_r_e_m_e_n_t]] + Throttle the maximum transfer rate to _m_a_x_i_m_u_m bytes/second. + If _m_a_x_i_m_u_m is 0, disable the throttle. + + _d_i_r_e_c_t_i_o_n may be one of: + aallll Both directions. + ggeett Incoming transfers. + ppuutt Outgoing transfers. + + _m_a_x_i_m_u_m can by modified on the fly by _i_n_c_r_e_m_e_n_t bytes (de- + fault: 1024) each time a given signal is received: + + SIGUSR1 Increment _m_a_x_i_m_u_m by _i_n_c_r_e_m_e_n_t bytes. + + SIGUSR2 Decrement _m_a_x_i_m_u_m by _i_n_c_r_e_m_e_n_t bytes. The re- + sult must be a positive number. + + If _m_a_x_i_m_u_m is not supplied, the current throttle rates are + displayed. + + Note: rraattee is not yet implemented for ascii mode transfers. + + rrccvvbbuuff _s_i_z_e + Set the size of the socket receive buffer to _s_i_z_e. + + rreeccvv _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e] + A synonym for ggeett. + + rreeggeett _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e] + rreeggeett acts like ggeett, except that if _l_o_c_a_l_-_f_i_l_e exists and is + smaller than _r_e_m_o_t_e_-_f_i_l_e, _l_o_c_a_l_-_f_i_l_e is presumed to be a par- + tially transferred copy of _r_e_m_o_t_e_-_f_i_l_e and the transfer is + continued from the apparent point of failure. This command + is useful when transferring very large files over networks + that are prone to dropping connections. + + rreemmooppttss _c_o_m_m_a_n_d [_c_o_m_m_a_n_d_-_o_p_t_i_o_n_s] + Set options on the remote FTP server for _c_o_m_m_a_n_d to _c_o_m_m_a_n_d_- + _o_p_t_i_o_n_s (whose absence is handled on a command-specific ba- + sis). Remote FTP commands known to support options include: + `MLST' (used for MLSD and MLST). + + rreennaammee [_f_r_o_m [_t_o]] + Rename the file _f_r_o_m on the remote machine, to the file _t_o. + + rreesseett Clear reply queue. This command re-synchronizes command/re- + ply sequencing with the remote FTP server. Resynchronization + may be necessary following a violation of the FTP protocol by + the remote server. + + rreessttaarrtt _m_a_r_k_e_r + Restart the immediately following ggeett or ppuutt at the indicated + _m_a_r_k_e_r. On UNIX systems, marker is usually a byte offset in- + to the file. + + rrhheellpp [_c_o_m_m_a_n_d_-_n_a_m_e] + Request help from the remote FTP server. If a _c_o_m_m_a_n_d_-_n_a_m_e + is specified it is supplied to the server as well. + + rrmmddiirr _d_i_r_e_c_t_o_r_y_-_n_a_m_e + Delete a directory on the remote machine. + + rrssttaattuuss [_r_e_m_o_t_e_-_f_i_l_e] + With no arguments, show status of remote machine. If _r_e_m_o_t_e_- + _f_i_l_e is specified, show status of _r_e_m_o_t_e_-_f_i_l_e on remote ma- + chine. + + rruunniiqquuee Toggle storing of files on the local system with unique file- + names. If a file already exists with a name equal to the + target local filename for a ggeett or mmggeett command, a ".1" is + appended to the name. If the resulting name matches another + existing file, a ".2" is appended to the original name. If + this process continues up to ".99", an error message is + printed, and the transfer does not take place. The generated + unique filename will be reported. Note that rruunniiqquuee will not + affect local files generated from a shell command (see be- + low). The default value is off. + + sseenndd _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e] + A synonym for ppuutt. + + sseennddppoorrtt Toggle the use of PORT commands. By default, ffttpp will at- + tempt to use a PORT command when establishing a connection + for each data transfer. The use of PORT commands can prevent + delays when performing multiple file transfers. If the PORT + command fails, ffttpp will use the default data port. When the + use of PORT commands is disabled, no attempt will be made to + use PORT commands for each data transfer. This is useful for + certain FTP implementations which do ignore PORT commands + but, incorrectly, indicate they've been accepted. + + sseett [_o_p_t_i_o_n _v_a_l_u_e] + Set _o_p_t_i_o_n to _v_a_l_u_e. If _o_p_t_i_o_n and _v_a_l_u_e are not given, dis- + play all of the options and their values. The currently sup- + ported options are: + + anonpass Defaults to $FTPANONPASS + + ftp_proxy Defaults to $ftp_proxy. + + http_proxy Defaults to $http_proxy. + + no_proxy Defaults to $no_proxy. + + pager Defaults to $PAGER. + + prompt Defaults to $FTPPROMPT. + + rprompt Defaults to $FTPRPROMPT. + + ssiittee _a_r_g_1 _a_r_g_2 _._._. + The arguments specified are sent, verbatim, to the remote FTP + server as a SITE command. + + ssiizzee _r_e_m_o_t_e_-_f_i_l_e + Return size of _r_e_m_o_t_e_-_f_i_l_e on remote machine. + + ssnnddbbuuff _s_i_z_e + Set the size of the socket send buffer to _s_i_z_e. + + ssttaattuuss Show the current status of ffttpp. + + ssttrruucctt _s_t_r_u_c_t_-_n_a_m_e + Set the file transfer _s_t_r_u_c_t_u_r_e to _s_t_r_u_c_t_-_n_a_m_e. The default + (and only supported) structure is ``file''. + + ssuunniiqquuee Toggle storing of files on remote machine under unique file + names. The remote FTP server must support FTP protocol STOU + command for successful completion. The remote server will + report unique name. Default value is off. + + ssyysstteemm Show the type of operating system running on the remote ma- + chine. + + tteenneexx Set the file transfer type to that needed to talk to TENEX + machines. + + tthhrroottttllee A synonym for rraattee. + + ttrraaccee Toggle packet tracing. + + ttyyppee [_t_y_p_e_-_n_a_m_e] + Set the file transfer ttyyppee to _t_y_p_e_-_n_a_m_e. If no type is spec- + ified, the current type is printed. The default type is net- + work ASCII. + + uummaasskk [_n_e_w_m_a_s_k] + Set the default umask on the remote server to _n_e_w_m_a_s_k. If + _n_e_w_m_a_s_k is omitted, the current umask is printed. + + uunnsseett _o_p_t_i_o_n + Unset _o_p_t_i_o_n. Refer to sseett for more information. + + uussaaggee _c_o_m_m_a_n_d + Print the usage message for _c_o_m_m_a_n_d. + + uusseerr _u_s_e_r_-_n_a_m_e [_p_a_s_s_w_o_r_d [_a_c_c_o_u_n_t]] + Identify yourself to the remote FTP server. If the _p_a_s_s_w_o_r_d + is not specified and the server requires it, ffttpp will prompt + the user for it (after disabling local echo). If an _a_c_c_o_u_n_t + field is not specified, and the FTP server requires it, the + user will be prompted for it. If an _a_c_c_o_u_n_t field is speci- + fied, an account command will be relayed to the remote server + after the login sequence is completed if the remote server + did not require it for logging in. Unless ffttpp is invoked + with ``auto-login'' disabled, this process is done automati- + cally on initial connection to the FTP server. + + vveerrbboossee Toggle verbose mode. In verbose mode, all responses from the + FTP server are displayed to the user. In addition, if ver- + bose is on, when a file transfer completes, statistics re- + garding the efficiency of the transfer are reported. By de- + fault, verbose is on. + + xxffeerrbbuuff _s_i_z_e + Set the size of the socket send and receive buffers to _s_i_z_e. + + ?? [_c_o_m_m_a_n_d] + A synonym for hheellpp. + + Command arguments which have embedded spaces may be quoted with quote `"' + marks. + + Commands which toggle settings can take an explicit oonn or ooffff argument to + force the setting appropriately. + + Commands which take a byte count as an argument (e.g., hhaasshh, rraattee, and + xxffeerrbbuuff) support an optional suffix on the argument which changes the in- + terpretation of the argument. Supported suffixes are: + b Causes no modification. (Optional) + k Kilo; multiply the argument by 1024 + m Mega; multiply the argument by 1048576 + g Giga; multiply the argument by 1073741824 + + If ffttpp receives a SIGINFO (see the ``status'' argument of stty(1)) or + SIGQUIT signal whilst a transfer is in progress, the current transfer + rate statistics will be written to the standard error output, in the same + format as the standard completion message. + +AAUUTTOO--FFEETTCCHHIINNGG FFIILLEESS + In addition to standard commands, this version of ffttpp supports an auto- + fetch feature. To enable auto-fetch, simply pass the list of host- + names/files on the command line. + + The following formats are valid syntax for an auto-fetch element: + + [user@]host:[path][/] + ``Classic'' FTP format. + + If _p_a_t_h contains a glob character and globbing is enabled, (see + gglloobb), then the equivalent of `mget path' is performed. + + If the directory component of _p_a_t_h contains no globbing characters, + it is stored locally with the name basename (see basename(1)) of + ppaatthh, in the current directory. Otherwise, the full remote name is + used as the local name, relative to the local root directory. + + ftp://[user[:password]@]host[:port]/path[/][;type=X] + An FTP URL, retrieved using the FTP protocol if sseett ffttpp__pprrooxxyy isn't + defined. Otherwise, transfer the URL using HTTP via the proxy de- + fined in sseett ffttpp__pprrooxxyy. If sseett ffttpp__pprrooxxyy isn't defined and _u_s_e_r is + given, login as _u_s_e_r. In this case, use _p_a_s_s_w_o_r_d if supplied, oth- + erwise prompt the user for one. + + In order to be compliant with RRFFCC 11773388, ffttpp strips the leading `/' + from _p_a_t_h, resulting in a transfer relative from the default login + directory of the user. If the _/ directory is required, use a lead- + ing path of ``%2F''. If a user's home directory is required (and + the remote server supports the syntax), use a leading path of + ``%7Euser/''. For example, to retrieve _/_e_t_c_/_m_o_t_d from `localhost' + as the user `myname' with the password `mypass', use + ``ftp://myname:mypass@localhost/%2fetc/motd'' + + If a suffix of `;type=A' or `;type=I' is supplied, then the trans- + fer type will take place as ascii or binary (respectively). The + default transfer type is binary. + + http://[user[:password]@]host[:port]/path + An HTTP URL, retrieved using the HTTP protocol. If sseett hhttttpp__pprrooxxyy + is defined, it is used as a URL to an HTTP proxy server. If HTTP + authorisation is required to retrieve _p_a_t_h, and `user' (and option- + ally `password') is in the URL, use them for the first attempt to + authenticate. + + file:///path + A local URL, copied from _/_p_a_t_h. + + Unless noted otherwise above, and --oo _o_u_t_p_u_t is not given, the file is + stored in the current directory as the basename(1) of _p_a_t_h. + + If a classic format or an FTP URL format has a trailing `/' or an empty + _p_a_t_h component, then ffttpp will connect to the site and ccdd to the directory + given as the path, and leave the user in interactive mode ready for fur- + ther input. This will not work if sseett ffttpp__pprrooxxyy is being used. + + Direct HTTP transfers use HTTP 1.1. Proxied FTP and HTTP transfers use + HTTP 1.0. + + If --RR is given, all auto-fetches that don't go via the FTP or HTTP prox- + ies will be restarted. For FTP, this is implemented by using rreeggeett in- + stead of ggeett. For HTTP, this is implemented by using the `Range: bytes=' + HTTP/1.1 directive. + + If WWW or proxy WWW authentication is required, you will be prompted to + enter a username and password to authenticate with. + + When specifying IPv6 numeric addresses in a URL, you need to surround the + address in square brackets. E.g.: ``ftp://[::1]:21/''. This is because + colons are used in IPv6 numeric address as well as being the separator + for the port number. + +AABBOORRTTIINNGG AA FFIILLEE TTRRAANNSSFFEERR + To abort a file transfer, use the terminal interrupt key (usually Ctrl- + C). Sending transfers will be immediately halted. Receiving transfers + will be halted by sending an FTP protocol ABOR command to the remote + server, and discarding any further data received. The speed at which + this is accomplished depends upon the remote server's support for ABOR + processing. If the remote server does not support the ABOR command, the + prompt will not appear until the remote server has completed sending the + requested file. + + If the terminal interrupt key sequence is used whilst ffttpp is awaiting a + reply from the remote server for the ABOR processing, then the connection + will be closed. This is different from the traditional behaviour (which + ignores the terminal interrupt during this phase), but is considered more + useful. + +FFIILLEE NNAAMMIINNGG CCOONNVVEENNTTIIOONNSS + Files specified as arguments to ffttpp commands are processed according to + the following rules. + + 1. If the file name `--' is specified, the _s_t_d_i_n (for reading) or _s_t_d_o_u_t + (for writing) is used. + + 2. If the first character of the file name is `|', the remainder of the + argument is interpreted as a shell command. ffttpp then forks a shell, + using popen(3) with the argument supplied, and reads (writes) from + the stdout (stdin). If the shell command includes spaces, the argu- + ment must be quoted; e.g. ``"| ls -lt"''. A particularly useful + example of this mechanism is: ``dir "" |more''. + + 3. Failing the above checks, if ``globbing'' is enabled, local file + names are expanded according to the rules used in the csh(1); c.f. + the gglloobb command. If the ffttpp command expects a single local file + (e.g. ppuutt), only the first filename generated by the "globbing" op- + eration is used. + + 4. For mmggeett commands and ggeett commands with unspecified local file + names, the local filename is the remote filename, which may be al- + tered by a ccaassee, nnttrraannss, or nnmmaapp setting. The resulting filename + may then be altered if rruunniiqquuee is on. + + 5. For mmppuutt commands and ppuutt commands with unspecified remote file + names, the remote filename is the local filename, which may be al- + tered by a nnttrraannss or nnmmaapp setting. The resulting filename may then + be altered by the remote server if ssuunniiqquuee is on. + +FFIILLEE TTRRAANNSSFFEERR PPAARRAAMMEETTEERRSS + The FTP specification specifies many parameters which may affect a file + transfer. The ttyyppee may be one of ``ascii'', ``image'' (binary), + ``ebcdic'', and ``local byte size'' (for PDP-10's and PDP-20's mostly). + ffttpp supports the ascii and image types of file transfer, plus local byte + size 8 for tteenneexx mode transfers. + + ffttpp supports only the default values for the remaining file transfer pa- + rameters: mmooddee, ffoorrmm, and ssttrruucctt. + +TTHHEE ..nneettrrcc FFIILLEE + The _._n_e_t_r_c file contains login and initialization information used by the + auto-login process. It resides in the user's home directory, unless + overridden with the --NN _n_e_t_r_c option, or specified in the NETRC environ- + ment variable. The following tokens are recognized; they may be separat- + ed by spaces, tabs, or new-lines: + + mmaacchhiinnee _n_a_m_e + Identify a remote machine _n_a_m_e. The auto-login process search- + es the _._n_e_t_r_c file for a mmaacchhiinnee token that matches the remote + machine specified on the ffttpp command line or as an ooppeenn command + argument. Once a match is made, the subsequent _._n_e_t_r_c tokens + are processed, stopping when the end of file is reached or an- + other mmaacchhiinnee or a ddeeffaauulltt token is encountered. + + ddeeffaauulltt This is the same as mmaacchhiinnee _n_a_m_e except that ddeeffaauulltt matches + any name. There can be only one ddeeffaauulltt token, and it must be + after all mmaacchhiinnee tokens. This is normally used as: + + default login anonymous password user@site + + thereby giving the user an automatic anonymous FTP login to ma- + chines not specified in _._n_e_t_r_c. This can be overridden by us- + ing the --nn flag to disable auto-login. + + llooggiinn _n_a_m_e + Identify a user on the remote machine. If this token is pre- + sent, the auto-login process will initiate a login using the + specified _n_a_m_e. + + ppaasssswwoorrdd _s_t_r_i_n_g + Supply a password. If this token is present, the auto-login + process will supply the specified string if the remote server + requires a password as part of the login process. Note that if + this token is present in the _._n_e_t_r_c file for any user other + than _a_n_o_n_y_m_o_u_s, ffttpp will abort the auto-login process if the + _._n_e_t_r_c is readable by anyone besides the user. + + aaccccoouunntt _s_t_r_i_n_g + Supply an additional account password. If this token is pre- + sent, the auto-login process will supply the specified string + if the remote server requires an additional account password, + or the auto-login process will initiate an ACCT command if it + does not. + + mmaaccddeeff _n_a_m_e + Define a macro. This token functions like the ffttpp mmaaccddeeff com- + mand functions. A macro is defined with the specified name; + its contents begin with the next _._n_e_t_r_c line and continue until + a blank line (consecutive new-line characters) is encountered. + If a macro named iinniitt is defined, it is automatically executed + as the last step in the auto-login process. + +CCOOMMMMAANNDD LLIINNEE EEDDIITTIINNGG + ffttpp supports interactive command line editing, via the editline(3) li- + brary. It is enabled with the eeddiitt command, and is enabled by default if + input is from a tty. Previous lines can be recalled and edited with the + arrow keys, and other GNU Emacs-style editing keys may be used as well. + + The editline(3) library is configured with a _._e_d_i_t_r_c file - refer to + editrc(5) for more information. + + An extra key binding is available to ffttpp to provide context sensitive + command and filename completion (including remote file completion). To + use this, bind a key to the editline(3) command ffttpp--ccoommpplleettee. By de- + fault, this is bound to the TAB key. + +CCOOMMMMAANNDD LLIINNEE PPRROOMMPPTT + By default, ffttpp displays a command line prompt of ``ftp>'' to the user. + This can be changed with the sseett pprroommpptt command. + + A prompt can be displayed on the right side of the screen (after the com- + mand input) with the sseett rrpprroommpptt command. + + The following formatting sequences are replaced by the given information: + + %/ The current remote working directory. + + %c[[0]_n], %.[[0]_n] + The trailing component of the current remote working directo- + ry, or _n trailing components if a digit _n is given. If _n be- + gins with `0', the number of skipped components precede the + trailing component(s) in the format ``/_<_s_k_i_p_p_e_d_>trailing'' + (for `%c') or ``...trailing'' (for `%.'). + + %M The remote host name. + + %m The remote host name, up to the first `.'. + + %n The remote user name. + + %% A single `%'. + +EENNVVIIRROONNMMEENNTT + ffttpp uses the following environment variables. + + FTPANONPASS Password to send in an anonymous FTP transfer. Defaults + to ```whoami`@''. + + FTPMODE Overrides the default operation mode. Support values are: + + active active mode FTP only + + auto automatic determination of passive or active + (this is the default) + + gate gate-ftp mode + + passive passive mode FTP only + + FTPPROMPT Command-line prompt to use. Defaults to ``ftp>''. Refer + to _C_O_M_M_A_N_D _L_I_N_E _P_R_O_M_P_T for more information. + + FTPRPROMPT Command-line right side prompt to use. Defaults to ``''. + Refer to _C_O_M_M_A_N_D _L_I_N_E _P_R_O_M_P_T for more information. + + FTPSERVER Host to use as gate-ftp server when ggaattee is enabled. + + FTPSERVERPORT Port to use when connecting to gate-ftp server when ggaattee + is enabled. Default is port returned by a ggeettsseerrvvbbyynnaammee() + lookup of ``ftpgate/tcp''. + + HOME For default location of a _._n_e_t_r_c file, if one exists. + + NETRC An alternate location of the _._n_e_t_r_c file. + + PAGER Used by various commands to display files. Defaults to + more(1) if empty or not set. + + SHELL For default shell. + + ftp_proxy URL of FTP proxy to use when making FTP URL requests (if + not defined, use the standard FTP protocol). + + _N_O_T_E: this is not used for interactive sessions, only for + command-line fetches. + + http_proxy URL of HTTP proxy to use when making HTTP URL requests. + If proxy authentication is required and there is a user- + name and password in this URL, they will automatically be + used in the first attempt to authenticate to the proxy. + + Note that the use of a username and password in ftp_proxy + and http_proxy may be incompatible with other programs + that use it (such as lynx(1)). + + _N_O_T_E: this is not used for interactive sessions, only for + command-line fetches. + + no_proxy A space or comma separated list of hosts (or domains) for + which proxying is not to be used. Each entry may have an + optional trailing ":port", which restricts the matching to + connections to that port. + +SSEEEE AALLSSOO + getservbyname(3), editrc(5), services(5), ftpd(8) + +SSTTAANNDDAARRDDSS + ffttpp attempts to be compliant with RRFFCC 995599, RRFFCC 11112233, RRFFCC 11773388, RRFFCC 22006688, + RRFFCC 22338899, RRFFCC 22442288, RRFFCC 22773322, and ddrraafftt--iieettff--ffttppeexxtt--mmllsstt--1111. + +HHIISSTTOORRYY + The ffttpp command appeared in 4.2BSD. + + Various features such as command line editing, context sensitive command + and file completion, dynamic progress bar, automatic fetching of files + and URLs, modification time preservation, transfer rate throttling, con- + figurable command line prompt, and other enhancements over the standard + BSD ffttpp were implemented in NetBSD 1.3 and later releases by Luke Mewburn + <lukem@netbsd.org>. + + IPv6 support was added by the WIDE/KAME project (but may not be present + in all non-NetBSD versions of this program, depending if the operating + system supports IPv6 in a similar manner to KAME). + +BBUUGGSS + Correct execution of many commands depends upon proper behavior by the + remote server. + + An error in the treatment of carriage returns in the 4.2BSD ascii-mode + transfer code has been corrected. This correction may result in incor- + rect transfers of binary files to and from 4.2BSD servers using the ascii + type. Avoid this problem by using the binary image type. + + ffttpp assumes that all IPv4 mapped addresses (IPv6 addresses with a form + like ::ffff:10.1.1.1) indicate IPv4 destinations which can be handled by + AF_INET sockets. However, in certain IPv6 network configurations, this + assumption is not true. In such an environment, IPv4 mapped addresses + must be passed to AF_INET6 sockets directly. For example, if your site + uses a SIIT translator for IPv6-to-IPv4 translation, ffttpp is unable to + support your configuration. + +NetBSD 1.6_BETA1 May 18, 2002 16 diff --git a/contrib/lukemftp/src/ftp_var.h b/contrib/lukemftp/src/ftp_var.h index 2e4ed1c..e06076c 100644 --- a/contrib/lukemftp/src/ftp_var.h +++ b/contrib/lukemftp/src/ftp_var.h @@ -1,7 +1,7 @@ -/* $NetBSD: ftp_var.h,v 1.58 2000/08/01 22:47:28 lukem Exp $ */ +/* $NetBSD: ftp_var.h,v 1.62 2001/12/26 09:40:16 lukem Exp $ */ /*- - * Copyright (c) 1996-2000 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2001 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -308,7 +308,9 @@ GLOBAL int macnum; /* number of defined macros */ GLOBAL struct macel macros[16]; GLOBAL char macbuf[4096]; -GLOBAL char home[MAXPATHLEN]; /* home directory (for lcd) */ +GLOBAL char *localhome; /* local home directory */ +GLOBAL char *localname; /* local user name */ +GLOBAL char netrc[MAXPATHLEN]; /* path to .netrc file */ GLOBAL char reply_string[BUFSIZ]; /* first line of previous reply */ GLOBAL void (*reply_callback)(const char *); /* @@ -325,8 +327,6 @@ GLOBAL int data; extern struct cmd cmdtab[]; extern struct option optiontab[]; -extern char *__progname; /* from crt0.o */ - #define EMPTYSTRING(x) ((x) == NULL || (*(x) == '\0')) #define FREEPTR(x) if ((x) != NULL) { free(x); (x) = NULL; } @@ -344,6 +344,15 @@ extern char *__progname; /* from crt0.o */ # 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 @@ -352,3 +361,4 @@ extern char *__progname; /* from crt0.o */ # define ULLT unsigned long long # define STRTOLL(x,y,z) strtoll(x,y,z) #endif +#endif diff --git a/contrib/lukemftp/src/main.c b/contrib/lukemftp/src/main.c index 3fae56e..cc8dcfb 100644 --- a/contrib/lukemftp/src/main.c +++ b/contrib/lukemftp/src/main.c @@ -1,7 +1,7 @@ -/* $NetBSD: main.c,v 1.73 2000/07/18 07:16:56 lukem Exp $ */ +/* $NetBSD: main.c,v 1.82 2002/06/05 13:51:54 lukem Exp $ */ /*- - * Copyright (c) 1996-2000 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -112,8 +112,6 @@ #define NO_PROXY "no_proxy" /* env var with list of non-proxied * hosts, comma or space separated */ -char * __progname; - static void setupoption(char *, char *, char *); int main(int, char *[]); @@ -121,15 +119,14 @@ int main(int argc, char *argv[]) { int ch, rval; - struct passwd *pw = NULL; + struct passwd *pw; char *cp, *ep, *anonuser, *anonpass, *upload_path; int dumbterm, s, len, isupload; - __progname = strrchr(argv[0], '/'); - if (__progname == NULL) - __progname = argv[0]; - else - __progname++; +#if 0 /* XXX */ + setlocale(LC_ALL, ""); +#endif + setprogname(argv[0]); ftpport = "ftp"; httpport = "http"; @@ -173,6 +170,11 @@ main(int argc, char *argv[]) reply_callback = NULL; family = AF_UNSPEC; + netrc[0] = '\0'; + cp = getenv("NETRC"); + if (cp != NULL && strlcpy(netrc, cp, sizeof(netrc)) >= sizeof(netrc)) + errx(1, "$NETRC `%s': %s", cp, strerror(ENAMETOOLONG)); + /* * Get the default socket buffer sizes if we don't already have them. * It doesn't matter which socket we do this to, because on the first @@ -218,10 +220,10 @@ main(int argc, char *argv[]) warnx("unknown $FTPMODE '%s'; using defaults", cp); } - if (strcmp(__progname, "pftp") == 0) { + if (strcmp(getprogname(), "pftp") == 0) { passivemode = 1; activefallback = 0; - } else if (strcmp(__progname, "gate-ftp") == 0) + } else if (strcmp(getprogname(), "gate-ftp") == 0) gatemode = 1; gateserver = getenv("FTPSERVER"); @@ -256,14 +258,18 @@ main(int argc, char *argv[]) } } - while ((ch = getopt(argc, argv, "46Aadefgino:pP:r:RtT:u:vV")) != -1) { + while ((ch = getopt(argc, argv, "46AadefginN:o:pP:r:RtT:u:vV")) != -1) { switch (ch) { case '4': family = AF_INET; break; case '6': +#ifdef INET6 family = AF_INET6; +#else + warnx("INET6 support is not available; ignoring -6"); +#endif break; case 'A': @@ -302,6 +308,13 @@ main(int argc, char *argv[]) autologin = 0; break; + case 'N': + if (strlcpy(netrc, optarg, sizeof(netrc)) + >= sizeof(netrc)) + errx(1, "%s: %s", optarg, + strerror(ENAMETOOLONG)); + break; + case 'o': outfile = optarg; if (strcmp(outfile, "-") == 0) @@ -387,21 +400,38 @@ main(int argc, char *argv[]) proxy = 0; /* proxy not active */ crflag = 1; /* strip c.r. on ascii gets */ sendport = -1; /* not using ports */ + /* - * Set up the home directory in case we're globbing. + * Cache the user name and home directory. */ + localhome = NULL; + localname = NULL; + anonuser = "anonymous"; + cp = getenv("HOME"); + if (! EMPTYSTRING(cp)) + localhome = xstrdup(cp); + pw = NULL; cp = getlogin(); if (cp != NULL) pw = getpwnam(cp); if (pw == NULL) pw = getpwuid(getuid()); if (pw != NULL) { - (void)strlcpy(home, pw->pw_dir, sizeof(home)); - anonuser = pw->pw_name; - } else { - (void)strlcpy(home, "/", sizeof(home)); - anonuser = "anonymous"; + if (localhome == NULL && !EMPTYSTRING(pw->pw_dir)) + localhome = xstrdup(pw->pw_dir); + localname = xstrdup(pw->pw_name); + anonuser = localname; } + if (netrc[0] == '\0' && localhome != NULL) { + if (strlcpy(netrc, localhome, sizeof(netrc)) >= sizeof(netrc) || + strlcat(netrc, "/.netrc", sizeof(netrc)) >= sizeof(netrc)) { + warnx("%s/.netrc: %s", localhome, + strerror(ENAMETOOLONG)); + netrc[0] = '\0'; + } + } + if (localhome == NULL) + localhome = xstrdup("/"); /* * Every anonymous FTP server I've encountered will accept the @@ -467,7 +497,8 @@ main(int argc, char *argv[]) user = host; host = cp + 1; } - xargv[0] = __progname; + /* XXX discards const */ + xargv[0] = (char *)getprogname(); xargv[1] = host; xargv[2] = argv[1]; xargv[3] = NULL; @@ -633,7 +664,7 @@ cmdscanner(void) * such commands as invalid. */ if (strchr(margv[0], ':') != NULL || - el_parse(el, margc, margv) != 0) + el_parse(el, margc, (const char **)margv) != 0) #endif /* !NO_EDITCOMPLETE */ fputs("?Invalid command.\n", ttyout); continue; @@ -643,6 +674,7 @@ cmdscanner(void) continue; } confirmrest = 0; + margv[0] = c->c_name; (*c->c_handler)(margc, margv); if (bell && c->c_bell) (void)putc('\007', ttyout); @@ -908,7 +940,7 @@ help(int argc, char *argv[]) cmd, arg); else { if (isusage) { - nargv[0] = arg; + nargv[0] = c->c_name; (*c->c_handler)(0, nargv); } else fprintf(ttyout, "%-*s\t%s\n", HELPINDENT, @@ -964,11 +996,13 @@ setupoption(char *name, char *value, char *defaultvalue) void usage(void) { + const char *progname = getprogname(); + (void)fprintf(stderr, -"usage: %s [-46AadefginpRtvV] [-o outfile] [-P port] [-r retry]\n" +"usage: %s [-46AadefginpRtvV] [-N netrc] [-o outfile] [-P port] [-r retry]\n" " [-T dir,max[,inc][[user@]host [port]]] [host:path[/]]\n" " [file:///file] [ftp://[user[:pass]@]host[:port]/path[/]]\n" " [http://[user[:pass]@]host[:port]/path] [...]\n" -" %s -u url file [...]\n", __progname, __progname); +" %s -u url file [...]\n", progname, progname); exit(1); } diff --git a/contrib/lukemftp/src/ruserpass.c b/contrib/lukemftp/src/ruserpass.c index 1b2bf84..0eadfc8 100644 --- a/contrib/lukemftp/src/ruserpass.c +++ b/contrib/lukemftp/src/ruserpass.c @@ -1,4 +1,4 @@ -/* $NetBSD: ruserpass.c,v 1.27 2000/07/18 06:47:02 lukem Exp $ */ +/* $NetBSD: ruserpass.c,v 1.28 2000/11/15 00:11:04 lukem Exp $ */ /* * Copyright (c) 1985, 1993, 1994 @@ -66,25 +66,19 @@ static struct toktab { int ruserpass(const char *host, const char **aname, const char **apass, - const char **aacct) + const char **aacct) { - char *hdir, buf[BUFSIZ], *tmp; + char *tmp; char myname[MAXHOSTNAMELEN + 1], *mydomain; int t, i, c, usedefault = 0; struct stat stb; - hdir = getenv("HOME"); - if (hdir == NULL) - hdir = "."; - if (strlcpy(buf, hdir, sizeof(buf)) >= sizeof(buf) || - strlcat(buf, "/.netrc", sizeof(buf)) >= sizeof(buf)) { - warnx("%s/.netrc: %s", hdir, strerror(ENAMETOOLONG)); + if (netrc[0] == '\0') return (0); - } - cfile = fopen(buf, "r"); + cfile = fopen(netrc, "r"); if (cfile == NULL) { if (errno != ENOENT) - warn("%s", buf); + warn("%s", netrc); return (0); } if (gethostname(myname, sizeof(myname)) < 0) diff --git a/contrib/lukemftp/src/util.c b/contrib/lukemftp/src/util.c index d1ce226..aa4f73a 100644 --- a/contrib/lukemftp/src/util.c +++ b/contrib/lukemftp/src/util.c @@ -1,7 +1,7 @@ -/* $NetBSD: util.c,v 1.102 2000/09/08 11:54:53 lukem Exp $ */ +/* $NetBSD: util.c,v 1.107 2002/06/05 10:20:50 lukem Exp $ */ /*- - * Copyright (c) 1997-2000 The NetBSD Foundation, Inc. + * Copyright (c) 1997-2002 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -340,7 +340,6 @@ ftp_login(const char *host, const char *user, const char *pass) { char tmp[80]; const char *acct; - struct passwd *pw; int n, aflag, rval, freeuser, freepass, freeacct; acct = NULL; @@ -371,12 +370,8 @@ ftp_login(const char *host, const char *user, const char *pass) } while (user == NULL) { - const char *myname = getlogin(); - - if (myname == NULL && (pw = getpwuid(getuid())) != NULL) - myname = pw->pw_name; - if (myname) - fprintf(ttyout, "Name (%s:%s): ", host, myname); + if (localname) + fprintf(ttyout, "Name (%s:%s): ", host, localname); else fprintf(ttyout, "Name (%s): ", host); *tmp = '\0'; @@ -389,7 +384,7 @@ ftp_login(const char *host, const char *user, const char *pass) tmp[strlen(tmp) - 1] = '\0'; freeuser = 0; if (*tmp == '\0') - user = myname; + user = localname; else user = tmp; } @@ -502,7 +497,7 @@ remglob(char *argv[], int doswitch, char **errbuf) static char buf[MAXPATHLEN]; static FILE *ftemp = NULL; static char **args; - int oldverbose, oldhash, fd, len; + int oldverbose, oldhash, oldprogress, fd, len; char *cp, *mode; if (!mflag || !connected) { @@ -536,7 +531,9 @@ remglob(char *argv[], int doswitch, char **errbuf) oldverbose = verbose; verbose = (errbuf != NULL) ? -1 : 0; oldhash = hash; + oldprogress = progress; hash = 0; + progress = 0; if (doswitch) pswitch(!proxy); for (mode = "w"; *++argv != NULL; mode = "a") @@ -549,6 +546,7 @@ remglob(char *argv[], int doswitch, char **errbuf) pswitch(!proxy); verbose = oldverbose; hash = oldhash; + progress = oldprogress; ftemp = fopen(temp, "r"); (void)unlink(temp); if (ftemp == NULL) { @@ -872,9 +870,9 @@ progressmeter(int flag) lastsize = restart_point; } #ifndef NO_PROGRESS - len = 0; - if (!progress || filesize <= 0) + if (!progress) return; + len = 0; /* * print progress bar only if we are foreground process. @@ -891,20 +889,23 @@ progressmeter(int flag) wait.tv_sec = 0; } - ratio = (int)((double)cursize * 100.0 / (double)filesize); - ratio = MAX(ratio, 0); - ratio = MIN(ratio, 100); - len += snprintf(buf + len, BUFLEFT, "\r%3d%% ", ratio); + 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, ""); + 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; @@ -932,24 +933,39 @@ progressmeter(int flag) (int)((bytespersec % 1024) * 100 / 1024), prefixes[i]); - 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) + if (filesize > 0) { + if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) { len += snprintf(buf + len, BUFLEFT, " --:-- ETA"); - else { - i = remaining / SECSPERHOUR; + } else if (flag == 1) { + i = elapsed / SECSPERHOUR; if (i) len += snprintf(buf + len, BUFLEFT, "%2d:", i); else len += snprintf(buf + len, BUFLEFT, " "); - i = remaining % SECSPERHOUR; + i = (int)elapsed % SECSPERHOUR; len += snprintf(buf + len, BUFLEFT, - "%02d:%02d ETA", i / 60, i % 60); + "%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) @@ -1166,7 +1182,7 @@ controlediting(void) HistEvent ev; int editmode; - el = el_init(__progname, stdin, ttyout, stderr); + el = el_init(getprogname(), stdin, ttyout, stderr); /* init editline */ hist = history_init(); /* init the builtin history */ history(hist, &ev, H_SETSIZE, 100);/* remember 100 events */ diff --git a/contrib/lukemftp/src/version.h b/contrib/lukemftp/src/version.h index 91c9309..a47540d 100644 --- a/contrib/lukemftp/src/version.h +++ b/contrib/lukemftp/src/version.h @@ -1,6 +1,6 @@ -/* $NetBSD: version.h,v 1.21 2000/09/28 12:29:24 lukem Exp $ */ +/* $NetBSD: version.h,v 1.29 2002/06/05 10:20:51 lukem Exp $ */ /*- - * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc. + * Copyright (c) 1999-2002 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 "20000928" +#define FTP_VERSION "20020605" #endif |