aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2014-06-26 12:07:48 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2014-06-26 12:07:48 +0200
commit0b0ccd457016d6a4eaa3e79bd65a852ea7d4294b (patch)
tree88a66fea6596f6ef6426b8590e2ca348da7ba50c
parent2a870d091e86687c8b7b9e14b9c75815d40d7053 (diff)
downloadbusybox-w32-0b0ccd457016d6a4eaa3e79bd65a852ea7d4294b.tar.gz
busybox-w32-0b0ccd457016d6a4eaa3e79bd65a852ea7d4294b.tar.bz2
busybox-w32-0b0ccd457016d6a4eaa3e79bd65a852ea7d4294b.zip
ftpd: optimize writes of LIST results a bit
function old new delta handle_dir_common 201 207 +6 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/ftpd.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/networking/ftpd.c b/networking/ftpd.c
index b4d73e55d..e724734df 100644
--- a/networking/ftpd.c
+++ b/networking/ftpd.c
@@ -709,6 +709,7 @@ handle_dir_common(int opts)
709 * which can be problematic in chroot */ 709 * which can be problematic in chroot */
710 ls_fd = popen_ls((opts & LONG_LISTING) ? "-l" : "-1"); 710 ls_fd = popen_ls((opts & LONG_LISTING) ? "-l" : "-1");
711 ls_fp = xfdopen_for_read(ls_fd); 711 ls_fp = xfdopen_for_read(ls_fd);
712/* FIXME: filenames with embedded newlines are mishandled */
712 713
713 if (opts & USE_CTRL_CONN) { 714 if (opts & USE_CTRL_CONN) {
714 /* STAT <filename> */ 715 /* STAT <filename> */
@@ -729,16 +730,20 @@ handle_dir_common(int opts)
729 int remote_fd = get_remote_transfer_fd(" Directory listing"); 730 int remote_fd = get_remote_transfer_fd(" Directory listing");
730 if (remote_fd >= 0) { 731 if (remote_fd >= 0) {
731 while (1) { 732 while (1) {
732 line = xmalloc_fgetline(ls_fp); 733 unsigned len;
734
735 line = xmalloc_fgets(ls_fp);
733 if (!line) 736 if (!line)
734 break; 737 break;
735 /* I've seen clients complaining when they 738 /* I've seen clients complaining when they
736 * are fed with ls output with bare '\n'. 739 * are fed with ls output with bare '\n'.
737 * Pity... that would be much simpler. 740 * Replace trailing "\n\0" with "\r\n".
738 */ 741 */
739/* TODO: need to s/LF/NUL/g here */ 742 len = strlen(line);
740 xwrite_str(remote_fd, line); 743 if (len != 0) /* paranoia check */
741 xwrite(remote_fd, "\r\n", 2); 744 line[len - 1] = '\r';
745 line[len] = '\n';
746 xwrite(remote_fd, line, len + 1);
742 free(line); 747 free(line);
743 } 748 }
744 } 749 }