ftpd: code shrink

function                                             old     new   delta
MMU:
handle_dir_common                                    354     338     -16
NOMMU:
ftpd_main                                           2437    2442      +5
popen_ls                                             201     174     -27

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-01-17 22:32:22 +01:00
parent 96a6bdcb77
commit 33f9dc08e5

View File

@ -616,18 +616,22 @@ handle_retr(void)
static int static int
popen_ls(const char *opt) popen_ls(const char *opt)
{ {
char *cwd; const char *argv[5];
const char *argv[] = {
"ftpd",
opt,
BB_MMU ? "--" : NULL,
G.ftp_arg,
NULL
};
struct fd_pair outfd; struct fd_pair outfd;
pid_t pid; pid_t pid;
cwd = xrealloc_getcwd_or_warn(NULL); argv[0] = "ftpd";
argv[1] = opt; /* "-l" or "-1" */
#if BB_MMU
argv[2] = "--";
#else
/* NOMMU ftpd ls helper chdirs to argv[2],
* preventing peer from seeing real root. */
argv[2] = xrealloc_getcwd_or_warn(NULL);
#endif
argv[3] = G.ftp_arg;
argv[4] = NULL;
xpiped_pair(outfd); xpiped_pair(outfd);
/*fflush_all(); - so far we dont use stdio on output */ /*fflush_all(); - so far we dont use stdio on output */
@ -638,9 +642,14 @@ popen_ls(const char *opt)
if (pid == 0) { if (pid == 0) {
/* child */ /* child */
#if !BB_MMU #if !BB_MMU
/* On NOMMU, we want to execute a child - copy of ourself.
* In chroot we usually can't do it. Thus we chdir
* out of the chroot back to original root,
* and (see later below) execute bb_busybox_exec_path
* relative to current directory */
if (fchdir(G.root_fd) != 0) if (fchdir(G.root_fd) != 0)
_exit(127); _exit(127);
close(G.root_fd); /*close(G.root_fd); - close_on_exec_on() took care of this */
#endif #endif
/* NB: close _first_, then move fd! */ /* NB: close _first_, then move fd! */
close(outfd.rd); close(outfd.rd);
@ -651,25 +660,23 @@ popen_ls(const char *opt)
* ls won't read it anyway */ * ls won't read it anyway */
close(STDIN_FILENO); close(STDIN_FILENO);
dup(STDOUT_FILENO); /* copy will become STDIN_FILENO */ dup(STDOUT_FILENO); /* copy will become STDIN_FILENO */
#if !BB_MMU #if BB_MMU
/* ftpd ls helper chdirs to argv[2], /* memset(&G, 0, sizeof(G)); - ls_main does it */
* preventing peer from seeing real root we are in now exit(ls_main(ARRAY_SIZE(argv) - 1, (char**) argv));
*/ #else
argv[2] = cwd;
/* + 1: we must use relative path here if in chroot. /* + 1: we must use relative path here if in chroot.
* For example, execv("/proc/self/exe") will fail, since * For example, execv("/proc/self/exe") will fail, since
* it looks for "/proc/self/exe" _relative to chroot!_ */ * it looks for "/proc/self/exe" _relative to chroot!_ */
execv(bb_busybox_exec_path + 1, (char**) argv); execv(bb_busybox_exec_path + 1, (char**) argv);
_exit(127); _exit(127);
#else
/* memset(&G, 0, sizeof(G)); - ls_main does it */
exit(ls_main(ARRAY_SIZE(argv) - 1, (char**) argv));
#endif #endif
} }
/* parent */ /* parent */
close(outfd.wr); close(outfd.wr);
free(cwd); #if !BB_MMU
free((char*)argv[2]);
#endif
return outfd.rd; return outfd.rd;
} }
@ -1108,8 +1115,9 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
opts = getopt32(argv, "l1vS" IF_FEATURE_FTP_WRITE("w") "t:T:", &G.timeout, &abs_timeout, &G.verbose, &verbose_S); opts = getopt32(argv, "l1vS" IF_FEATURE_FTP_WRITE("w") "t:T:", &G.timeout, &abs_timeout, &G.verbose, &verbose_S);
if (opts & (OPT_l|OPT_1)) { if (opts & (OPT_l|OPT_1)) {
/* Our secret backdoor to ls */ /* Our secret backdoor to ls */
/* TODO: pass -n too? */ /* TODO: pass -n? It prevents user/group resolution, whicj may not work in chroot anyway */
/* --group-directories-first would be nice, but ls don't do that yet */ /* TODO: pass -A? It shows dot files */
/* TODO: pass --group-directories-first? would be nice, but ls don't do that yet */
xchdir(argv[2]); xchdir(argv[2]);
argv[2] = (char*)"--"; argv[2] = (char*)"--";
/* memset(&G, 0, sizeof(G)); - ls_main does it */ /* memset(&G, 0, sizeof(G)); - ls_main does it */
@ -1151,6 +1159,7 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
#if !BB_MMU #if !BB_MMU
G.root_fd = xopen("/", O_RDONLY | O_DIRECTORY); G.root_fd = xopen("/", O_RDONLY | O_DIRECTORY);
close_on_exec_on(G.root_fd);
#endif #endif
if (argv[optind]) { if (argv[optind]) {