This commit was generated by cvs2svn to compensate for changes in r142129,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
Mike Heffner 2005-02-20 17:33:34 +00:00
commit 7ffd9476ea
13 changed files with 669 additions and 518 deletions

View File

@ -1,6 +1,8 @@
# $NetBSD: Makefile,v 1.26 2003/01/21 16:08:06 jhawk Exp $
# $NetBSD: Makefile,v 1.30 2005/02/11 15:13:28 jmc Exp $
# from: @(#)Makefile 8.2 (Berkeley) 4/3/94
.include <bsd.own.mk>
PROG= ftp
SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c \
progressbar.c ruserpass.c util.c
@ -10,13 +12,13 @@ SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c \
#CPPFLAGS+=-DGATE_SERVER=\"ftp-gw.host\" # -DGATE_PORT=21
.if defined(SMALLPROG)
CPPFLAGS+=-DNO_EDITCOMPLETE -DNO_ABOUT
CPPFLAGS+=-DNO_EDITCOMPLETE -DNO_ABOUT -DNO_AUTH -DNO_HELP -DNO_STATUS
.else
LDADD+= -ledit -ltermcap
DPADD+= ${LIBEDIT} ${LIBTERMCAP}
.endif
.if !defined(SMALLPROG) || defined(SMALLPROG_INET6)
.if (!defined(SMALLPROG) || defined(SMALLPROG_INET6)) && (${USE_INET6} != "no")
CPPFLAGS+= -DINET6
.endif

View File

