ftpd/ls: show directories first
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 25 Jan 2017 03:52:45 +0000 (04:52 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 25 Jan 2017 03:52:45 +0000 (04:52 +0100)
Old TODO finally done

function                                             old     new   delta
ls_main                                              548     568     +20
packed_usage                                       31116   31097     -19

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/ls.c
networking/ftpd.c

index a858a3217d7f680066798d7f0c1613dd64e4465d..6e0a52d754d3e86e7126205c6cc98fe72c9ccc7f 100644 (file)
@@ -1045,7 +1045,7 @@ static void scan_and_display_dirs_recur(struct dnode **dn, int first)
 
 
 int ls_main(int argc UNUSED_PARAM, char **argv)
-{
+{      /*      ^^^^^^^^^^^^^^^^^ note: if FTPD, argc can be wrong, see ftpd.c */
        struct dnode **dnd;
        struct dnode **dnf;
        struct dnode **dnp;
@@ -1175,6 +1175,11 @@ int ls_main(int argc UNUSED_PARAM, char **argv)
        if (!(option_mask32 & (OPT_l|OPT_1|OPT_x|OPT_C)))
                option_mask32 |= (isatty(STDOUT_FILENO) ? OPT_C : OPT_1);
 
+       if (ENABLE_FTPD && applet_name[0] == 'f') {
+               /* ftpd secret backdoor. dirs first are much nicer */
+               option_mask32 |= OPT_dirs_first;
+       }
+
        argv += optind;
        if (!argv[0])
                *--argv = (char*)".";
index 104d414decc6a1fcfbfcd02c89a247d1b63da185..439608ce6bbfe621118b55799a70cc220c71a6ce 100644 (file)
 //usage:       "Can be run from tcpsvd:\n"
 //usage:       "       tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve\n"
 //usage:     "\n       -w      Allow upload"
-//usage:     "\n       -v      Log errors to stderr. -vv: verbose log"
-//usage:     "\n       -S      Log errors to syslog. -SS: verbose log"
 //usage:       IF_FEATURE_FTPD_AUTHENTICATION(
 //usage:     "\n       -a USER Enable 'anonymous' login and map it to USER"
 //usage:       )
-//usage:     "\n       -t,-T   Idle and absolute timeouts"
+//usage:     "\n       -v      Log errors to stderr. -vv: verbose log"
+//usage:     "\n       -S      Log errors to syslog. -SS: verbose log"
+//usage:     "\n       -t,-T N Idle and absolute timeout"
 
 #include "libbb.h"
 #include "common_bufsiz.h"
@@ -701,7 +701,7 @@ popen_ls(const char *opt)
                dup(STDOUT_FILENO); /* copy will become STDIN_FILENO */
 #if BB_MMU
                /* memset(&G, 0, sizeof(G)); - ls_main does it */
-               exit(ls_main(ARRAY_SIZE(argv) - 1, (char**) argv));
+               exit(ls_main(/*argc_unused*/ 0, (char**) argv));
 #else
                cur_fd = xopen(".", O_RDONLY | O_DIRECTORY);
                /* On NOMMU, we want to execute a child - copy of ourself
@@ -1152,11 +1152,7 @@ enum {
 };
 
 int ftpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-#if !BB_MMU
-int ftpd_main(int argc, char **argv)
-#else
 int ftpd_main(int argc UNUSED_PARAM, char **argv)
-#endif
 {
 #if ENABLE_FEATURE_FTPD_AUTHENTICATION
        struct passwd *pw = NULL;
@@ -1184,11 +1180,10 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
                &G.verbose, &verbose_S);
        if (opts & (OPT_l|OPT_1)) {
                /* Our secret backdoor to ls */
-/* TODO: pass --group-directories-first? */
                if (fchdir(3) != 0)
                        _exit(127);
                /* memset(&G, 0, sizeof(G)); - ls_main does it */
-               return ls_main(argc, argv);
+               return ls_main(/*argc_unused*/ 0, argv);
        }
 #endif
        if (G.verbose < verbose_S)