diff --git a/usr.bin/ftp/cmds.c b/usr.bin/ftp/cmds.c index 3075a42158dc..d8b2278d0f73 100644 --- a/usr.bin/ftp/cmds.c +++ b/usr.bin/ftp/cmds.c @@ -1,4 +1,4 @@ -/* $NetBSD: cmds.c,v 1.54 1999/07/02 08:07:40 itojun Exp $ */ +/* $NetBSD: cmds.c,v 1.55 1999/07/11 20:37:39 itojun Exp $ */ /* * Copyright (C) 1997 and 1998 WIDE Project. @@ -107,7 +107,7 @@ #if 0 static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94"; #else -__RCSID("$NetBSD: cmds.c,v 1.54 1999/07/02 08:07:40 itojun Exp $"); +__RCSID("$NetBSD: cmds.c,v 1.55 1999/07/11 20:37:39 itojun Exp $"); #endif #endif /* not lint */ @@ -763,6 +763,7 @@ status(argc, argv) "Put transfer rate throttle: %s; maximum: %d; increment %d.\n", onoff(rate_put), rate_put, rate_put_incr); fprintf(ttyout, "Use of PORT cmds: %s.\n", onoff(sendport)); + fprintf(ttyout, "Use of EPSV/EPRT cmds on IPv4: %s.\n", onoff(epsv4)); #ifndef NO_EDITCOMPLETE fprintf(ttyout, "Command line editing: %s.\n", onoff(editing)); #endif /* !NO_EDITCOMPLETE */ @@ -2472,3 +2473,13 @@ rcvbuf(argc, argv) else rcvbuf_manual = 0; } + +void +setepsv4(argc, argv) + int argc; + char *argv[]; +{ + + code = togglevar(argc, argv, &epsv4, + verbose ? "EPSV/EPRT on IPv4" : NULL); +} diff --git a/usr.bin/ftp/cmdtab.c b/usr.bin/ftp/cmdtab.c index e8c236c9f5d0..3ff09365eed2 100644 --- a/usr.bin/ftp/cmdtab.c +++ b/usr.bin/ftp/cmdtab.c @@ -1,4 +1,4 @@ -/* $NetBSD: cmdtab.c,v 1.24 1999/07/02 08:07:41 itojun Exp $ */ +/* $NetBSD: cmdtab.c,v 1.25 1999/07/11 20:37:39 itojun Exp $ */ /* * Copyright (c) 1985, 1989, 1993, 1994 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)cmdtab.c 8.4 (Berkeley) 10/9/94"; #else -__RCSID("$NetBSD: cmdtab.c,v 1.24 1999/07/02 08:07:41 itojun Exp $"); +__RCSID("$NetBSD: cmdtab.c,v 1.25 1999/07/11 20:37:39 itojun Exp $"); #endif #endif /* not lint */ @@ -69,6 +69,7 @@ char domachelp[] = "execute macro"; #ifndef NO_EDITCOMPLETE char edithelp[] = "toggle command line editing"; #endif /* !NO_EDITCOMPLETE */ +char epsv4help[] = "toggle use of EPSV/EPRT on IPv4 ftp"; 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"; @@ -161,6 +162,7 @@ struct cmd cmdtab[] = { #ifndef NO_EDITCOMPLETE { "edit", edithelp, 0, 0, 0, CMPL0 setedit }, #endif /* !NO_EDITCOMPLETE */ + { "epsv4", epsv4help, 0, 0, 0, CMPL0 setepsv4 }, { "exit", quithelp, 0, 0, 0, CMPL0 quit }, { "form", formhelp, 0, 1, 1, CMPL0 setform }, { "ftp", connecthelp, 0, 0, 1, CMPL0 setpeer }, diff --git a/usr.bin/ftp/extern.h b/usr.bin/ftp/extern.h index 4f3d9ef8910d..d04bbba6e3d4 100644 --- a/usr.bin/ftp/extern.h +++ b/usr.bin/ftp/extern.h @@ -1,4 +1,4 @@ -/* $NetBSD: extern.h,v 1.32 1999/07/02 08:07:41 itojun Exp $ */ +/* $NetBSD: extern.h,v 1.33 1999/07/11 20:37:39 itojun Exp $ */ /* * Copyright (C) 1997 and 1998 WIDE Project. @@ -168,6 +168,7 @@ void setcase __P((int, char **)); void setcr __P((int, char **)); void setdebug __P((int, char **)); void setedit __P((int, char **)); +void setepsv4 __P((int, char **)); void setform __P((int, char **)); void setftmode __P((int, char **)); void setgate __P((int, char **)); diff --git a/usr.bin/ftp/ftp.1 b/usr.bin/ftp/ftp.1 index 6d195fc93ba2..644e3a7c5ff2 100644 --- a/usr.bin/ftp/ftp.1 +++ b/usr.bin/ftp/ftp.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: ftp.1,v 1.44 1999/07/02 08:07:41 itojun Exp $ +.\" $NetBSD: ftp.1,v 1.45 1999/07/11 20:37:39 itojun Exp $ .\" .\" Copyright (c) 1985, 1989, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -406,6 +406,17 @@ Toggle command line editing, and context sensitive command and file completion. This is automatically enabled if input is from a terminal, and disabled otherwise. +.It Ic epsv4 +Toggle the use of +.Li EPSV/EPRT +command on IPv4 connections. +This is enabled by default +.Po +first try +.Li EPSV/EPRT , +then +.Li PASV/PORT +.Pc . .It Ic exit A synonym for .Ic bye . diff --git a/usr.bin/ftp/ftp.c b/usr.bin/ftp/ftp.c index 626cb89848ec..2e7a22a67f80 100644 --- a/usr.bin/ftp/ftp.c +++ b/usr.bin/ftp/ftp.c @@ -1,4 +1,4 @@ -/* $NetBSD: ftp.c,v 1.53 1999/07/11 00:41:59 christos Exp $ */ +/* $NetBSD: ftp.c,v 1.54 1999/07/11 20:37:39 itojun Exp $ */ /* * Copyright (C) 1997 and 1998 WIDE Project. @@ -67,7 +67,7 @@ #if 0 static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94"; #else -__RCSID("$NetBSD: ftp.c,v 1.53 1999/07/11 00:41:59 christos Exp $"); +__RCSID("$NetBSD: ftp.c,v 1.54 1999/07/11 20:37:39 itojun Exp $"); #endif #endif /* not lint */ @@ -1284,9 +1284,11 @@ reinit: setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof(on)) < 0) warn("setsockopt (ignored)"); + result = COMPLETE + 1; switch (data_addr.su_family) { case AF_INET: - result = command(pasvcmd = "EPSV"); + if (epsv4) + result = command(pasvcmd = "EPSV"); if (result != COMPLETE) result = command(pasvcmd = "PASV"); break; @@ -1296,7 +1298,7 @@ reinit: result = command(pasvcmd = "LPSV"); break; default: - result = COMPLETE + 1; + break; } if (result != COMPLETE) { if (activefallback) { @@ -1471,6 +1473,11 @@ noport: switch (data_addr.su_family) { case AF_INET: + if (!epsv4) { + result = COMPLETE + 1; + break; + } + /* FALLTHROUGH */ case AF_INET6: af = (data_addr.su_family == AF_INET) ? 1 : 2; if (getnameinfo((struct sockaddr *)&data_addr, diff --git a/usr.bin/ftp/ftp_var.h b/usr.bin/ftp/ftp_var.h index a8b58f571fd7..706e3b6daf56 100644 --- a/usr.bin/ftp/ftp_var.h +++ b/usr.bin/ftp/ftp_var.h @@ -1,4 +1,4 @@ -/* $NetBSD: ftp_var.h,v 1.34 1999/07/02 08:07:42 itojun Exp $ */ +/* $NetBSD: ftp_var.h,v 1.35 1999/07/11 20:37:39 itojun Exp $ */ /* * Copyright (C) 1997 and 1998 WIDE Project. @@ -168,6 +168,7 @@ int retry_connect; /* seconds between retrying connection */ int ttywidth; /* width of tty */ char *tmpdir; /* temporary directory */ FILE *ttyout; /* stdout, or stderr if retrieving to stdout */ +int epsv4; /* use EPSV/EPRT on IPv4 connections */ #ifndef NO_EDITCOMPLETE int editing; /* command line editing enabled */ @@ -187,15 +188,9 @@ char *hostname; /* name of host connected to */ int unix_server; /* server is unix, can use binary for ascii */ int unix_proxy; /* proxy is unix, can use binary for ascii */ -#if 0 -in_port_t ftpport; /* port number to use for FTP connections */ -in_port_t httpport; /* port number to use for HTTP connections */ -in_port_t gateport; /* port number to use for gateftp connections */ -#else char *ftpport; /* port number to use for FTP connections */ char *httpport; /* port number to use for HTTP connections */ char *gateport; /* port number to use for gateftp connections */ -#endif const char *ftpproxy; /* ftp:// proxy server */ const char *httpproxy; /* http:// proxy server */ diff --git a/usr.bin/ftp/main.c b/usr.bin/ftp/main.c index 2614184f2638..337812573ea8 100644 --- a/usr.bin/ftp/main.c +++ b/usr.bin/ftp/main.c @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.46 1999/07/10 19:41:15 christos Exp $ */ +/* $NetBSD: main.c,v 1.47 1999/07/11 20:37:39 itojun Exp $ */ /* * Copyright (C) 1997 and 1998 WIDE Project. @@ -72,7 +72,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.46 1999/07/10 19:41:15 christos Exp $"); +__RCSID("$NetBSD: main.c,v 1.47 1999/07/11 20:37:39 itojun Exp $"); #endif #endif /* not lint */ @@ -143,6 +143,7 @@ main(argc, argv) rate_get_incr = DEFAULTINCR; rate_put = 0; rate_put_incr = DEFAULTINCR; + epsv4 = 1; marg_sl = sl_init(); if ((tmpdir = getenv("TMPDIR")) == NULL)