>Number:         154988
>Category:       bin
>Synopsis:       [PATCH] lib/libfetch/ftp.c add LIST feature
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Feb 23 22:20:05 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Craig Leres
>Release:        FreeBSD 8.2-RELEASE amd64
>Organization:
Lawrence Berkeley National Laboratory
>Environment:
        FreeBSD hot.ee.lbl.gov 8.2-RELEASE FreeBSD 8.2-RELEASE #0 r8: Tue Feb
22 19:50:59 PST 2011
le...@hot.ee.lbl.gov:/usr/src/8.2-RELEASE/sys/amd64/compile/LBLSMPIPV6
amd64

>Description:
        Currently if you use fetch with a ftp directory, you get
        "File not found." It would be nice if instead this type of
        query returned a directory listing.

>How-To-Repeat:
        % fetch -vv ftp://ftp.freebsd.org/
        scheme:   [ftp]
        user:     []
        password: []
        host:     [ftp.freebsd.org]
        port:     [0]
        document: [/]
        ---> ftp.freebsd.org:21
        looking up ftp.freebsd.org
        connecting to ftp.freebsd.org:21
        <<< 220 Welcome to freebsd.isc.org.
        >>> USER anonymous
        <<< 331 Please specify the password.
        >>> PASS le...@hot.ee.lbl.gov
        <<< 230 Login successful.
        >>> PWD
        <<< 257 "/"
        >>> MODE S
        <<< 200 Mode set to S.
        >>> TYPE I
        <<< 200 Switching to Binary mode.
        >>> SIZE
        <<< 550 Could not get file size.
        >>> MODE S
        <<< 200 Mode set to S.
        >>> TYPE I
        <<< 200 Switching to Binary mode.
        setting passive mode
        >>> EPSV
        <<< 229 Entering Extended Passive Mode (|||11219|).
        opening data connection
        initiating transfer
        >>> RETR
        <<< 550 Failed to open file.
        fetch: ftp://ftp.freebsd.org/: File unavailable (e.g., file not found,
no access)

>Fix:
        The attached patch detects a trailing '/' and issues a ftp
        LIST for directories.

        New example output:

        % fetch -vv ftp://ftp.freebsd.org/
        scheme:   [ftp]
        user:     []
        password: []
        host:     [ftp.freebsd.org]
        port:     [0]
        document: [/]
        ---> ftp.freebsd.org:21
        looking up ftp.freebsd.org
        connecting to ftp.freebsd.org:21
        <<< 220 Welcome to freebsd.isc.org.
        >>> USER anonymous
        <<< 331 Please specify the password.
        >>> PASS le...@hot.ee.lbl.gov
        <<< 230 Login successful.
        >>> PWD
        <<< 257 "/"
        >>> MODE S
        <<< 200 Mode set to S.
        >>> TYPE I
        <<< 200 Switching to Binary mode.
        setting passive mode
        >>> EPSV
        <<< 229 Entering Extended Passive Mode (|||38037|).
        opening data connection
        initiating transfer
        >>> LIST
        <<< 150 Here comes the directory listing.
        fetch: ftp://ftp.freebsd.org/: size of remote file is not known
        fetch.out                                               61  B  902 kBps
        Waiting for final status
        <<< 226 Directory send OK.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (FreeBSD)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk1lhtIACgkQWxlAhAje3Ju/awCcDNIQSdUni9QPd2NGdDwdHmfp
Xi4An3GOLNEthjToVm9QumxpNrmvwyyP
=HwGD
-----END PGP SIGNATURE-----

--------------050609040308060002090201
Content-Type: text/plain;
 name="patch-ftp.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="patch-ftp.c"

--- ftp.c.orig  2011-02-23 14:07:53.000000000 -0800
+++ ftp.c       2011-02-23 14:08:15.000000000 -0800
@@ -777,7 +777,11 @@
                /* make the server initiate the transfer */
                if (verbose)
                        fetch_info("initiating transfer");
-               e = ftp_cmd(conn, "%s %.*s", oper, filenamelen, filename);
+               if (*filename != '\0')
+                       e = ftp_cmd(conn, "%s %.*s", oper,
+                           filenamelen, filename);
+               else
+                       e = ftp_cmd(conn, "%s", oper);
                if (e != FTP_CONNECTION_ALREADY_OPEN && e != 
FTP_OPEN_DATA_CONNECTION)
                        goto ouch;
 
@@ -868,7 +872,11 @@
                /* make the server initiate the transfer */
                if (verbose)
                        fetch_info("initiating transfer");
-               e = ftp_cmd(conn, "%s %.*s", oper, filenamelen, filename);
+               if (*filename != '\0')
+                       e = ftp_cmd(conn, "%s %.*s", oper,
+                           filenamelen, filename);
+               else
+                       e = ftp_cmd(conn, "%s", oper);
                if (e != FTP_CONNECTION_ALREADY_OPEN && e != 
FTP_OPEN_DATA_CONNECTION)
                        goto ouch;
 
@@ -1100,6 +1108,7 @@
 {
        conn_t *conn;
        int oflag;
+       char *cp;
 
        /* check if we should use HTTP instead */
        if (purl && strcasecmp(purl->scheme, SCHEME_HTTP) == 0) {
@@ -1124,6 +1133,18 @@
        if (ftp_cwd(conn, url->doc) == -1)
                goto errsock;
 
+       cp = url->doc + strlen(url->doc) - 1;
+       if (cp >= url->doc && *cp == '/') {
+               /* list directory */
+               if (us) {   
+                       us->size = -1;
+                       us->atime = us->mtime = 0;
+               }
+               /* list the directory */
+               return ftp_transfer(conn, "LIST", url->doc, O_RDONLY,
+                       url->offset, flags);
+       }
+
        /* stat file */
        if (us && ftp_stat(conn, url->doc, us) == -1
            && fetchLastErrCode != FETCH_PROTO


--------------050609040308060002090201
Content-Type: application/octet-stream;
 name="patch-ftp.c.sig"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="patch-ftp.c.sig"

iEYEABECAAYFAk1lhtIACgkQWxlAhAje3JuYRQCfSKGOCml2YpxRUt2iexrv9Xlvt2oAnjco
uj3cyQco/Q21D2w7JBMq6DGG
--------------050609040308060002090201--
>Release-Note:
>Audit-Trail:
>Unformatted:
 This is a multi-part message in MIME format.
 --------------050609040308060002090201
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to