Sync with NetBSD:
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 17 May 2008 21:46:19 +0000 (21:46 +0000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 17 May 2008 21:46:19 +0000 (21:46 +0000)
Use the service name to getaddrinfo() (along with the host name), so that
features such as DNS Service Discovery have a better chance of working.

Display the service name in various status & error messages.

Don't getservbyname() the :port component of a URL; RFC 3986 says it's
just an unsigned number, not a service name.

Only attempt to el_parse() a command unknown by the default parser
if editing is enabled.
Fixes NetBSD PR bin/38589

Add epsv6 and epsv to disable extended passive mode for ipv6 or both ipv4
and ipv6 respectively.

13 files changed:
contrib/tnftp/cmds.c
contrib/tnftp/cmdtab.c
contrib/tnftp/complete.c
contrib/tnftp/extern.h
contrib/tnftp/fetch.c
contrib/tnftp/ftp.1
contrib/tnftp/ftp.c
contrib/tnftp/ftp_var.h
contrib/tnftp/main.c
contrib/tnftp/progressbar.c
contrib/tnftp/progressbar.h
contrib/tnftp/util.c
contrib/tnftp/version.h

index 241fd1d..7a32850 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: cmds.c,v 1.123 2007/05/24 05:05:18 lukem Exp $ */
+/*     $NetBSD: cmds.c,v 1.125 2008/05/10 00:05:31 skd Exp $   */
 
 /*-
  * Copyright (c) 1996-2007 The NetBSD Foundation, Inc.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 #if 0
 static char sccsid[] = "@(#)cmds.c     8.6 (Berkeley) 10/9/94";
 #else
-__RCSID("$NetBSD: cmds.c,v 1.123 2007/05/24 05:05:18 lukem Exp $");
+__RCSID("$NetBSD: cmds.c,v 1.125 2008/05/10 00:05:31 skd Exp $");
 #endif
 #endif /* not lint */
 
@@ -860,6 +853,8 @@ status(int argc, char *argv[])
        fprintf(ttyout, "Use of PORT cmds: %s.\n", onoff(sendport));
        fprintf(ttyout, "Use of EPSV/EPRT cmds for IPv4: %s%s.\n", onoff(epsv4),
            epsv4bad ? " (disabled for this connection)" : "");
+       fprintf(ttyout, "Use of EPSV/EPRT cmds for IPv6: %s%s.\n", onoff(epsv6),
+           epsv6bad ? " (disabled for this connection)" : "");
        fprintf(ttyout, "Command line editing: %s.\n",
 #ifdef NO_EDITCOMPLETE
            "support not compiled in"
@@ -2215,15 +2210,30 @@ setpassive(int argc, char *argv[])
        code = passivemode;
 }
 
+
 void
 setepsv4(int argc, char *argv[])
 {
-
        code = togglevar(argc, argv, &epsv4,
            verbose ? "EPSV/EPRT on IPv4" : NULL);
        epsv4bad = 0;
 }
 
+void
+setepsv6(int argc, char *argv[])
+{
+       code = togglevar(argc, argv, &epsv6,
+           verbose ? "EPSV/EPRT on IPv6" : NULL);
+       epsv6bad = 0;
+}
+
+void
+setepsv(int argc, char*argv[])
+{
+       setepsv4(argc,argv);
+       setepsv6(argc,argv);
+}
+
 void
 setsunique(int argc, char *argv[])
 {
index 8f80e1c..3320216 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: cmdtab.c,v 1.47 2007/04/11 04:40:19 lukem Exp $        */
+/*     $NetBSD: cmdtab.c,v 1.49 2008/05/10 00:05:31 skd Exp $  */
 
 /*-
  * Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -70,7 +63,7 @@
 #if 0
 static char sccsid[] = "@(#)cmdtab.c   8.4 (Berkeley) 10/9/94";
 #else
-__RCSID("$NetBSD: cmdtab.c,v 1.47 2007/04/11 04:40:19 lukem Exp $");
+__RCSID("$NetBSD: cmdtab.c,v 1.49 2008/05/10 00:05:31 skd Exp $");
 #endif
 #endif /* not lint */
 
@@ -100,7 +93,9 @@ HSTR deletehelp[] =  "delete remote file";
 HSTR   disconhelp[] =  "terminate ftp session";
 HSTR   domachelp[] =   "execute macro";
 HSTR   edithelp[] =    "toggle command line editing";
+HSTR   epsvhelp[] =    "toggle use of EPSV/EPRT on both IPv4 and IPV6 ftp";
 HSTR   epsv4help[] =   "toggle use of EPSV/EPRT on IPv4 ftp";
+HSTR   epsv6help[] =   "toggle use of EPSV/EPRT on IPv6 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";
@@ -211,7 +206,9 @@ struct cmd cmdtab[] = {
        { "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 },
+       { "epsv",       H(epsvhelp),    0, 0, 0, CMPL0          setepsv },
        { "epsv4",      H(epsv4help),   0, 0, 0, CMPL0          setepsv4 },
+       { "epsv6",      H(epsv6help),   0, 0, 0, CMPL0          setepsv6 },
        { "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 },
index dae7919..6cf3597 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: complete.c,v 1.42 2007/04/17 05:52:03 lukem Exp $      */
+/*     $NetBSD: complete.c,v 1.43 2008/04/28 20:24:13 martin Exp $     */
 
 /*-
  * Copyright (c) 1997-2000,2005 The NetBSD Foundation, Inc.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -38,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: complete.c,v 1.42 2007/04/17 05:52:03 lukem Exp $");
+__RCSID("$NetBSD: complete.c,v 1.43 2008/04/28 20:24:13 martin Exp $");
 #endif /* not lint */
 
 /*
index ee7d9f6..98518ec 100644 (file)
@@ -1,7 +1,7 @@
-/*     $NetBSD: extern.h,v 1.72 2007/05/24 05:05:18 lukem Exp $        */
+/*     $NetBSD: extern.h,v 1.75 2008/05/10 00:05:31 skd Exp $  */
 
 /*-
- * Copyright (c) 1996-2007 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -173,7 +166,6 @@ const char *onoff(int);
 void   opts(int, char **);
 void   newer(int, char **);
 void   page(int, char **);
-int    parseport(const char *, int);
 int    parserate(int, char **, int);
 char   *prompt(void);
 void   proxabort(int);
@@ -209,6 +201,8 @@ void        setcr(int, char **);
 void   setdebug(int, char **);
 void   setedit(int, char **);
 void   setepsv4(int, char **);
+void   setepsv6(int, char **);
+void   setepsv(int, char **);
 void   setform(int, char **);
 void   setftmode(int, char **);
 void   setgate(int, char **);
index be78936..351b179 100644 (file)
@@ -1,7 +1,7 @@
-/*     $NetBSD: fetch.c,v 1.183 2007/12/05 03:46:33 lukem Exp $        */
+/*     $NetBSD: fetch.c,v 1.185 2008/04/28 20:24:13 martin Exp $       */
 
 /*-
- * Copyright (c) 1997-2007 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -41,7 +34,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: fetch.c,v 1.183 2007/12/05 03:46:33 lukem Exp $");
+__RCSID("$NetBSD: fetch.c,v 1.185 2008/04/28 20:24:13 martin Exp $");
 #endif /* not lint */
 
 /*
@@ -426,15 +419,16 @@ parse_url(const char *url, const char *desc, url_t *type,
        } else
 #endif /* INET6 */
                if ((cp = strchr(thost, ':')) != NULL)
-                       *cp++ =  '\0';
+                       *cp++ = '\0';
        *host = thost;
 
                        /* look for [:port] */
        if (cp != NULL) {
-               long    nport;
+               unsigned long   nport;
 
-               nport = parseport(cp, -1);
-               if (nport == -1) {
+               nport = strtoul(cp, &ep, 10);
+               if (*cp == '\0' || *ep != '\0' ||
+                   nport < 1 || nport > MAX_IN_PORT_T) {
                        warnx("Unknown port `%s' in %s `%s'",
                            cp, desc, origurl);
                        goto cleanup_parse_url;
@@ -476,7 +470,6 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
 {
        struct addrinfo         hints, *res, *res0 = NULL;
        int                     error;
-       char                    hbuf[NI_MAXHOST];
        sigfunc volatile        oldintr;
        sigfunc volatile        oldintp;
        int volatile            s;
@@ -612,6 +605,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                        url_t purltype;
                        char *phost, *ppath;
                        char *pport, *no_proxy;
+                       in_port_t pportnum;
 
                        isproxy = 1;
 
@@ -619,7 +613,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                        no_proxy = getoptionvalue("no_proxy");
                        if (! EMPTYSTRING(no_proxy)) {
                                char *np, *np_copy, *np_iter;
-                               long np_port;
+                               unsigned long np_port;
                                size_t hlen, plen;
 
                                np_iter = np_copy = ftp_strdup(no_proxy);
@@ -628,10 +622,9 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                                        if (*cp == '\0')
                                                continue;
                                        if ((np = strrchr(cp, ':')) != NULL) {
-                                               *np = '\0';
-                                               np_port =
-                                                   strtol(np + 1, &ep, 10);
-                                               if (*ep != '\0')
+                                               *np++ =  '\0';
+                                               np_port = strtoul(np, &ep, 10);
+                                               if (*np == '\0' || *ep != '\0')
                                                        continue;
                                                if (np_port != portnum)
                                                        continue;
@@ -659,7 +652,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                                        goto cleanup_fetch_url;
                                }
                                if (parse_url(proxyenv, "proxy URL", &purltype,
-                                   &puser, &ppass, &phost, &pport, &portnum,
+                                   &puser, &ppass, &phost, &pport, &pportnum,
                                    &ppath) == -1)
                                        goto cleanup_fetch_url;
 
@@ -701,9 +694,9 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                hints.ai_family = family;
                hints.ai_socktype = SOCK_STREAM;
                hints.ai_protocol = 0;
-               error = getaddrinfo(host, NULL, &hints, &res0);
+               error = getaddrinfo(host, port, &hints, &res0);
                if (error) {
-                       warnx("Can't lookup `%s': %s", host,
+                       warnx("Can't lookup `%s:%s': %s", host, port,
                            (error == EAI_SYSTEM) ? strerror(errno)
                                                  : gai_strerror(error));
                        goto cleanup_fetch_url;
@@ -713,23 +706,27 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
 
                s = -1;
                for (res = res0; res; res = res->ai_next) {
+                       char    hname[NI_MAXHOST], sname[NI_MAXSERV];
+
                        ai_unmapped(res);
                        if (getnameinfo(res->ai_addr, res->ai_addrlen,
-                           hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST) != 0)
-                               strlcpy(hbuf, "?", sizeof(hbuf));
+                           hname, sizeof(hname), sname, sizeof(sname),
+                           NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
+                               strlcpy(hname, "?", sizeof(hname));
+                               strlcpy(sname, "?", sizeof(sname));
+                       }
 
                        if (verbose && res0->ai_next) {
-                               fprintf(ttyout, "Trying %s...\n", hbuf);
+                               fprintf(ttyout, "Trying %s:%s ...\n",
+                                   hname, sname);
                        }
 
-                       ((struct sockaddr_in *)res->ai_addr)->sin_port =
-                           htons(portnum);
                        s = socket(res->ai_family, SOCK_STREAM,
                            res->ai_protocol);
                        if (s < 0) {
                                warn(
-                                 "Can't create socket for connection to `%s'",
-                                   hbuf);
+                                   "Can't create socket for connection to "
+                                   "`%s:%s'", hname, sname);
                                continue;
                        }
 
@@ -744,7 +741,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
                }
 
                if (s < 0) {
-                       warnx("Can't connect to `%s'", host);
+                       warnx("Can't connect to `%s:%s'", host, port);
                        goto cleanup_fetch_url;
                }
 
@@ -1296,7 +1293,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
        goto cleanup_fetch_url;
 
  improper:
-       warnx("Improper response from `%s'", host);
+       warnx("Improper response from `%s:%s'", host, port);
 
  cleanup_fetch_url:
        if (oldintr)
@@ -1494,7 +1491,7 @@ fetch_ftp(const char *url)
        autologin = oautologin;
        if ((connected == 0) ||
            (connected == 1 && !ftp_login(host, user, pass))) {
-               warnx("Can't connect or login to host `%s'", host);
+               warnx("Can't connect or login to host `%s:%s'", host, port);
                goto cleanup_fetch_ftp;
        }
 
index 82bd9e3..1cfd946 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $NetBSD: ftp.1,v 1.123 2008/01/08 15:28:31 reed Exp $
+.\"    $NetBSD: ftp.1,v 1.126 2008/05/13 09:33:36 wiz Exp $
 .\"
 .\" Copyright (c) 1996-2007 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .\" 2. Redistributions in binary form must reproduce the above copyright
 .\"    notice, this list of conditions and the following disclaimer in the
 .\"    documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\"    must display the following acknowledgement:
-.\"    This product includes software developed by the NetBSD
-.\"    Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\"    contributors may be used to endorse or promote products derived
-.\"    from this software without specific prior written permission.
 .\"
 .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -64,7 +57,7 @@
 .\"
 .\"    @(#)ftp.1       8.3 (Berkeley) 10/9/94
 .\"
-.Dd August 6, 2007
+.Dd May 10, 2008
 .Dt FTP 1
 .Os
 .Sh NAME
@@ -495,12 +488,12 @@ 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
+.It Ic epsv epsv4 epsv6
 Toggle the use of the extended
 .Dv EPSV
 and
 .Dv EPRT
-commands on IPv4 connections; first try
+commands on all IP, IPv4, and IPv6 connections respectively.  First try
 .Dv EPSV /
 .Dv EPRT ,
 and then
@@ -509,7 +502,10 @@ and then
 This is enabled by default.
 If an extended command fails then this option will be temporarily
 disabled for the duration of the current connection, or until
-.Ic epsv4
+.Ic epsv ,
+.Ic epsv4 ,
+or
+.Ic epsv6
 is executed again.
 .It Ic exit
 A synonym for
index 281ecbc..e26ea10 100644 (file)
@@ -1,7 +1,7 @@
-/*     $NetBSD: ftp.c,v 1.153 2007/12/05 00:15:25 lukem Exp $  */
+/*     $NetBSD: ftp.c,v 1.156 2008/05/10 00:05:31 skd Exp $    */
 
 /*-
- * Copyright (c) 1996-2007 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -99,7 +92,7 @@
 #if 0
 static char sccsid[] = "@(#)ftp.c      8.6 (Berkeley) 10/27/94";
 #else
-__RCSID("$NetBSD: ftp.c,v 1.153 2007/12/05 00:15:25 lukem Exp $");
+__RCSID("$NetBSD: ftp.c,v 1.156 2008/05/10 00:05:31 skd Exp $");
 #endif
 #endif /* not lint */
 
@@ -164,9 +157,8 @@ struct sockinet myctladdr, hisctladdr, data_addr;
 char *
 hookup(char *host, char *port)
 {
-       int s = -1, error, portnum;
+       int s = -1, error;
        struct addrinfo hints, *res, *res0;
-       char hbuf[MAXHOSTNAMELEN];
        static char hostnamebuf[MAXHOSTNAMELEN];
        socklen_t len;
        int on = 1;
@@ -174,14 +166,13 @@ hookup(char *host, char *port)
        memset((char *)&hisctladdr, 0, sizeof (hisctladdr));
        memset((char *)&myctladdr, 0, sizeof (myctladdr));
        memset(&hints, 0, sizeof(hints));
-       portnum = parseport(port, FTP_PORT);
        hints.ai_flags = AI_CANONNAME;
        hints.ai_family = family;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = 0;
-       error = getaddrinfo(host, NULL, &hints, &res0);
+       error = getaddrinfo(host, port, &hints, &res0);
        if (error) {
-               warnx("Can't lookup `%s': %s", host,
+               warnx("Can't lookup `%s:%s': %s", host, port,
                    (error == EAI_SYSTEM) ? strerror(errno)
                                          : gai_strerror(error));
                code = -1;
@@ -196,19 +187,23 @@ hookup(char *host, char *port)
        hostname = hostnamebuf;
 
        for (res = res0; res; res = res->ai_next) {
+               char hname[NI_MAXHOST], sname[NI_MAXSERV];
+
                ai_unmapped(res);
                if (getnameinfo(res->ai_addr, res->ai_addrlen,
-                   hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST))
-                       strlcpy(hbuf, "?", sizeof(hbuf));
+                   hname, sizeof(hname), sname, sizeof(sname),
+                   NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
+                       strlcpy(hname, "?", sizeof(hname));
+                       strlcpy(sname, "?", sizeof(sname));
+               }
                if (verbose && res0->ai_next) {
                                /* if we have multiple possibilities */
-                       fprintf(ttyout, "Trying %s...\n", hbuf);
+                       fprintf(ttyout, "Trying %s:%s ...\n", hname, sname);
                }
-               ((struct sockaddr_in *)res->ai_addr)->sin_port = htons(portnum);
                s = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
                if (s < 0) {
-                       warn("Can't create socket for connection to `%s'",
-                           hbuf);
+                       warn("Can't create socket for connection to `%s:%s'",
+                           hname, sname);
                        continue;
                }
                if (ftp_connect(s, res->ai_addr, res->ai_addrlen) < 0) {
@@ -221,7 +216,7 @@ hookup(char *host, char *port)
                break;
        }
        if (s < 0) {
-               warnx("Can't connect to `%s'", host);
+               warnx("Can't connect to `%s:%s'", host, port);
                code = -1;
                freeaddrinfo(res0);
                return 0;
@@ -233,7 +228,8 @@ hookup(char *host, char *port)
 
        len = hisctladdr.su_len;
        if (getsockname(s, (struct sockaddr *)&myctladdr.si_su, &len) == -1) {
-               warn("Can't determine my address of connection to `%s'", host);
+               warn("Can't determine my address of connection to `%s:%s'",
+                   host, port);
                code = -1;
                goto bad;
        }
@@ -1269,23 +1265,33 @@ initconn(void)
                        break;
 #ifdef INET6
                case AF_INET6:
-                       pasvcmd = "EPSV";
-                       overbose = verbose;
-                       if (ftp_debug == 0)
-                               verbose = -1;
-                       result = command("EPSV");
-                       verbose = overbose;
-                       if (verbose > 0 &&
-                           (result == COMPLETE || !connected))
-                               fprintf(ttyout, "%s\n", reply_string);
-                       if (!connected)
-                               return (1);
-                       /* this code is to be friendly with broken BSDI ftpd */
-                       if (code / 10 == 22 && code != 229) {
-                               fputs(
-"wrong server: return code must be 229\n",
-                                       ttyout);
-                               result = COMPLETE + 1;
+                       if (epsv6 && !epsv6bad) {
+                               pasvcmd = "EPSV";
+                               overbose = verbose;
+                               if (ftp_debug == 0)
+                                       verbose = -1;
+                               result = command("EPSV");
+                               verbose = overbose;
+                               if (verbose > 0 &&
+                                   (result == COMPLETE || !connected))
+                                       fprintf(ttyout, "%s\n", reply_string);
+                               if (!connected)
+                                       return (1);
+                               /*
+                                * this code is to be friendly with
+                                * broken BSDI ftpd
+                                */
+                               if (code / 10 == 22 && code != 229) {
+                                       fputs(
+                                               "wrong server: return code must be 229\n",
+                                               ttyout);
+                                       result = COMPLETE + 1;
+                               }
+                               if (result != COMPLETE) {
+                                       epsv6bad = 1;
+                                       DPRINTF("disabling epsv6 for this "
+                                           "connection\n");
+                               }
                        }
                        if (result != COMPLETE) {
                                pasvcmd = "LPSV";
@@ -1536,6 +1542,10 @@ initconn(void)
                        /* FALLTHROUGH */
 #ifdef INET6
                case AF_INET6:
+                       if (!epsv6 || epsv6bad) {
+                               result = COMPLETE + 1;
+                               break;
+                       }
 #endif
                        af = (data_addr.su_family == AF_INET) ? 1 : 2;
                        tmp = data_addr;
index efab4f6..2c5d053 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: ftp_var.h,v 1.77 2007/12/05 03:46:34 lukem Exp $       */
+/*     $NetBSD: ftp_var.h,v 1.79 2008/05/10 00:05:31 skd Exp $ */
 
 /*-
  * Copyright (c) 1996-2007 The NetBSD Foundation, Inc.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -255,6 +248,8 @@ GLOBAL      int     retry_connect;  /* seconds between retrying connection */
 GLOBAL char   *tmpdir;         /* temporary directory */
 GLOBAL int     epsv4;          /* use EPSV/EPRT on IPv4 connections */
 GLOBAL int     epsv4bad;       /* EPSV doesn't work on the current server */
+GLOBAL int     epsv6;          /* use EPSV/EPRT on IPv6 connections */
+GLOBAL int     epsv6bad;       /* EPSV doesn't work on the current server */
 GLOBAL int     editing;        /* command line editing enabled */
 GLOBAL int     features[FEAT_max];     /* remote FEATures supported */
 
index 22d3a07..43674f1 100644 (file)
@@ -1,7 +1,7 @@
-/*     $NetBSD: main.c,v 1.106 2007/12/02 19:41:53 wiz Exp $   */
+/*     $NetBSD: main.c,v 1.109 2008/05/10 00:05:31 skd Exp $   */
 
 /*-
- * Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -104,7 +97,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.106 2007/12/02 19:41:53 wiz Exp $");
+__RCSID("$NetBSD: main.c,v 1.109 2008/05/10 00:05:31 skd Exp $");
 #endif
 #endif /* not lint */
 
@@ -187,10 +180,13 @@ main(int volatile argc, char **volatile argv)
        rate_put_incr = DEFAULTINCR;
 #ifdef INET6
        epsv4 = 1;
+       epsv6 = 1;      
 #else
        epsv4 = 0;
+       epsv6 = 0;      
 #endif
        epsv4bad = 0;
+       epsv6bad = 0;
        src_addr = NULL;
        upload_path = NULL;
        isupload = 0;
@@ -729,6 +725,7 @@ cmdscanner(void)
                         * such commands as invalid.
                         */
                        if (strchr(margv[0], ':') != NULL ||
+                           !editing ||
                            el_parse(el, margc, (const char **)margv) != 0)
 #endif /* !NO_EDITCOMPLETE */
                                fputs("?Invalid command.\n", ttyout);
index 3f7e8df..7bcc769 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: progressbar.c,v 1.18 2008/01/21 10:31:28 lukem Exp $   */
+/*     $NetBSD: progressbar.c,v 1.19 2008/04/28 20:24:13 martin Exp $  */
 
 /*-
  * Copyright (c) 1997-2007 The NetBSD Foundation, Inc.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -38,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: progressbar.c,v 1.18 2008/01/21 10:31:28 lukem Exp $");
+__RCSID("$NetBSD: progressbar.c,v 1.19 2008/04/28 20:24:13 martin Exp $");
 #endif /* not lint */
 
 /*
index 9e004f4..8b683bb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: progressbar.h,v 1.5 2005/02/10 16:00:38 jmc Exp $      */
+/*     $NetBSD: progressbar.h,v 1.6 2008/04/28 20:24:13 martin Exp $   */
 
 /*-
  * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
index 2ab75b0..bc7f690 100644 (file)
@@ -1,7 +1,7 @@
-/*     $NetBSD: util.c,v 1.144 2007/12/05 03:46:34 lukem Exp $ */
+/*     $NetBSD: util.c,v 1.147 2008/05/10 00:05:31 skd Exp $   */
 
 /*-
- * Copyright (c) 1997-2007 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -71,7 +64,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: util.c,v 1.144 2007/12/05 03:46:34 lukem Exp $");
+__RCSID("$NetBSD: util.c,v 1.147 2008/05/10 00:05:31 skd Exp $");
 #endif /* not lint */
 
 /*
@@ -310,6 +303,7 @@ cleanuppeer(void)
                anonftp = 0;
        data = -1;
        epsv4bad = 0;
+       epsv6bad = 0;
        if (username)
                free(username);
        username = NULL;
@@ -871,10 +865,6 @@ fileindir(const char *file, const char *dir)
        if (realdir[0] != '/')          /* relative result is ok */
                return 1;
        dirlen = strlen(dir);
-#if 0
-printf("file %s parent %s realdir %s dir %s [%d]\n",
-    file, parentdir, realdir, dir, dirlen);
-#endif
        if (strncmp(realdir, dir, dirlen) == 0 &&
            (realdir[dirlen] == '/' || realdir[dirlen] == '\0'))
                return 1;
@@ -1213,39 +1203,6 @@ formatbuf(char *buf, size_t len, const char *src)
        buf[i] = '\0';
 }
 
-/*
- * Parse `port' into a TCP port number, defaulting to `defport' if `port' is
- * an unknown service name. If defport != -1, print a warning upon bad parse.
- */
-int
-parseport(const char *port, int defport)
-{
-       int      rv;
-       long     nport;
-       char    *p, *ep;
-
-       p = ftp_strdup(port);
-       nport = strtol(p, &ep, 10);
-       if (*ep != '\0' && ep == p) {
-               struct servent  *svp;
-
-               svp = getservbyname(port, "tcp");
-               if (svp == NULL) {
- badparseport:
-                       if (defport != -1)
-                               warnx("Unknown port `%s', using port %d",
-                                   port, defport);
-                       rv = defport;
-               } else
-                       rv = ntohs(svp->s_port);
-       } else if (nport < 1 || nport > MAX_IN_PORT_T || *ep != '\0')
-               goto badparseport;
-       else
-               rv = nport;
-       free(p);
-       return (rv);
-}
-
 /*
  * Determine if given string is an IPv6 address or not.
  * Return 1 for yes, 0 for no
@@ -1340,11 +1297,15 @@ ftp_connect(int sock, const struct sockaddr *name, socklen_t namelen)
        struct timeval  endtime, now, td;
        struct pollfd   pfd[1];
        char            hname[NI_MAXHOST];
+       char            sname[NI_MAXSERV];
 
        setupsockbufsize(sock);
        if (getnameinfo(name, namelen,
-           hname, sizeof(hname), NULL, 0, NI_NUMERICHOST) != 0)
+           hname, sizeof(hname), sname, sizeof(sname),
+           NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
                strlcpy(hname, "?", sizeof(hname));
+               strlcpy(sname, "?", sizeof(sname));
+       }
 
        if (bindai != NULL) {                   /* bind to specific addr */
                struct addrinfo *ai;
@@ -1371,14 +1332,14 @@ ftp_connect(int sock, const struct sockaddr *name, socklen_t namelen)
 
                                                /* save current socket flags */
        if ((flags = fcntl(sock, F_GETFL, 0)) == -1) {
-               warn("Can't %s socket flags for connect to `%s'",
-                   "save", hname);
+               warn("Can't %s socket flags for connect to `%s:%s'",
+                   "save", hname, sname);
                return -1;
        }
                                                /* set non-blocking connect */
        if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1) {
-               warn("Can't set socket non-blocking for connect to `%s'",
-                   hname);
+               warn("Can't set socket non-blocking for connect to `%s:%s'",
+                   hname, sname);
                return -1;
        }
 
@@ -1396,7 +1357,7 @@ ftp_connect(int sock, const struct sockaddr *name, socklen_t namelen)
        if (rv == -1) {                         /* connection error */
                if (errno != EINPROGRESS) {     /* error isn't "please wait" */
  connecterror:
-                       warn("Can't connect to `%s'", hname);
+                       warn("Can't connect to `%s:%s'", hname, sname);
                        return -1;
                }
 
@@ -1441,8 +1402,8 @@ ftp_connect(int sock, const struct sockaddr *name, socklen_t namelen)
 
        if (fcntl(sock, F_SETFL, flags) == -1) {
                                                /* restore socket flags */
-               warn("Can't %s socket flags for connect to `%s'",
-                   "restore", hname);
+               warn("Can't %s socket flags for connect to `%s:%s'",
+                   "restore", hname, sname);
                return -1;
        }
        return 0;
index 82f8de4..78b5d53 100644 (file)
@@ -1,6 +1,7 @@
-/*     $NetBSD: version.h,v 1.72 2008/01/21 10:31:28 lukem Exp $       */
+/*     $NetBSD: version.h,v 1.76 2008/05/10 01:14:57 skd Exp $ */
+
 /*-
- * Copyright (c) 1999-2007 The NetBSD Foundation, Inc.
+ * Copyright (c) 1999-2008 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -40,5 +34,5 @@
 #endif
 
 #ifndef FTP_VERSION
-#define        FTP_VERSION     "20080121"
+#define        FTP_VERSION     "20080509"
 #endif