@ -1,7 +1,7 @@
/* $NetBSD: cmds.c,v 1.102 2003/08/07 11:13:52 agc Exp $ */
/* $NetBSD: cmds.c,v 1.111 2005/02/11 06:21:22 simonb Exp $ */
/*-
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -103,7 +103,7 @@
#if 0
static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94";
#else
__RCSID("$NetBSD: cmds.c,v 1.102 2003/08/07 11:13:52 agc Exp $");
__RCSID("$NetBSD: cmds.c,v 1.111 2005/02/11 06:21:22 simonb Exp $");
#endif
#endif /* not lint */
@ -147,10 +147,15 @@ struct types {
};
sigjmp_buf jabort;
char *mname;
const char *mname;
static int confirm(const char *, const char *);
static const char *doprocess(char *, size_t, const char *, int, int, int);
static const char *domap(char *, size_t, const char *);
static const char *docase(char *, size_t, const char *);
static const char *dotrans(char *, size_t, const char *);
static int
confirm(const char *cmd, const char *file)
{
@ -167,7 +172,7 @@ confirm(const char *cmd, const char *file)
clearerr(stdin);
return (0);
}
switch (tolower(*line)) {
switch (tolower((unsigned char)*line)) {
case 'a':
confirmrest = 1;
fprintf(ttyout,
@ -392,9 +397,11 @@ setstruct(int argc, char *argv[])
void
put(int argc, char *argv[])
{
char buf[MAXPATHLEN];
char *cmd;
int loc = 0;
char *locfile, *remfile;
char *locfile;
const char *remfile;
if (argc == 2) {
argc++;
@ -418,15 +425,26 @@ put(int argc, char *argv[])
if (loc) /* If argv[2] is a copy of the old argv[1], update it */
remfile = locfile;
cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR");
if (loc && ntflag)
remfile = dotrans(remfile);
if (loc && mapflag)
remfile = domap(remfile);
remfile = doprocess(buf, sizeof(buf), remfile,
0, loc && ntflag, loc && mapflag);
sendrequest(cmd, locfile, remfile,
locfile != argv[1] || remfile != argv[2]);
free(locfile);
}
static const char *
doprocess(char *dst, size_t dlen, const char *src,
int casef, int transf, int mapf)
{
if (casef)
src = docase(dst, dlen, src);
if (transf)
src = dotrans(dst, dlen, src);
if (mapf)
src = domap(dst, dlen, src);
return src;
}
/*
* Send multiple files.
*/
@ -436,7 +454,7 @@ mput(int argc, char *argv[])
int i;
sigfunc oldintr;
int ointer;
char *tp;
const char *tp;
if (argc == 0 || (argc == 1 && !another(&argc, &argv, "local-files"))) {
fprintf(ttyout, "usage: %s local-files\n", argv[0]);
@ -457,13 +475,9 @@ mput(int argc, char *argv[])
continue;
}
if (mflag && confirm(argv[0], cp)) {
tp = cp;
if (mcase)
tp = docase(tp);
if (ntflag)
tp = dotrans(tp);
if (mapflag)
tp = domap(tp);
char buf[MAXPATHLEN];
tp = doprocess(buf, sizeof(buf), cp,
mcase, ntflag, mapflag);
sendrequest((sunique) ? "STOU" : "STOR",
cp, tp, cp != tp || !interactive);
if (!mflag && fromatty) {
@ -485,8 +499,9 @@ mput(int argc, char *argv[])
if (!doglob) {
if (mflag && confirm(argv[0], argv[i])) {
tp = (ntflag) ? dotrans(argv[i]) : argv[i];
tp = (mapflag) ? domap(tp) : tp;
char buf[MAXPATHLEN];
tp = doprocess(buf, sizeof(buf), argv[i],
0, ntflag, mapflag);
sendrequest((sunique) ? "STOU" : "STOR",
argv[i], tp, tp != argv[i] || !interactive);
if (!mflag && fromatty) {
@ -511,8 +526,10 @@ mput(int argc, char *argv[])
for (cpp = gl.gl_pathv; cpp && *cpp != NULL && connected;
cpp++) {
if (mflag && confirm(argv[0], *cpp)) {
tp = (ntflag) ? dotrans(*cpp) : *cpp;
tp = (mapflag) ? domap(tp) : tp;
char buf[MAXPATHLEN];
tp = *cpp;
tp = doprocess(buf, sizeof(buf), *cpp,
0, ntflag, mapflag);
sendrequest((sunique) ? "STOU" : "STOR",
*cpp, tp, *cpp != tp || !interactive);
if (!mflag && fromatty) {
@ -555,7 +572,9 @@ int
getit(int argc, char *argv[], int restartit, const char *mode)
{
int loc, rval;
char *remfile, *locfile, *olocfile;
char *remfile, *olocfile;
const char *locfile;
char buf[MAXPATHLEN];
loc = rval = 0;
if (argc == 2) {
@ -577,13 +596,8 @@ getit(int argc, char *argv[], int restartit, const char *mode)
code = -1;
return (0);
}
locfile = olocfile;
if (loc && mcase)
locfile = docase(locfile);
if (loc && ntflag)
locfile = dotrans(locfile);
if (loc && mapflag)
locfile = domap(locfile);
locfile = doprocess(buf, sizeof(buf), olocfile,
loc && mcase, loc && ntflag, loc && mapflag);
if (restartit) {
struct stat stbuf;
int ret;
@ -663,7 +677,8 @@ mget(int argc, char *argv[])
{
sigfunc oldintr;
int ointer;
char *cp, *tp;
char *cp;
const char *tp;
int restartit;
if (argc == 0 ||
@ -688,19 +703,21 @@ mget(int argc, char *argv[])
if (sigsetjmp(jabort, 1))
mabort();
while ((cp = remglob(argv, proxy, NULL)) != NULL) {
char buf[MAXPATHLEN];
if (*cp == '\0' || !connected) {
mflag = 0;
continue;
}
if (! mflag || !confirm(argv[0], cp))
if (! mflag)
continue;
tp = cp;
if (mcase)
tp = docase(tp);
if (ntflag)
tp = dotrans(tp);
if (mapflag)
tp = domap(tp);
if (! fileindir(cp, localcwd)) {
fprintf(ttyout, "Skipping non-relative filename `%s'\n",
cp);
continue;
}
if (!confirm(argv[0], cp))
continue;
tp = doprocess(buf, sizeof(buf), cp, mcase, ntflag, mapflag);
if (restartit) {
struct stat stbuf;
@ -774,13 +791,13 @@ onoff(int bool)
void
status(int argc, char *argv[])
{
int i;
if (argc == 0) {
fprintf(ttyout, "usage: %s\n", argv[0]);
code = -1;
return;
}
#ifndef NO_STATUS
if (connected)
fprintf(ttyout, "Connected %sto %s.\n",
connected == -1 ? "and logged in" : "", hostname);
@ -844,13 +861,16 @@ status(int argc, char *argv[])
onoff(editing)
#endif /* !def NO_EDITCOMPLETE */
);
fprintf(ttyout, "Version: %s %s\n", FTP_PRODUCT, FTP_VERSION);
if (macnum > 0) {
int i;
fputs("Macros:\n", ttyout);
for (i=0; i<macnum; i++) {
fprintf(ttyout, "\t%s\n", macros[i].mac_name);
}
}
#endif /* !def NO_STATUS */
fprintf(ttyout, "Version: %s %s\n", FTP_PRODUCT, FTP_VERSION);
code = 0;
}
@ -1131,7 +1151,7 @@ cd(int argc, char *argv[])
}
if (r == COMPLETE) {
dirchange = 1;
updateremotepwd();
updateremotecwd();
}
}
@ -1141,7 +1161,6 @@ cd(int argc, char *argv[])
void
lcd(int argc, char *argv[])
{
char buf[MAXPATHLEN];
char *locdir;
code = -1;
@ -1155,14 +1174,16 @@ lcd(int argc, char *argv[])
}
if ((locdir = globulize(argv[1])) == NULL)
return;
if (chdir(locdir) < 0)
warn("local: %s", locdir);
if (chdir(locdir) == -1)
warn("lcd %s", locdir);
else {
if (getcwd(buf, sizeof(buf)) != NULL) {
fprintf(ttyout, "Local directory now %s\n", buf);
updatelocalcwd();
if (localcwd[0]) {
fprintf(ttyout, "Local directory now: %s\n", localcwd);
code = 0;
} else
warn("getcwd: %s", locdir);
} else {
fprintf(ttyout, "Unable to determine local directory\n");
}
}
(void)free(locdir);
}
@ -1174,7 +1195,6 @@ void
delete(int argc, char *argv[])
{
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "remote-file"))) {
fprintf(ttyout, "usage: %s remote-file\n", argv[0]);
@ -1323,6 +1343,7 @@ ls(int argc, char *argv[])
(void)strlcpy(locfile + 1, p, len - 1);
freelocfile = 1;
} else if ((strcmp(locfile, "-") != 0) && *locfile != '|') {
mname = argv[0];
if ((locfile = globulize(locfile)) == NULL ||
!confirm("output to local-file:", locfile)) {
code = -1;
@ -1359,6 +1380,7 @@ mls(int argc, char *argv[])
}
odest = dest = argv[argc - 1];
argv[argc - 1] = NULL;
mname = argv[0];
if (strcmp(dest, "-") && *dest != '|')
if (((dest = globulize(dest)) == NULL) ||
!confirm("output to local-file:", dest)) {
@ -1366,7 +1388,6 @@ mls(int argc, char *argv[])
return;
}
dolist = strcmp(argv[0], "mls");
mname = argv[0];
mflag = 1;
oldintr = xsignal(SIGINT, mintr);
if (sigsetjmp(jabort, 1))
@ -1379,7 +1400,7 @@ mls(int argc, char *argv[])
ointer = interactive;
interactive = 1;
if (confirm("Continue with", argv[0])) {
mflag ++;
mflag++;
}
interactive = ointer;
}
@ -1398,7 +1419,7 @@ void
shell(int argc, char *argv[])
{
pid_t pid;
sigfunc old1;
sigfunc oldintr;
char shellnam[MAXPATHLEN], *shell, *namep;
int wait_status;
@ -1407,7 +1428,7 @@ shell(int argc, char *argv[])
code = -1;
return;
}
old1 = xsignal(SIGINT, SIG_IGN);
oldintr = xsignal(SIGINT, SIG_IGN);
if ((pid = fork()) == 0) {
for (pid = 3; pid < 20; pid++)
(void)close(pid);
@ -1438,7 +1459,7 @@ shell(int argc, char *argv[])
if (pid > 0)
while (wait(&wait_status) != pid)
;
(void)xsignal(SIGINT, old1);
(void)xsignal(SIGINT, oldintr);
if (pid == -1) {
warn("Try again later");
code = -1;
@ -1509,19 +1530,20 @@ user(int argc, char *argv[])
void
pwd(int argc, char *argv[])
{
int oldverbose = verbose;
if (argc == 0) {
code = -1;
if (argc != 1) {
fprintf(ttyout, "usage: %s\n", argv[0]);
code = -1;
return;
}
verbose = 1; /* If we aren't verbose, this doesn't do anything! */
if (command("PWD") == ERROR && code == 500) {
fputs("PWD command not recognized, trying XPWD.\n", ttyout);
(void)command("XPWD");
if (! remotecwd[0])
updateremotecwd();
if (! remotecwd[0])
fprintf(ttyout, "Unable to determine remote directory\n");
else {
fprintf(ttyout, "Remote directory: %s\n", remotecwd);
code = 0;
}
verbose = oldverbose;
}
/*
@ -1530,19 +1552,19 @@ pwd(int argc, char *argv[])
void
lpwd(int argc, char *argv[])
{
char buf[MAXPATHLEN];
if (argc == 0) {
code = -1;
if (argc != 1) {
fprintf(ttyout, "usage: %s\n", argv[0]);
code = -1;
return;
}
if (getcwd(buf, sizeof(buf)) != NULL) {
fprintf(ttyout, "Local directory %s\n", buf);
if (! localcwd[0])
updatelocalcwd();
if (! localcwd[0])
fprintf(ttyout, "Unable to determine local directory\n");
else {
fprintf(ttyout, "Local directory: %s\n", localcwd);
code = 0;
} else {
warn("getcwd");
code = -1;
}
}
@ -1788,6 +1810,7 @@ void
proxabort(int notused)
{
sigint_raised = 1;
alarmtimer(0);
if (!proxy) {
pswitch(1);
@ -1869,26 +1892,25 @@ setcase(int argc, char *argv[])
* convert the given name to lower case if it's all upper case, into
* a static buffer which is returned to the caller
*/
char *
docase(char *name)
static const char *
docase(char *dst, size_t dlen, const char *src)
{
static char new[MAXPATHLEN];
int i, dochange;
size_t i;
int dochange = 1;
dochange = 1;
for (i = 0; name[i] != '\0' && i < sizeof(new) - 1; i++) {
new[i] = name[i];
if (islower((unsigned char)new[i]))
for (i = 0; src[i] != '\0' && i < dlen - 1; i++) {
dst[i] = src[i];
if (islower((unsigned char)dst[i]))
dochange = 0;
}
new[i] = '\0';
dst[i] = '\0';
if (dochange) {
for (i = 0; new[i] != '\0'; i++)
if (isupper((unsigned char)new[i]))
new[i] = tolower(new[i]);
for (i = 0; dst[i] != '\0'; i++)
if (isupper((unsigned char)dst[i]))
dst[i] = tolower((unsigned char)dst[i]);
}
return (new);
return dst;
}
void
@ -1923,22 +1945,24 @@ setntrans(int argc, char *argv[])
(void)strlcpy(ntout, argv[2], sizeof(ntout));
}
char *
dotrans(char *name)
static const char *
dotrans(char *dst, size_t dlen, const char *src)
{
static char new[MAXPATHLEN];
char *cp1, *cp2 = new;
int i, ostop, found;
const char *cp1;
char *cp2 = dst;
size_t i, ostop;
for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++)
continue;
for (cp1 = name; *cp1; cp1++) {
found = 0;
for (cp1 = src; *cp1; cp1++) {
int found = 0;
for (i = 0; *(ntin + i) && i < 16; i++) {
if (*cp1 == *(ntin + i)) {
found++;
if (i < ostop) {
*cp2++ = *(ntout + i);
if (cp2 - dst >= dlen - 1)
goto out;
}
break;
}
@ -1947,8 +1971,9 @@ dotrans(char *name)
*cp2++ = *cp1;
}
}
out:
*cp2 = '\0';
return (new);
return dst;
}
void
@ -1984,12 +2009,12 @@ setnmap(int argc, char *argv[])
(void)strlcpy(mapout, cp, MAXPATHLEN);
}
char *
domap(char *name)
static const char *
domap(char *dst, size_t dlen, const char *src)
{
static char new[MAXPATHLEN];
char *cp1 = name, *cp2 = mapin;
char *tp[9], *te[9];
const char *cp1 = src;
char *cp2 = mapin;
const char *tp[9], *te[9];
int i, toks[9], toknum = 0, match = 1;
for (i=0; i < 9; ++i) {
@ -2032,130 +2057,127 @@ domap(char *name)
{
toks[toknum] = 0;
}
cp1 = new;
*cp1 = '\0';
cp2 = mapout;
while (*cp2) {
cp2 = dst;
*cp2 = '\0';
cp1 = mapout;
while (*cp1) {
match = 0;
switch (*cp2) {
switch (*cp1) {
case '\\':
if (*(cp2 + 1)) {
*cp1++ = *++cp2;
if (*(cp1 + 1)) {
*cp2++ = *++cp1;
}
break;
case '[':
LOOP:
if (*++cp2 == '$' &&
isdigit((unsigned char)*(cp2+1))) {
if (*++cp2 == '0') {
char *cp3 = name;
if (*++cp1 == '$' &&
isdigit((unsigned char)*(cp1+1))) {
if (*++cp1 == '0') {
const char *cp3 = src;
while (*cp3) {
*cp1++ = *cp3++;
*cp2++ = *cp3++;
}
match = 1;
}
else if (toks[toknum = *cp2 - '1']) {
char *cp3 = tp[toknum];
else if (toks[toknum = *cp1 - '1']) {
const char *cp3 = tp[toknum];
while (cp3 != te[toknum]) {
*cp1++ = *cp3++;
*cp2++ = *cp3++;
}
match = 1;
}
}
else {
while (*cp2 && *cp2 != ',' &&
*cp2 != ']') {
if (*cp2 == '\\') {
cp2++;
while (*cp1 && *cp1 != ',' &&
*cp1 != ']') {
if (*cp1 == '\\') {
cp1++;
}
else if (*cp2 == '$' &&
isdigit((unsigned char)*(cp2+1))) {
if (*++cp2 == '0') {
char *cp3 = name;
else if (*cp1 == '$' &&
isdigit((unsigned char)*(cp1+1))) {
if (*++cp1 == '0') {
const char *cp3 = src;
while (*cp3) {
*cp1++ = *cp3++;
*cp2++ = *cp3++;
}
}
else if (toks[toknum =
*cp2 - '1']) {
char *cp3=tp[toknum];
*cp1 - '1']) {
const char *cp3=tp[toknum];
while (cp3 !=
te[toknum]) {
*cp1++ = *cp3++;
*cp2++ = *cp3++;
}
}
}
else if (*cp2) {
*cp1++ = *cp2++;
else if (*cp1) {
*cp2++ = *cp1++;
}
}
if (!*cp2) {
if (!*cp1) {
fputs(
"nmap: unbalanced brackets.\n",
ttyout);
return (name);
return (src);
}
match = 1;
cp2--;
cp1--;
}
if (match) {
while (*++cp2 && *cp2 != ']') {
if (*cp2 == '\\' && *(cp2 + 1)) {
cp2++;
while (*++cp1 && *cp1 != ']') {
if (*cp1 == '\\' && *(cp1 + 1)) {
cp1++;
}
}
if (!*cp2) {
if (!*cp1) {
fputs(
"nmap: unbalanced brackets.\n",
ttyout);
return (name);
return (src);
}
break;
}
switch (*++cp2) {
switch (*++cp1) {
case ',':
goto LOOP;
case ']':
break;
default:
cp2--;
cp1--;
goto LOOP;
}
break;
case '$':
if (isdigit((unsigned char)*(cp2 + 1))) {
if (*++cp2 == '0') {
char *cp3 = name;
if (isdigit((unsigned char)*(cp1 + 1))) {
if (*++cp1 == '0') {
const char *cp3 = src;
while (*cp3) {
*cp1++ = *cp3++;
*cp2++ = *cp3++;
}
}
else if (toks[toknum = *cp2 - '1']) {
char *cp3 = tp[toknum];
else if (toks[toknum = *cp1 - '1']) {
const char *cp3 = tp[toknum];
while (cp3 != te[toknum]) {
*cp1++ = *cp3++;
*cp2++ = *cp3++;
}
}
break;
}
/* intentional drop through */
default:
*cp1++ = *cp2;
*cp2++ = *cp1;
break;
}
cp2++;
cp1++;
}
*cp1 = '\0';
if (!*new) {
return (name);
}
return (new);
*cp2 = '\0';
return *dst ? dst : src;
}
void
@ -2307,7 +2329,7 @@ cdup(int argc, char *argv[])
}
if (r == COMPLETE) {
dirchange = 1;
updateremotepwd();
updateremotecwd();
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: cmdtab.c,v 1.41 2003/08/07 11:13:53 agc Exp $ */
/* $NetBSD: cmdtab.c,v 1.43 2004/07/15 08:50:10 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
@ -70,7 +70,7 @@
#if 0
static char sccsid[] = "@(#)cmdtab.c 8.4 (Berkeley) 10/9/94";
#else
__RCSID("$NetBSD: cmdtab.c,v 1.41 2003/08/07 11:13:53 agc Exp $");
__RCSID("$NetBSD: cmdtab.c,v 1.43 2004/07/15 08:50:10 lukem Exp $");
#endif
#endif /* not lint */
@ -81,207 +81,219 @@ __RCSID("$NetBSD: cmdtab.c,v 1.41 2003/08/07 11:13:53 agc Exp $");
* User FTP -- Command Tables.
*/
char accounthelp[] = "send account command to remote server";
char appendhelp[] = "append to a file";
char asciihelp[] = "set ascii transfer type";
char beephelp[] = "beep when command completed";
char binaryhelp[] = "set binary transfer type";
char casehelp[] = "toggle mget upper/lower case id mapping";
char cdhelp[] = "change remote working directory";
char cduphelp[] = "change remote working directory to parent directory";
char chmodhelp[] = "change file permissions of remote file";
char connecthelp[] = "connect to remote ftp server";
char crhelp[] = "toggle carriage return stripping on ascii gets";
char debughelp[] = "toggle/set debugging mode";
char deletehelp[] = "delete remote file";
char disconhelp[] = "terminate ftp session";
char domachelp[] = "execute macro";
char edithelp[] = "toggle command line editing";
char epsv4help[] = "toggle use of EPSV/EPRT on IPv4 ftp";
char feathelp[] = "show FEATures supported by remote system";
char formhelp[] = "set file transfer format";
char gatehelp[] = "toggle gate-ftp; specify host[:port] to change proxy";
char globhelp[] = "toggle metacharacter expansion of local file names";
char hashhelp[] = "toggle printing `#' marks; specify number to set size";
char helphelp[] = "print local help information";
char idlehelp[] = "get (set) idle timer on remote side";
char lcdhelp[] = "change local working directory";
char lpagehelp[] = "view a local file through your pager";
char lpwdhelp[] = "print local working directory";
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";
char mlsdhelp[] = "list contents of remote directory in a machine "
#define HSTR static const char
#ifndef NO_HELP
HSTR accounthelp[] = "send account command to remote server";
HSTR appendhelp[] = "append to a file";
HSTR asciihelp[] = "set ascii transfer type";
HSTR beephelp[] = "beep when command completed";
HSTR binaryhelp[] = "set binary transfer type";
HSTR casehelp[] = "toggle mget upper/lower case id mapping";
HSTR cdhelp[] = "change remote working directory";
HSTR cduphelp[] = "change remote working directory to parent directory";
HSTR chmodhelp[] = "change file permissions of remote file";
HSTR connecthelp[] = "connect to remote ftp server";
HSTR crhelp[] = "toggle carriage return stripping on ascii gets";
HSTR debughelp[] = "toggle/set debugging mode";
HSTR deletehelp[] = "delete remote file";
HSTR disconhelp[] = "terminate ftp session";
HSTR domachelp[] = "execute macro";
HSTR edithelp[] = "toggle command line editing";
HSTR epsv4help[] = "toggle use of EPSV/EPRT on IPv4 ftp";
HSTR feathelp[] = "show FEATures supported by remote system";
HSTR formhelp[] = "set file transfer format";
HSTR gatehelp[] = "toggle gate-ftp; specify host[:port] to change proxy";
HSTR globhelp[] = "toggle metacharacter expansion of local file names";
HSTR hashhelp[] = "toggle printing `#' marks; specify number to set size";
HSTR helphelp[] = "print local help information";
HSTR idlehelp[] = "get (set) idle timer on remote side";
HSTR lcdhelp[] = "change local working directory";
HSTR lpagehelp[] = "view a local file through your pager";
HSTR lpwdhelp[] = "print local working directory";
HSTR lshelp[] = "list contents of remote path";
HSTR macdefhelp[] = "define a macro";
HSTR mdeletehelp[] = "delete multiple files";
HSTR mgethelp[] = "get multiple files";
HSTR mregethelp[] = "get multiple files restarting at end of local file";
HSTR fgethelp[] = "get files using a localfile as a source of names";
HSTR mkdirhelp[] = "make directory on the remote machine";
HSTR mlshelp[] = "list contents of multiple remote directories";
HSTR mlsdhelp[] = "list contents of remote directory in a machine "
"parsable form";
char mlsthelp[] = "list remote path in a machine parsable form";
char modehelp[] = "set file transfer mode";
char modtimehelp[] = "show last modification time of remote file";
char mputhelp[] = "send multiple files";
char newerhelp[] = "get file if remote file is newer than local file ";
char nmaphelp[] = "set templates for default file name mapping";
char ntranshelp[] = "set translation table for default file name mapping";
char optshelp[] = "show or set options for remote commands";
char pagehelp[] = "view a remote file through your pager";
char passivehelp[] = "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 "
HSTR mlsthelp[] = "list remote path in a machine parsable form";
HSTR modehelp[] = "set file transfer mode";
HSTR modtimehelp[] = "show last modification time of remote file";
HSTR mputhelp[] = "send multiple files";
HSTR newerhelp[] = "get file if remote file is newer than local file ";
HSTR nmaphelp[] = "set templates for default file name mapping";
HSTR ntranshelp[] = "set translation table for default file name mapping";
HSTR optshelp[] = "show or set options for remote commands";
HSTR pagehelp[] = "view a remote file through your pager";
HSTR passivehelp[] = "toggle use of passive transfer mode";
HSTR plshelp[] = "list contents of remote path through your pager";
HSTR pmlsdhelp[] = "list contents of remote directory in a machine "
"parsable form through your pager";
char porthelp[] = "toggle use of PORT/LPRT cmd for each data connection";
char preservehelp[] ="toggle preservation of modification time of "
HSTR porthelp[] = "toggle use of PORT/LPRT cmd for each data connection";
HSTR preservehelp[] ="toggle preservation of modification time of "
"retrieved files";
char progresshelp[] ="toggle transfer progress meter";
char prompthelp[] = "force interactive prompting on multiple commands";
char proxyhelp[] = "issue command on alternate connection";
char pwdhelp[] = "print working directory on remote machine";
char quithelp[] = "terminate ftp session and exit";
char quotehelp[] = "send arbitrary ftp command";
char ratehelp[] = "set transfer rate limit (in bytes/second)";
char receivehelp[] = "receive file";
char regethelp[] = "get file restarting at end of local file";
char remotehelp[] = "get help from remote server";
char renamehelp[] = "rename file";
char resethelp[] = "clear queued command replies";
char restarthelp[]= "restart file transfer at bytecount";
char rmdirhelp[] = "remove directory on the remote machine";
char rmtstatushelp[]="show status of remote machine";
char runiquehelp[] = "toggle store unique for local files";
char sendhelp[] = "send one file";
char sethelp[] = "set or display options";
char shellhelp[] = "escape to the shell";
char sitehelp[] = "send site specific command to remote server\n"
HSTR progresshelp[] ="toggle transfer progress meter";
HSTR prompthelp[] = "force interactive prompting on multiple commands";
HSTR proxyhelp[] = "issue command on alternate connection";
HSTR pwdhelp[] = "print working directory on remote machine";
HSTR quithelp[] = "terminate ftp session and exit";
HSTR quotehelp[] = "send arbitrary ftp command";
HSTR ratehelp[] = "set transfer rate limit (in bytes/second)";
HSTR receivehelp[] = "receive file";
HSTR regethelp[] = "get file restarting at end of local file";
HSTR remotehelp[] = "get help from remote server";
HSTR renamehelp[] = "rename file";
HSTR resethelp[] = "clear queued command replies";
HSTR restarthelp[]= "restart file transfer at bytecount";
HSTR rmdirhelp[] = "remove directory on the remote machine";
HSTR rmtstatushelp[]="show status of remote machine";
HSTR runiquehelp[] = "toggle store unique for local files";
HSTR sendhelp[] = "send one file";
HSTR sethelp[] = "set or display options";
HSTR shellhelp[] = "escape to the shell";
HSTR sitehelp[] = "send site specific command to remote server\n"
"\t\tTry \"rhelp site\" or \"site help\" "
"for more information";
char sizecmdhelp[] = "show size of remote file";
char statushelp[] = "show current status";
char structhelp[] = "set file transfer structure";
char suniquehelp[] = "toggle store unique on remote machine";
char systemhelp[] = "show remote system type";
char tenexhelp[] = "set tenex file transfer type";
char tracehelp[] = "toggle packet tracing";
char typehelp[] = "set file transfer type";
char umaskhelp[] = "get (set) umask on remote side";
char unsethelp[] = "unset an option";
char usagehelp[] = "show command usage";
char userhelp[] = "send new user information";
char verbosehelp[] = "toggle verbose mode";
char xferbufhelp[] = "set socket send/receive buffer size";
HSTR sizecmdhelp[] = "show size of remote file";
HSTR statushelp[] = "show current status";
HSTR structhelp[] = "set file transfer structure";
HSTR suniquehelp[] = "toggle store unique on remote machine";
HSTR systemhelp[] = "show remote system type";
HSTR tenexhelp[] = "set tenex file transfer type";
HSTR tracehelp[] = "toggle packet tracing";
HSTR typehelp[] = "set file transfer type";
HSTR umaskhelp[] = "get (set) umask on remote side";
HSTR unsethelp[] = "unset an option";
HSTR usagehelp[] = "show command usage";
HSTR userhelp[] = "send new user information";
HSTR verbosehelp[] = "toggle verbose mode";
HSTR xferbufhelp[] = "set socket send/receive buffer size";
#endif
HSTR empty[] = "";
#ifdef NO_HELP
#define H(x) empty
#else
#define H(x) x
#endif
#ifdef NO_EDITCOMPLETE
#define CMPL(x)
#define CMPL0
#else /* !NO_EDITCOMPLETE */
#define CMPL(x) #x,
#define CMPL0 "",
#define CMPL0 empty,
#endif /* !NO_EDITCOMPLETE */
struct cmd cmdtab[] = {
{ "!", shellhelp, 0, 0, 0, CMPL0 shell },
{ "$", domachelp, 1, 0, 0, CMPL0 domacro },
{ "account", accounthelp, 0, 1, 1, CMPL0 account},
{ "append", appendhelp, 1, 1, 1, CMPL(lr) put },
{ "ascii", asciihelp, 0, 1, 1, CMPL0 setascii },
{ "bell", beephelp, 0, 0, 0, CMPL0 setbell },
{ "binary", binaryhelp, 0, 1, 1, CMPL0 setbinary },
{ "bye", quithelp, 0, 0, 0, CMPL0 quit },
{ "case", casehelp, 0, 0, 1, CMPL0 setcase },
{ "cd", cdhelp, 0, 1, 1, CMPL(r) cd },
{ "cdup", cduphelp, 0, 1, 1, CMPL0 cdup },
{ "chmod", chmodhelp, 0, 1, 1, CMPL(nr) do_chmod },
{ "close", disconhelp, 0, 1, 1, CMPL0 disconnect },
{ "cr", crhelp, 0, 0, 0, CMPL0 setcr },
{ "debug", debughelp, 0, 0, 0, CMPL0 setdebug },
{ "delete", deletehelp, 0, 1, 1, CMPL(r) delete },
{ "dir", lshelp, 1, 1, 1, CMPL(rl) ls },
{ "disconnect", disconhelp, 0, 1, 1, CMPL0 disconnect },
{ "edit", edithelp, 0, 0, 0, CMPL0 setedit },
{ "epsv4", epsv4help, 0, 0, 0, CMPL0 setepsv4 },
{ "exit", quithelp, 0, 0, 0, CMPL0 quit },
{ "features", feathelp, 0, 1, 1, CMPL0 feat },
{ "fget", fgethelp, 1, 1, 1, CMPL(l) fget },
{ "form", formhelp, 0, 1, 1, CMPL0 setform },
{ "ftp", connecthelp, 0, 0, 1, CMPL0 setpeer },
{ "gate", gatehelp, 0, 0, 0, CMPL0 setgate },
{ "get", receivehelp, 1, 1, 1, CMPL(rl) get },
{ "glob", globhelp, 0, 0, 0, CMPL0 setglob },
{ "hash", hashhelp, 0, 0, 0, CMPL0 sethash },
{ "help", helphelp, 0, 0, 1, CMPL(C) help },
{ "idle", idlehelp, 0, 1, 1, CMPL0 idlecmd },
{ "image", binaryhelp, 0, 1, 1, CMPL0 setbinary },
{ "lcd", lcdhelp, 0, 0, 0, CMPL(l) lcd },
{ "less", pagehelp, 1, 1, 1, CMPL(r) page },
{ "lpage", lpagehelp, 0, 0, 0, CMPL(l) lpage },
{ "lpwd", lpwdhelp, 0, 0, 0, CMPL0 lpwd },
{ "ls", lshelp, 1, 1, 1, CMPL(rl) ls },
{ "macdef", macdefhelp, 0, 0, 0, CMPL0 macdef },
{ "mdelete", mdeletehelp, 1, 1, 1, CMPL(R) mdelete },
{ "mdir", mlshelp, 1, 1, 1, CMPL(R) mls },
{ "mget", mgethelp, 1, 1, 1, CMPL(R) mget },
{ "mkdir", mkdirhelp, 0, 1, 1, CMPL(r) makedir },
{ "mls", mlshelp, 1, 1, 1, CMPL(R) mls },
{ "mlsd", mlsdhelp, 1, 1, 1, CMPL(r) ls },
{ "mlst", mlsthelp, 1, 1, 1, CMPL(r) mlst },
{ "mode", modehelp, 0, 1, 1, CMPL0 setftmode },
{ "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 },
{ "nmap", nmaphelp, 0, 0, 1, CMPL0 setnmap },
{ "ntrans", ntranshelp, 0, 0, 1, CMPL0 setntrans },
{ "open", connecthelp, 0, 0, 1, CMPL0 setpeer },
{ "page", pagehelp, 1, 1, 1, CMPL(r) page },
{ "passive", passivehelp, 0, 0, 0, CMPL0 setpassive },
{ "pdir", plshelp, 1, 1, 1, CMPL(r) ls },
{ "pls", plshelp, 1, 1, 1, CMPL(r) ls },
{ "pmlsd", pmlsdhelp, 1, 1, 1, CMPL(r) ls },
{ "preserve", preservehelp, 0, 0, 0, CMPL0 setpreserve },
{ "progress", progresshelp, 0, 0, 0, CMPL0 setprogress },
{ "prompt", prompthelp, 0, 0, 0, CMPL0 setprompt },
{ "proxy", proxyhelp, 0, 0, 1, CMPL(c) doproxy },
{ "put", sendhelp, 1, 1, 1, CMPL(lr) put },
{ "pwd", pwdhelp, 0, 1, 1, CMPL0 pwd },
{ "quit", quithelp, 0, 0, 0, CMPL0 quit },
{ "quote", quotehelp, 1, 1, 1, CMPL0 quote },
{ "rate", ratehelp, 0, 0, 0, CMPL0 setrate },
{ "rcvbuf", xferbufhelp, 0, 0, 0, CMPL0 setxferbuf },
{ "recv", receivehelp, 1, 1, 1, CMPL(rl) get },
{ "reget", regethelp, 1, 1, 1, CMPL(rl) reget },
{ "remopts", optshelp, 0, 1, 1, CMPL0 opts },
{ "rename", renamehelp, 0, 1, 1, CMPL(rr) renamefile },
{ "reset", resethelp, 0, 1, 1, CMPL0 reset },
{ "restart", restarthelp, 1, 1, 1, CMPL0 restart },
{ "rhelp", remotehelp, 0, 1, 1, CMPL0 rmthelp },
{ "rmdir", rmdirhelp, 0, 1, 1, CMPL(r) removedir },
{ "rstatus", rmtstatushelp, 0, 1, 1, CMPL(r) rmtstatus },
{ "runique", runiquehelp, 0, 0, 1, CMPL0 setrunique },
{ "send", sendhelp, 1, 1, 1, CMPL(lr) put },
{ "sendport", porthelp, 0, 0, 0, CMPL0 setport },
{ "set", sethelp, 0, 0, 0, CMPL(o) setoption },
{ "site", sitehelp, 0, 1, 1, CMPL0 site },
{ "size", sizecmdhelp, 1, 1, 1, CMPL(r) sizecmd },
{ "sndbuf", xferbufhelp, 0, 0, 0, CMPL0 setxferbuf },
{ "status", statushelp, 0, 0, 1, CMPL0 status },
{ "struct", structhelp, 0, 1, 1, CMPL0 setstruct },
{ "sunique", suniquehelp, 0, 0, 1, CMPL0 setsunique },
{ "system", systemhelp, 0, 1, 1, CMPL0 syst },
{ "tenex", tenexhelp, 0, 1, 1, CMPL0 settenex },
{ "throttle", ratehelp, 0, 0, 0, CMPL0 setrate },
{ "trace", tracehelp, 0, 0, 0, CMPL0 settrace },
{ "type", typehelp, 0, 1, 1, CMPL0 settype },
{ "umask", umaskhelp, 0, 1, 1, CMPL0 do_umask },
{ "unset", unsethelp, 0, 0, 0, CMPL(o) unsetoption },
{ "usage", usagehelp, 0, 0, 1, CMPL(C) help },
{ "user", userhelp, 0, 1, 1, CMPL0 user },
{ "verbose", verbosehelp, 0, 0, 0, CMPL0 setverbose },
{ "xferbuf", xferbufhelp, 0, 0, 0, CMPL0 setxferbuf },
{ "?", helphelp, 0, 0, 1, CMPL(C) help },
{ "!", H(shellhelp), 0, 0, 0, CMPL0 shell },
{ "$", H(domachelp), 1, 0, 0, CMPL0 domacro },
{ "account", H(accounthelp), 0, 1, 1, CMPL0 account},
{ "append", H(appendhelp), 1, 1, 1, CMPL(lr) put },
{ "ascii", H(asciihelp), 0, 1, 1, CMPL0 setascii },
{ "bell", H(beephelp), 0, 0, 0, CMPL0 setbell },
{ "binary", H(binaryhelp), 0, 1, 1, CMPL0 setbinary },
{ "bye", H(quithelp), 0, 0, 0, CMPL0 quit },
{ "case", H(casehelp), 0, 0, 1, CMPL0 setcase },
{ "cd", H(cdhelp), 0, 1, 1, CMPL(r) cd },
{ "cdup", H(cduphelp), 0, 1, 1, CMPL0 cdup },
{ "chmod", H(chmodhelp), 0, 1, 1, CMPL(nr) do_chmod },
{ "close", H(disconhelp), 0, 1, 1, CMPL0 disconnect },
{ "cr", H(crhelp), 0, 0, 0, CMPL0 setcr },
{ "debug", H(debughelp), 0, 0, 0, CMPL0 setdebug },
{ "delete", H(deletehelp), 0, 1, 1, CMPL(r) delete },
{ "dir", H(lshelp), 1, 1, 1, CMPL(rl) ls },
{ "disconnect", H(disconhelp), 0, 1, 1, CMPL0 disconnect },
{ "edit", H(edithelp), 0, 0, 0, CMPL0 setedit },
{ "epsv4", H(epsv4help), 0, 0, 0, CMPL0 setepsv4 },
{ "exit", H(quithelp), 0, 0, 0, CMPL0 quit },
{ "features", H(feathelp), 0, 1, 1, CMPL0 feat },
{ "fget", H(fgethelp), 1, 1, 1, CMPL(l) fget },
{ "form", H(formhelp), 0, 1, 1, CMPL0 setform },
{ "ftp", H(connecthelp), 0, 0, 1, CMPL0 setpeer },
{ "gate", H(gatehelp), 0, 0, 0, CMPL0 setgate },
{ "get", H(receivehelp), 1, 1, 1, CMPL(rl) get },
{ "glob", H(globhelp), 0, 0, 0, CMPL0 setglob },
{ "hash", H(hashhelp), 0, 0, 0, CMPL0 sethash },
{ "help", H(helphelp), 0, 0, 1, CMPL(C) help },
{ "idle", H(idlehelp), 0, 1, 1, CMPL0 idlecmd },
{ "image", H(binaryhelp), 0, 1, 1, CMPL0 setbinary },
{ "lcd", H(lcdhelp), 0, 0, 0, CMPL(l) lcd },
{ "less", H(pagehelp), 1, 1, 1, CMPL(r) page },
{ "lpage", H(lpagehelp), 0, 0, 0, CMPL(l) lpage },
{ "lpwd", H(lpwdhelp), 0, 0, 0, CMPL0 lpwd },
{ "ls", H(lshelp), 1, 1, 1, CMPL(rl) ls },
{ "macdef", H(macdefhelp), 0, 0, 0, CMPL0 macdef },
{ "mdelete", H(mdeletehelp), 1, 1, 1, CMPL(R) mdelete },
{ "mdir", H(mlshelp), 1, 1, 1, CMPL(R) mls },
{ "mget", H(mgethelp), 1, 1, 1, CMPL(R) mget },
{ "mkdir", H(mkdirhelp), 0, 1, 1, CMPL(r) makedir },
{ "mls", H(mlshelp), 1, 1, 1, CMPL(R) mls },
{ "mlsd", H(mlsdhelp), 1, 1, 1, CMPL(r) ls },
{ "mlst", H(mlsthelp), 1, 1, 1, CMPL(r) mlst },
{ "mode", H(modehelp), 0, 1, 1, CMPL0 setftmode },
{ "modtime", H(modtimehelp), 0, 1, 1, CMPL(r) modtime },
{ "more", H(pagehelp), 1, 1, 1, CMPL(r) page },
{ "mput", H(mputhelp), 1, 1, 1, CMPL(L) mput },
{ "mreget", H(mregethelp), 1, 1, 1, CMPL(R) mget },
{ "msend", H(mputhelp), 1, 1, 1, CMPL(L) mput },
{ "newer", H(newerhelp), 1, 1, 1, CMPL(r) newer },
{ "nlist", H(lshelp), 1, 1, 1, CMPL(rl) ls },
{ "nmap", H(nmaphelp), 0, 0, 1, CMPL0 setnmap },
{ "ntrans", H(ntranshelp), 0, 0, 1, CMPL0 setntrans },
{ "open", H(connecthelp), 0, 0, 1, CMPL0 setpeer },
{ "page", H(pagehelp), 1, 1, 1, CMPL(r) page },
{ "passive", H(passivehelp), 0, 0, 0, CMPL0 setpassive },
{ "pdir", H(plshelp), 1, 1, 1, CMPL(r) ls },
{ "pls", H(plshelp), 1, 1, 1, CMPL(r) ls },
{ "pmlsd", H(pmlsdhelp), 1, 1, 1, CMPL(r) ls },
{ "preserve", H(preservehelp),0, 0, 0, CMPL0 setpreserve },
{ "progress", H(progresshelp),0, 0, 0, CMPL0 setprogress },
{ "prompt", H(prompthelp), 0, 0, 0, CMPL0 setprompt },
{ "proxy", H(proxyhelp), 0, 0, 1, CMPL(c) doproxy },
{ "put", H(sendhelp), 1, 1, 1, CMPL(lr) put },
{ "pwd", H(pwdhelp), 0, 1, 1, CMPL0 pwd },
{ "quit", H(quithelp), 0, 0, 0, CMPL0 quit },
{ "quote", H(quotehelp), 1, 1, 1, CMPL0 quote },
{ "rate", H(ratehelp), 0, 0, 0, CMPL0 setrate },
{ "rcvbuf", H(xferbufhelp), 0, 0, 0, CMPL0 setxferbuf },
{ "recv", H(receivehelp), 1, 1, 1, CMPL(rl) get },
{ "reget", H(regethelp), 1, 1, 1, CMPL(rl) reget },
{ "remopts", H(optshelp), 0, 1, 1, CMPL0 opts },
{ "rename", H(renamehelp), 0, 1, 1, CMPL(rr) renamefile },
{ "reset", H(resethelp), 0, 1, 1, CMPL0 reset },
{ "restart", H(restarthelp), 1, 1, 1, CMPL0 restart },
{ "rhelp", H(remotehelp), 0, 1, 1, CMPL0 rmthelp },
{ "rmdir", H(rmdirhelp), 0, 1, 1, CMPL(r) removedir },
{ "rstatus", H(rmtstatushelp),0, 1, 1, CMPL(r) rmtstatus },
{ "runique", H(runiquehelp), 0, 0, 1, CMPL0 setrunique },
{ "send", H(sendhelp), 1, 1, 1, CMPL(lr) put },
{ "sendport", H(porthelp), 0, 0, 0, CMPL0 setport },
{ "set", H(sethelp), 0, 0, 0, CMPL(o) setoption },
{ "site", H(sitehelp), 0, 1, 1, CMPL0 site },
{ "size", H(sizecmdhelp), 1, 1, 1, CMPL(r) sizecmd },
{ "sndbuf", H(xferbufhelp), 0, 0, 0, CMPL0 setxferbuf },
{ "status", H(statushelp), 0, 0, 1, CMPL0 status },
{ "struct", H(structhelp), 0, 1, 1, CMPL0 setstruct },
{ "sunique", H(suniquehelp), 0, 0, 1, CMPL0 setsunique },
{ "system", H(systemhelp), 0, 1, 1, CMPL0 syst },
{ "tenex", H(tenexhelp), 0, 1, 1, CMPL0 settenex },
{ "throttle", H(ratehelp), 0, 0, 0, CMPL0 setrate },
{ "trace", H(tracehelp), 0, 0, 0, CMPL0 settrace },
{ "type", H(typehelp), 0, 1, 1, CMPL0 settype },
{ "umask", H(umaskhelp), 0, 1, 1, CMPL0 do_umask },
{ "unset", H(unsethelp), 0, 0, 0, CMPL(o) unsetoption },
{ "usage", H(usagehelp), 0, 0, 1, CMPL(C) help },
{ "user", H(userhelp), 0, 1, 1, CMPL0 user },
{ "verbose", H(verbosehelp), 0, 0, 0, CMPL0 setverbose },
{ "xferbuf", H(xferbufhelp), 0, 0, 0, CMPL0 setxferbuf },
{ "?", H(helphelp), 0, 0, 1, CMPL(C) help },
{ 0 },
};

View File

@ -1,7 +1,7 @@
/* $NetBSD: extern.h,v 1.62 2003/08/07 11:13:54 agc Exp $ */
/* $NetBSD: extern.h,v 1.64 2005/02/09 23:17:27 christos Exp $ */
/*-
* Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -129,13 +129,11 @@ void delete(int, char **);
void disconnect(int, char **);
void do_chmod(int, char **);
void do_umask(int, char **);
char *docase(char *);
void domacro(int, char **);
char *domap(char *);
void doproxy(int, char **);
char *dotrans(char *);
void feat(int, char **);
void fget(int, char **);
int fileindir(const char *, const char *);
int foregroundproc(void);
void formatbuf(char *, size_t, const char *);
void ftpvis(char *, size_t, const char *, size_t);
@ -246,7 +244,8 @@ int strsuftoi(const char *);
void syst(int, char **);
int togglevar(int, char **, int *, const char *);
void unsetoption(int, char **);
void updateremotepwd(void);
void updatelocalcwd(void);
void updateremotecwd(void);
void usage(void);
void user(int, char **);
int xconnect(int, const struct sockaddr *, int);

View File

@ -1,7 +1,7 @@
/* $NetBSD: fetch.c,v 1.146 2003/12/10 12:34:28 lukem Exp $ */
/* $NetBSD: fetch.c,v 1.155 2005/01/12 22:37:41 lukem Exp $ */
/*-
* Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
* Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -41,7 +41,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: fetch.c,v 1.146 2003/12/10 12:34:28 lukem Exp $");
__RCSID("$NetBSD: fetch.c,v 1.155 2005/01/12 22:37:41 lukem Exp $");
#endif /* not lint */
/*
@ -83,11 +83,14 @@ typedef enum {
} url_t;
void aborthttp(int);
#ifndef NO_AUTH
static int auth_url(const char *, char **, const char *, const char *);
static void base64_encode(const u_char *, size_t, u_char *);
static void base64_encode(const unsigned char *, size_t, unsigned char *);
#endif
static int go_fetch(const char *);
static int fetch_ftp(const char *);
static int fetch_url(const char *, const char *, char *, char *);
static const char *match_token(const char **, const char *);
static int parse_url(const char *, const char *, url_t *, char **,
char **, char **, char **, in_port_t *, char **);
static void url_decode(char *);
@ -95,12 +98,46 @@ static void url_decode(char *);
static int redirect_loop;
#define STRNEQUAL(a,b) (strncasecmp((a), (b), sizeof((b))-1) == 0)
#define ISLWS(x) ((x)=='\r' || (x)=='\n' || (x)==' ' || (x)=='\t')
#define SKIPLWS(x) do { while (ISLWS((*x))) x++; } while (0)
#define ABOUT_URL "about:" /* propaganda */
#define FILE_URL "file://" /* file URL prefix */
#define FTP_URL "ftp://" /* ftp URL prefix */
#define HTTP_URL "http://" /* http URL prefix */
/*
* Determine if token is the next word in buf (case insensitive).
* If so, advance buf past the token and any trailing LWS, and
* return a pointer to the token (in buf). Otherwise, return NULL.
* token may be preceeded by LWS.
* token must be followed by LWS or NUL. (I.e, don't partial match).
*/
static const char *
match_token(const char **buf, const char *token)
{
const char *p, *orig;
size_t tlen;
tlen = strlen(token);
p = *buf;
SKIPLWS(p);
orig = p;
if (strncasecmp(p, token, tlen) != 0)
return NULL;
p += tlen;
if (*p != '\0' && !ISLWS(*p))
return NULL;
SKIPLWS(p);
orig = *buf;
*buf = p;
return orig;
}
#ifndef NO_AUTH
/*
* Generate authorization response based on given authentication challenge.
* Returns -1 if an error occurred, otherwise 0.
@ -110,52 +147,52 @@ static int
auth_url(const char *challenge, char **response, const char *guser,
const char *gpass)
{
char *cp, *ep, *clear, *line, *realm, *scheme;
const char *cp, *scheme;
char *ep, *clear, *realm;
char user[BUFSIZ], *pass;
int rval;
size_t len, clen, rlen;
*response = NULL;
clear = realm = scheme = NULL;
clear = realm = NULL;
rval = -1;
line = xstrdup(challenge);
cp = line;
cp = challenge;
scheme = "Basic"; /* only support Basic authentication */
if (debug)
fprintf(ttyout, "auth_url: challenge `%s'\n", challenge);
scheme = strsep(&cp, " ");
#define SCHEME_BASIC "Basic"
if (strncasecmp(scheme, SCHEME_BASIC, sizeof(SCHEME_BASIC) - 1) != 0) {
warnx("Unsupported WWW Authentication challenge - `%s'",
if (! match_token(&cp, scheme)) {
warnx("Unsupported authentication challenge - `%s'",
challenge);
goto cleanup_auth_url;
}
cp += strspn(cp, " ");
#define REALM "realm=\""
if (strncasecmp(cp, REALM, sizeof(REALM) - 1) == 0)
if (STRNEQUAL(cp, REALM))
cp += sizeof(REALM) - 1;
else {
warnx("Unsupported WWW Authentication challenge - `%s'",
warnx("Unsupported authentication challenge - `%s'",
challenge);
goto cleanup_auth_url;
}
/* XXX: need to improve quoted-string parsing to support \ quoting, etc. */
if ((ep = strchr(cp, '\"')) != NULL) {
size_t len = ep - cp;
realm = (char *)xmalloc(len + 1);
(void)strlcpy(realm, cp, len + 1);
} else {
warnx("Unsupported WWW Authentication challenge - `%s'",
warnx("Unsupported authentication challenge - `%s'",
challenge);
goto cleanup_auth_url;
}
if (guser != NULL)
fprintf(ttyout, "Username for `%s': ", realm);
if (guser != NULL) {
(void)strlcpy(user, guser, sizeof(user));
else {
fprintf(ttyout, "Username for `%s': ", realm);
fprintf(ttyout, "%s\n", user);
} else {
(void)fflush(ttyout);
if (fgets(user, sizeof(user) - 1, stdin) == NULL) {
clearerr(stdin);
@ -181,13 +218,13 @@ auth_url(const char *challenge, char **response, const char *guser,
*response = (char *)xmalloc(rlen);
(void)strlcpy(*response, scheme, rlen);
len = strlcat(*response, " ", rlen);
base64_encode(clear, clen, (u_char *)*response + len);
/* use `clen - 1' to not encode the trailing NUL */
base64_encode(clear, clen - 1, (unsigned char *)*response + len);
memset(clear, 0, clen);
rval = 0;
cleanup_auth_url:
FREEPTR(clear);
FREEPTR(line);
FREEPTR(realm);
return (rval);
}
@ -197,11 +234,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 u_char *clear, size_t len, u_char *encoded)
base64_encode(const unsigned char *clear, size_t len, unsigned char *encoded)
{
static const u_char enc[] =
static const unsigned char enc[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
u_char *cp;
unsigned char *cp;
int i;
cp = encoded;
@ -217,6 +254,7 @@ base64_encode(const u_char *clear, size_t len, u_char *encoded)
while (i-- > len)
*(--cp) = '=';
}
#endif
/*
* Decode %xx escapes in given string, `in-place'.
@ -295,17 +333,17 @@ parse_url(const char *url, const char *desc, url_t *type,
*portnum = 0;
tport = NULL;
if (strncasecmp(url, HTTP_URL, sizeof(HTTP_URL) - 1) == 0) {
if (STRNEQUAL(url, HTTP_URL)) {
url += sizeof(HTTP_URL) - 1;
*type = HTTP_URL_T;
*portnum = HTTP_PORT;
tport = httpport;
} else if (strncasecmp(url, FTP_URL, sizeof(FTP_URL) - 1) == 0) {
} else if (STRNEQUAL(url, FTP_URL)) {
url += sizeof(FTP_URL) - 1;
*type = FTP_URL_T;
*portnum = FTP_PORT;
tport = ftpport;
} else if (strncasecmp(url, FILE_URL, sizeof(FILE_URL) - 1) == 0) {
} else if (STRNEQUAL(url, FILE_URL)) {
url += sizeof(FILE_URL) - 1;
*type = FILE_URL_T;
} else {
@ -347,6 +385,9 @@ parse_url(const char *url, const char *desc, url_t *type,
*cp = '\0';
*pass = xstrdup(cp + 1);
}
url_decode(*user);
if (*pass)
url_decode(*pass);
}
#ifdef INET6
@ -435,7 +476,8 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
size_t len;
static size_t bufsize;
static char *xferbuf;
char *cp, *ep, *buf, *savefile;
const char *cp, *token;
char *ep, *buf, *savefile;
char *auth, *location, *message;
char *user, *pass, *host, *port, *path, *decodedpath;
char *puser, *ppass, *useragent;
@ -515,7 +557,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
goto cleanup_fetch_url;
} else {
if (debug)
fprintf(ttyout, "got savefile as `%s'\n", savefile);
fprintf(ttyout, "savefile `%s'\n", savefile);
}
restart_point = 0;
@ -788,7 +830,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
warn("Receiving HTTP reply");
goto cleanup_fetch_url;
}
while (len > 0 && (buf[len-1] == '\r' || buf[len-1] == '\n'))
while (len > 0 && (ISLWS(buf[len-1])))
buf[--len] = '\0';
if (debug)
fprintf(ttyout, "received `%s'\n", buf);
@ -805,28 +847,27 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
message = xstrdup(cp);
/* Read the rest of the header. */
FREEPTR(buf);
while (1) {
FREEPTR(buf);
if ((buf = fparseln(fin, &len, NULL, "\0\0\0", 0))
== NULL) {
warn("Receiving HTTP reply");
goto cleanup_fetch_url;
}
while (len > 0 &&
(buf[len-1] == '\r' || buf[len-1] == '\n'))
while (len > 0 && (ISLWS(buf[len-1])))
buf[--len] = '\0';
if (len == 0)
break;
if (debug)
fprintf(ttyout, "received `%s'\n", buf);
/* Look for some headers */
/*
* Look for some headers
*/
cp = buf;
#define CONTENTLEN "Content-Length: "
if (strncasecmp(cp, CONTENTLEN,
sizeof(CONTENTLEN) - 1) == 0) {
cp += sizeof(CONTENTLEN) - 1;
if (match_token(&cp, "Content-Length:")) {
filesize = STRTOLL(cp, &ep, 10);
if (filesize < 0 || *ep != '\0')
goto improper;
@ -835,13 +876,12 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
"parsed len as: " LLF "\n",
(LLT)filesize);
#define CONTENTRANGE "Content-Range: bytes "
} else if (strncasecmp(cp, CONTENTRANGE,
sizeof(CONTENTRANGE) - 1) == 0) {
cp += sizeof(CONTENTRANGE) - 1;
if (*cp == '*') {
ep = cp + 1;
}
} else if (match_token(&cp, "Content-Range:")) {
if (! match_token(&cp, "bytes"))
goto improper;
if (*cp == '*')
cp++;
else {
rangestart = STRTOLL(cp, &ep, 10);
if (rangestart < 0 || *ep != '-')
@ -850,19 +890,20 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
rangeend = STRTOLL(cp, &ep, 10);
if (rangeend < 0 || rangeend < rangestart)
goto improper;
cp = ep;
}
if (*ep != '/')
if (*cp != '/')
goto improper;
cp = ep + 1;
if (*cp == '*') {
ep = cp + 1;
}
cp++;
if (*cp == '*')
cp++;
else {
entitylen = STRTOLL(cp, &ep, 10);
if (entitylen < 0)
goto improper;
cp = ep;
}
if (*ep != '\0')
if (*cp != '\0')
goto improper;
if (debug) {
@ -881,13 +922,10 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
goto cleanup_fetch_url;
}
#define LASTMOD "Last-Modified: "
} else if (strncasecmp(cp, LASTMOD,
sizeof(LASTMOD) - 1) == 0) {
} else if (match_token(&cp, "Last-Modified:")) {
struct tm parsed;
char *t;
cp += sizeof(LASTMOD) - 1;
/* RFC 1123 */
if ((t = strptime(cp,
"%a, %d %b %Y %H:%M:%S GMT",
@ -910,29 +948,22 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
}
#define LOCATION "Location: "
} else if (strncasecmp(cp, LOCATION,
sizeof(LOCATION) - 1) == 0) {
cp += sizeof(LOCATION) - 1;
} else if (match_token(&cp, "Location:")) {
location = xstrdup(cp);
if (debug)
fprintf(ttyout,
"parsed location as: %s\n", cp);
"parsed location as `%s'\n", cp);
#define TRANSENC "Transfer-Encoding: "
} else if (strncasecmp(cp, TRANSENC,
sizeof(TRANSENC) - 1) == 0) {
cp += sizeof(TRANSENC) - 1;
if (strcasecmp(cp, "binary") == 0) {
} else if (match_token(&cp, "Transfer-Encoding:")) {
if (match_token(&cp, "binary")) {
warnx(
"Bogus transfer encoding - `%s' (fetching anyway)",
cp);
"Bogus transfer encoding - `binary' (fetching anyway)");
continue;
}
if (strcasecmp(cp, "chunked") != 0) {
if (! (token = match_token(&cp, "chunked"))) {
warnx(
"Unsupported transfer encoding - `%s'",
cp);
token);
goto cleanup_fetch_url;
}
ischunked++;
@ -940,26 +971,20 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
fprintf(ttyout,
"using chunked encoding\n");
#define PROXYAUTH "Proxy-Authenticate: "
} else if (strncasecmp(cp, PROXYAUTH,
sizeof(PROXYAUTH) - 1) == 0) {
cp += sizeof(PROXYAUTH) - 1;
} else if (match_token(&cp, "Proxy-Authenticate:")
|| match_token(&cp, "WWW-Authenticate:")) {
if (! (token = match_token(&cp, "Basic"))) {
if (debug)
fprintf(ttyout,
"skipping unknown auth scheme `%s'\n",
token);
continue;
}
FREEPTR(auth);
auth = xstrdup(cp);
auth = xstrdup(token);
if (debug)
fprintf(ttyout,
"parsed proxy-auth as: %s\n", cp);
#define WWWAUTH "WWW-Authenticate: "
} else if (strncasecmp(cp, WWWAUTH,
sizeof(WWWAUTH) - 1) == 0) {
cp += sizeof(WWWAUTH) - 1;
FREEPTR(auth);
auth = xstrdup(cp);
if (debug)
fprintf(ttyout,
"parsed www-auth as: %s\n", cp);
"parsed auth as `%s'\n", cp);
}
}
@ -1002,18 +1027,13 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
rval = go_fetch(location);
}
goto cleanup_fetch_url;
#ifndef NO_AUTH
case 401:
case 407:
{
char **authp;
char *auser, *apass;
fprintf(ttyout, "%s\n", message);
if (EMPTYSTRING(auth)) {
warnx(
"No authentication challenge provided by server");
goto cleanup_fetch_url;
}
if (hcode == 401) {
authp = &wwwauth;
auser = user;
@ -1023,6 +1043,14 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
auser = puser;
apass = ppass;
}
if (verbose || *authp == NULL ||
auser == NULL || apass == NULL)
fprintf(ttyout, "%s\n", message);
if (EMPTYSTRING(auth)) {
warnx(
"No authentication challenge provided by server");
goto cleanup_fetch_url;
}
if (*authp != NULL) {
char reply[10];
@ -1032,10 +1060,9 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
== NULL) {
clearerr(stdin);
goto cleanup_fetch_url;
} else {
if (tolower(reply[0]) != 'y')
goto cleanup_fetch_url;
}
if (tolower((unsigned char)reply[0]) != 'y')
goto cleanup_fetch_url;
auser = NULL;
apass = NULL;
}
@ -1047,6 +1074,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
goto cleanup_fetch_url;
}
#endif
default:
if (message)
warnx("Error retrieving file - `%s'", message);
@ -1273,6 +1301,7 @@ aborthttp(int notused)
char msgbuf[100];
int len;
sigint_raised = 1;
alarmtimer(0);
len = strlcpy(msgbuf, "\nHTTP fetch aborted.\n", sizeof(msgbuf));
write(fileno(ttyout), msgbuf, len);
@ -1299,7 +1328,7 @@ fetch_ftp(const char *url)
rval = 1;
type = TYPE_I;
if (strncasecmp(url, FTP_URL, sizeof(FTP_URL) - 1) == 0) {
if (STRNEQUAL(url, FTP_URL)) {
if ((parse_url(url, "URL", &urltype, &user, &pass,
&host, &port, &portnum, &path) == -1) ||
(user != NULL && *user == '\0') ||
@ -1307,8 +1336,6 @@ fetch_ftp(const char *url)
warnx("Invalid URL `%s'", url);
goto cleanup_fetch_ftp;
}
url_decode(user);
url_decode(pass);
/*
* Note: Don't url_decode(path) here. We need to keep the
* distinction between "/" and "%2F" until later.
@ -1570,7 +1597,10 @@ fetch_ftp(const char *url)
ointeractive = interactive;
interactive = 0;
xargv[0] = "mget";
if (restartautofetch)
xargv[0] = "mreget";
else
xargv[0] = "mget";
mget(xargc, xargv);
interactive = ointeractive;
} else {
@ -1618,10 +1648,11 @@ go_fetch(const char *url)
{
char *proxy;
#ifndef NO_ABOUT
/*
* Check for about:*
*/
if (strncasecmp(url, ABOUT_URL, sizeof(ABOUT_URL) - 1) == 0) {
if (STRNEQUAL(url, ABOUT_URL)) {
url += sizeof(ABOUT_URL) -1;
if (strcasecmp(url, "ftp") == 0 ||
strcasecmp(url, "tnftp") == 0) {
@ -1651,12 +1682,12 @@ go_fetch(const char *url)
fputs("\n", ttyout);
return (0);
}
#endif
/*
* Check for file:// and http:// URLs.
*/
if (strncasecmp(url, HTTP_URL, sizeof(HTTP_URL) - 1) == 0 ||
strncasecmp(url, FILE_URL, sizeof(FILE_URL) - 1) == 0)
if (STRNEQUAL(url, HTTP_URL) || STRNEQUAL(url, FILE_URL))
return (fetch_url(url, NULL, NULL, NULL));
/*
@ -1665,8 +1696,7 @@ go_fetch(const char *url)
* Othewise, use fetch_ftp().
*/
proxy = getoptionvalue("ftp_proxy");
if (!EMPTYSTRING(proxy) &&
strncasecmp(url, FTP_URL, sizeof(FTP_URL) - 1) == 0)
if (!EMPTYSTRING(proxy) && STRNEQUAL(url, FTP_URL))
return (fetch_url(url, NULL, NULL, NULL));
return (fetch_ftp(url));
@ -1695,7 +1725,9 @@ auto_fetch(int argc, char *argv[])
if (sigsetjmp(toplevel, 1)) {
if (connected)
disconnect(0, NULL);
return (argpos + 1);
if (rval > 0)
rval = argpos + 1;
return (rval);
}
(void)xsignal(SIGINT, intr);
(void)xsignal(SIGPIPE, lostpeer);

View File

@ -1,6 +1,6 @@
.\" $NetBSD: ftp.1,v 1.101 2003/12/19 03:46:02 lukem Exp $
.\" $NetBSD: ftp.1,v 1.108 2005/01/15 21:28:16 lukem Exp $
.\"
.\" Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
.\" Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to The NetBSD Foundation
@ -64,7 +64,7 @@
.\"
.\" @(#)ftp.1 8.3 (Berkeley) 10/9/94
.\"
.Dd December 19, 2003
.Dd January 15, 2005
.Dt FTP 1
.Os
.Sh NAME
@ -951,7 +951,9 @@ traffic.
.Tn FTP
servers are required to support the
.Dv PASV
command by RFC 1123, some do not.)
command by
.Cm RFC 1123 ,
some do not.)
.It Ic pdir Op Ar remote-path
Perform
.Ic dir
@ -1121,7 +1123,7 @@ Outgoing transfers.
.El
.Pp
.Ar maximum
can by modified on the fly by
can be modified on the fly by
.Ar increment
bytes (default: 1024) each time a given signal is received:
.B
@ -1614,7 +1616,10 @@ This is unlikely to be useful.
.It
Any
.Sq Li \&% Ns Ar XX
codes within the path components are decoded, with
codes
(per
.Cm RFC 1738 )
within the path components are decoded, with
.Ar XX
representing a character code in hexadecimal.
This decoding takes place after the
@ -1746,6 +1751,14 @@ is not given, the file is stored in the current directory as the
.Xr basename 1
of
.Ar path .
Note that if a
.Tn HTTP
redirect is received, the fetch is retried using the new target URL
supplied by the server, with a corresponding new
.Ar path .
Using an explicit
.Fl o Ar output
is recommended, to avoid writing to unexpected file names.
.Pp
If a classic format or an
.Tn FTP
@ -2214,9 +2227,9 @@ URL requests
.Tn FTP
protocol).
.Pp
.Em NOTE :
this is not used for interactive sessions, only for command-line
fetches.
See
.Ev http_proxy
for further notes about proxy use.
.It Ev http_proxy
URL of
.Tn HTTP
@ -2227,6 +2240,18 @@ If proxy authentication is required and there is a username and
password in this URL, they will automatically be used in the first
attempt to authenticate to the proxy.
.Pp
If
.Dq unsafe
URL characters are required in the username or password
(for example
.Sq @
or
.Sq / ) ,
encode them with
.Cm RFC 1738
.Sq Li \&% Ns Ar XX
encoding.
.Pp
Note that the use of a username and password in
.Ev ftp_proxy
and

View File

@ -1,7 +1,7 @@
/* $NetBSD: ftp.c,v 1.125 2004/04/10 12:21:39 lukem Exp $ */
/* $NetBSD: ftp.c,v 1.126 2004/07/20 10:40:22 lukem Exp $ */
/*-
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -99,7 +99,7 @@
#if 0
static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94";
#else
__RCSID("$NetBSD: ftp.c,v 1.125 2004/04/10 12:21:39 lukem Exp $");
__RCSID("$NetBSD: ftp.c,v 1.126 2004/07/20 10:40:22 lukem Exp $");
#endif
#endif /* not lint */
@ -131,8 +131,9 @@ __RCSID("$NetBSD: ftp.c,v 1.125 2004/04/10 12:21:39 lukem Exp $");
#include "ftp_var.h"
volatile int abrtflag = 0;
volatile int timeoutflag = 0;
volatile sig_atomic_t abrtflag;
volatile sig_atomic_t timeoutflag;
sigjmp_buf ptabort;
int ptabflg;
int ptflag = 0;
@ -318,6 +319,7 @@ cmdabort(int notused)
{
int oerrno = errno;
sigint_raised = 1;
alarmtimer(0);
if (fromatty)
write(fileno(ttyout), "\n", 1);
@ -601,6 +603,7 @@ abortxfer(int notused)
char msgbuf[100];
int len;
sigint_raised = 1;
alarmtimer(0);
mflag = 0;
abrtflag = 0;
@ -1742,6 +1745,7 @@ psabort(int notused)
{
int oerrno = errno;
sigint_raised = 1;
alarmtimer(0);
abrtflag++;
errno = oerrno;
@ -1838,6 +1842,7 @@ void
abortpt(int notused)
{
sigint_raised = 1;
alarmtimer(0);
if (fromatty)
write(fileno(ttyout), "\n", 1);
@ -2056,6 +2061,7 @@ abort_squared(int dummy)
char msgbuf[100];
int len;
sigint_raised = 1;
alarmtimer(0);
len = strlcpy(msgbuf, "\nremote abort aborted; closing connection.\n",
sizeof(msgbuf));

View File

@ -1,7 +1,7 @@
/* $NetBSD: ftp_var.h,v 1.65 2003/08/07 11:13:56 agc Exp $ */
/* $NetBSD: ftp_var.h,v 1.69 2005/01/03 09:50:09 lukem Exp $ */
/*-
* Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -126,15 +126,15 @@
* Format of command table.
*/
struct cmd {
char *c_name; /* name of command */
char *c_help; /* help string */
char c_bell; /* give bell when command completes */
char c_conn; /* must be connected to use command */
char c_proxy; /* proxy server may execute */
char *c_name; /* name of command */
const char *c_help; /* help string */
char c_bell; /* give bell when command completes */
char c_conn; /* must be connected to use command */
char c_proxy; /* proxy server may execute */
#ifndef NO_EDITCOMPLETE
char *c_complete; /* context sensitive completion list */
const char *c_complete; /* context sensitive completion list */
#endif /* !NO_EDITCOMPLETE */
void (*c_handler)(int, char **); /* function to call */
void (*c_handler)(int, char **); /* function to call */
};
/*
@ -269,7 +269,8 @@ GLOBAL char *direction; /* direction transfer is occurring */
GLOBAL char *hostname; /* name of host connected to */
GLOBAL int unix_server; /* server is unix, can use binary for ascii */
GLOBAL int unix_proxy; /* proxy is unix, can use binary for ascii */
GLOBAL char remotepwd[MAXPATHLEN]; /* remote dir */
GLOBAL char localcwd[MAXPATHLEN]; /* local dir */
GLOBAL char remotecwd[MAXPATHLEN]; /* remote dir */
GLOBAL char *username; /* name of user logged in as. (dynamic) */
GLOBAL sa_family_t family; /* address family to use for connections */
@ -310,6 +311,7 @@ GLOBAL void (*reply_callback)(const char *);
* first (`xxx-') and last (`xxx ')
*/
GLOBAL volatile sig_atomic_t sigint_raised;
GLOBAL FILE *cin;
GLOBAL FILE *cout;

View File

@ -1,7 +1,7 @@
/* $NetBSD: main.c,v 1.86 2003/08/07 11:13:56 agc Exp $ */
/* $NetBSD: main.c,v 1.90 2004/07/21 00:09:14 lukem Exp $ */
/*-
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -104,7 +104,7 @@ __COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\n\
#if 0
static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 10/9/94";
#else
__RCSID("$NetBSD: main.c,v 1.86 2003/08/07 11:13:56 agc Exp $");
__RCSID("$NetBSD: main.c,v 1.90 2004/07/21 00:09:14 lukem Exp $");
#endif
#endif /* not lint */
@ -119,6 +119,7 @@ __RCSID("$NetBSD: main.c,v 1.86 2003/08/07 11:13:56 agc Exp $");
#include <netdb.h>
#include <paths.h>
#include <pwd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -147,6 +148,8 @@ main(int argc, char *argv[])
setlocale(LC_ALL, "");
setprogname(argv[0]);
sigint_raised = 0;
ftpport = "ftp";
httpport = "http";
gateport = NULL;
@ -214,9 +217,14 @@ main(int argc, char *argv[])
(void)close(s);
/* sanity check returned buffer sizes */
if (rcvbuf_size <= 0)
rcvbuf_size = 8192;
rcvbuf_size = 8 * 1024;
if (sndbuf_size <= 0)
sndbuf_size = 8192;
sndbuf_size = 8 * 1024;
if (sndbuf_size > 8 * 1024 * 1024)
sndbuf_size = 8 * 1024 * 1024;
if (rcvbuf_size > 8 * 1024 * 1024)
rcvbuf_size = 8 * 1024 * 1024;
marg_sl = xsl_init();
if ((tmpdir = getenv("TMPDIR")) == NULL)
@ -501,17 +509,22 @@ main(int argc, char *argv[])
if (argc > 0) {
if (isupload) {
rval = auto_put(argc, argv, upload_path);
sigint_or_rval_exit:
if (sigint_raised) {
(void)xsignal(SIGINT, SIG_DFL);
raise(SIGINT);
}
exit(rval);
} else if (strchr(argv[0], ':') != NULL
&& ! isipv6addr(argv[0])) {
rval = auto_fetch(argc, argv);
if (rval >= 0) /* -1 == connected and cd-ed */
exit(rval);
goto sigint_or_rval_exit;
} else {
char *xargv[4], *user, *host;
if (sigsetjmp(toplevel, 1))
exit(0);
if ((rval = sigsetjmp(toplevel, 1)))
goto sigint_or_rval_exit;
(void)xsignal(SIGINT, intr);
(void)xsignal(SIGPIPE, lostpeer);
user = NULL;
@ -1024,8 +1037,8 @@ usage(void)
const char *progname = getprogname();
(void)fprintf(stderr,
"usage: %s [-46AadefginpRtvV] [-N netrc] [-o outfile] [-P port] [-r retry]\n"
" [-T dir,max[,inc][[user@]host [port]]] [host:path[/]]\n"
"usage: %s [-46AadefginpRtvV] [-N netrc] [-o outfile] [-P port] [-q quittime]\n"
" [-r retry] [-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);

View File

@ -1,4 +1,4 @@
/* $NetBSD: progressbar.c,v 1.5 2004/03/09 17:04:24 hubertf Exp $ */
/* $NetBSD: progressbar.c,v 1.6 2005/02/10 16:00:28 jmc Exp $ */
/*-
* Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: progressbar.c,v 1.5 2004/03/09 17:04:24 hubertf Exp $");
__RCSID("$NetBSD: progressbar.c,v 1.6 2005/02/10 16:00:28 jmc Exp $");
#endif /* not lint */
/*
@ -79,7 +79,6 @@ foregroundproc(void)
#endif /* !defined(NO_PROGRESS) */
#ifndef NO_PROGRESS
static void updateprogressmeter(int);
/*
@ -93,8 +92,6 @@ updateprogressmeter(int dummy)
progressmeter(0);
errno = oerrno;
}
#endif /* NO_PROGRESS */
/*
* List of order of magnitude prefixes.
@ -127,7 +124,7 @@ progressmeter(int flag)
struct timeval td;
off_t abbrevsize, bytespersec;
double elapsed;
int ratio, barlength, i, len, remaining;
int ratio, barlength, i, remaining;
/*
* Work variables for progress bar.
@ -137,7 +134,10 @@ progressmeter(int flag)
* `static' portion of it), be sure to update
* these appropriately.
*/
#endif
int len;
char buf[256]; /* workspace for progress bar */
#ifndef NO_PROGRESS
#define BAROVERHEAD 43 /* non `*' portion of progress bar */
/*
* stars should contain at least

View File

@ -1,4 +1,4 @@
/* $NetBSD: progressbar.h,v 1.4 2004/03/09 17:04:24 hubertf Exp $ */
/* $NetBSD: progressbar.h,v 1.5 2005/02/10 16:00:38 jmc Exp $ */
/*-
* Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
@ -82,7 +82,6 @@ void psummary(int);
void ptransfer(int);
#endif /* !STANDALONE_PROGRESS */
#ifdef NO_LONG_LONG
# define LLF "%ld"
# define LLFP(x) "%" x "ld"

View File

@ -1,7 +1,7 @@
/* $NetBSD: util.c,v 1.115 2004/04/10 12:21:39 lukem Exp $ */
/* $NetBSD: util.c,v 1.117 2005/01/03 09:50:09 lukem Exp $ */
/*-
* Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
* Copyright (c) 1997-2005 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -71,13 +71,13 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: util.c,v 1.115 2004/04/10 12:21:39 lukem Exp $");
__RCSID("$NetBSD: util.c,v 1.117 2005/01/03 09:50:09 lukem Exp $");
#endif /* not lint */
/*
* FTP User Program -- Misc support routines
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/time.h>
@ -319,9 +319,10 @@ cleanuppeer(void)
* Top-level signal handler for interrupted commands.
*/
void
intr(int dummy)
intr(int signo)
{
sigint_raised = 1;
alarmtimer(0);
if (fromatty)
write(fileno(ttyout), "\n", 1);
@ -478,7 +479,8 @@ ftp_login(const char *host, const char *user, const char *pass)
break;
}
}
updateremotepwd();
updatelocalcwd();
updateremotecwd();
cleanup_ftp_login:
if (user != NULL && freeuser)
@ -773,10 +775,23 @@ remotemodtime(const char *file, int noisy)
}
/*
* update global `remotepwd', which contains the state of the remote cwd
* Update global `localcwd', which contains the state of the local cwd
*/
void
updateremotepwd(void)
updatelocalcwd(void)
{
if (getcwd(localcwd, sizeof(localcwd)) == NULL)
localcwd[0] = '\0';
if (debug)
fprintf(ttyout, "got localcwd as `%s'\n", localcwd);
}
/*
* Update global `remotecwd', which contains the state of the remote cwd
*/
void
updateremotecwd(void)
{
int overbose, ocode, i;
char *cp;
@ -786,31 +801,55 @@ updateremotepwd(void)
if (debug == 0)
verbose = -1;
if (command("PWD") != COMPLETE)
goto badremotepwd;
goto badremotecwd;
cp = strchr(reply_string, ' ');
if (cp == NULL || cp[0] == '\0' || cp[1] != '"')
goto badremotepwd;
goto badremotecwd;
cp += 2;
for (i = 0; *cp && i < sizeof(remotepwd) - 1; i++, cp++) {
for (i = 0; *cp && i < sizeof(remotecwd) - 1; i++, cp++) {
if (cp[0] == '"') {
if (cp[1] == '"')
cp++;
else
break;
}
remotepwd[i] = *cp;
remotecwd[i] = *cp;
}
remotepwd[i] = '\0';
remotecwd[i] = '\0';
if (debug)
fprintf(ttyout, "got remotepwd as `%s'\n", remotepwd);
goto cleanupremotepwd;
badremotepwd:
remotepwd[0]='\0';
cleanupremotepwd:
fprintf(ttyout, "got remotecwd as `%s'\n", remotecwd);
goto cleanupremotecwd;
badremotecwd:
remotecwd[0]='\0';
cleanupremotecwd:
verbose = overbose;
code = ocode;
}
/*
* Ensure file is in or under dir.
* Returns 1 if so, 0 if not (or an error occurred).
*/
int
fileindir(const char *file, const char *dir)
{
char realfile[PATH_MAX+1];
size_t dirlen;
if (realpath(file, realfile) == NULL) {
warn("Unable to determine real path of `%s'", file);
return 0;
}
if (realfile[0] != '/') /* relative result */
return 1;
dirlen = strlen(dir);
#if 0
printf("file %s realfile %s dir %s [%d]\n", file, realfile, dir, dirlen);
#endif
if (strncmp(realfile, dir, dirlen) == 0 && realfile[dirlen] == '/')
return 1;
return 0;
}
/*
* List words in stringlist, vertically arranged
@ -1057,7 +1096,7 @@ formatbuf(char *buf, size_t len, const char *src)
case '/':
case '.':
case 'c':
p2 = connected ? remotepwd : "";
p2 = connected ? remotecwd : "";
updirs = pdirs = 0;
/* option to determine fixed # of dirs from path */

View File

@ -1,6 +1,6 @@
/* $NetBSD: version.h,v 1.35 2004/04/10 12:21:39 lukem Exp $ */
/* $NetBSD: version.h,v 1.44 2005/01/12 22:37:41 lukem Exp $ */
/*-
* Copyright (c) 1999-2003 The NetBSD Foundation, Inc.
* Copyright (c) 1999-2005 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 "20040410"
#define FTP_VERSION "20050112"
#endif