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>
This commit is contained in:
Denys Vlasenko 2014-06-26 12:07:48 +02:00
parent 2a870d091e
commit 0b0ccd4570

View File

@ -709,6 +709,7 @@ handle_dir_common(int opts)
* which can be problematic in chroot */ * which can be problematic in chroot */
ls_fd = popen_ls((opts & LONG_LISTING) ? "-l" : "-1"); ls_fd = popen_ls((opts & LONG_LISTING) ? "-l" : "-1");
ls_fp = xfdopen_for_read(ls_fd); ls_fp = xfdopen_for_read(ls_fd);
/* FIXME: filenames with embedded newlines are mishandled */
if (opts & USE_CTRL_CONN) { if (opts & USE_CTRL_CONN) {
/* STAT <filename> */ /* STAT <filename> */
@ -729,16 +730,20 @@ handle_dir_common(int opts)
int remote_fd = get_remote_transfer_fd(" Directory listing"); int remote_fd = get_remote_transfer_fd(" Directory listing");
if (remote_fd >= 0) { if (remote_fd >= 0) {
while (1) { while (1) {
line = xmalloc_fgetline(ls_fp); unsigned len;
line = xmalloc_fgets(ls_fp);
if (!line) if (!line)
break; break;
/* I've seen clients complaining when they /* I've seen clients complaining when they
* are fed with ls output with bare '\n'. * are fed with ls output with bare '\n'.
* Pity... that would be much simpler. * Replace trailing "\n\0" with "\r\n".
*/ */
/* TODO: need to s/LF/NUL/g here */ len = strlen(line);
xwrite_str(remote_fd, line); if (len != 0) /* paranoia check */
xwrite(remote_fd, "\r\n", 2); line[len - 1] = '\r';
line[len] = '\n';
xwrite(remote_fd, line, len + 1);
free(line); free(line);
} }
} }