Hello,

At least OpenBSD-6.5 and 6.6's ftpd does not work NLIST command with any
-option like this.

----
ftp> nlist
150 Opening ASCII mode data connection for 'file list'.
uaa
_sysupgrade
226 Transfer complete.
ftp> nlist -LF
550 -LF: No such file or directory.
ftp>
----

Here is the remedy, ok?

Index: extern.h
===================================================================
RCS file: /cvs/src/libexec/ftpd/extern.h,v
retrieving revision 1.20
diff -u -p -r1.20 extern.h
--- extern.h    8 May 2019 23:56:48 -0000       1.20
+++ extern.h    18 Nov 2019 05:48:53 -0000
@@ -89,7 +89,7 @@ void  renamecmd(char *, char *);
 char   *renamefrom(char *);
 void   reply(int, const char *, ...);
 void   reply_r(int, const char *, ...);
-enum ret_cmd { RET_FILE, RET_LIST };
+enum ret_cmd { RET_FILE, RET_LIST, RET_NLIST };
 void   retrieve(enum ret_cmd, char *);
 void   send_file_list(char *);
 void   setproctitle(const char *, ...);
Index: ftpd.c
===================================================================
RCS file: /cvs/src/libexec/ftpd/ftpd.c,v
retrieving revision 1.228
diff -u -p -r1.228 ftpd.c
--- ftpd.c      3 Jul 2019 03:24:04 -0000       1.228
+++ ftpd.c      18 Nov 2019 05:48:53 -0000
@@ -1124,7 +1124,10 @@ retrieve(enum ret_cmd cmd, char *name)
                fin = fopen(name, "r");
                st.st_size = 0;
        } else {
-               fin = ftpd_ls("-lgA", name, &pid);
+               if (cmd == RET_NLIST)
+                       fin = ftpd_ls(name, ".", &pid);
+               else
+                       fin = ftpd_ls("-lgA", name, &pid);
                st.st_size = -1;
                st.st_blksize = BUFSIZ;
        }
@@ -1166,7 +1169,8 @@ retrieve(enum ret_cmd cmd, char *name)
                        goto done;
                }
        }
-       dout = dataconn(name, st.st_size, "w");
+       dout = dataconn((cmd == RET_NLIST) ? "file list" : name,
+                       st.st_size, "w");
        if (dout == NULL)
                goto done;
        time(&start);
@@ -2626,7 +2630,7 @@ send_file_list(char *whichf)
                         */
                        if (dirname[0] == '-' && *dirlist == NULL &&
                            transflag == 0) {
-                               retrieve(RET_FILE, dirname);
+                               retrieve(RET_NLIST, dirname);
                                goto out;
                        }
                        perror_reply(550, whichf);

-- 
SASANO Takayoshi (JG1UAA) <[email protected]>

Reply via email to