X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ftpd.c;h=b35a9a04b1509d638204dd34061ba87c41420a6f;hb=9e83a47a9d9bd9a8020a80393e1f0e03bb34efe7;hp=757c109e677d88091e8b513e9f16124f27d1e695;hpb=85c74b6283f53e8deeab46354a4d3971039b6d56;p=betaftpd diff --git a/ftpd.c b/ftpd.c index 757c109..b35a9a0 100644 --- a/ftpd.c +++ b/ftpd.c @@ -112,6 +112,10 @@ #include #endif +#if HAVE_LINUX_TCP_H +#include +#endif + #if HAVE_MMAP #include #endif @@ -198,6 +202,10 @@ fd_set master_fds, master_send_fds; FILE *xferlog = NULL; #endif +#if HAVE_LINUX_SENDFILE +int sendfile_supported = 1; +#endif + /* * This variable specifies if it's soon time to check for timed out * clients, and timed out directory listing cache entries. It is @@ -557,7 +565,7 @@ void destroy_dcache(struct dcache * const d) /* * process_all_clients(): - * Processes all the control connections in active_clients + * Processes all the _control_ connections in active_clients * (normally returned from a select(), there are at max * NUM_AC active connections in the set), sending them * through to the command parser if a command has been @@ -579,7 +587,7 @@ int process_all_clients(const fd_set * const active_clients, const int num_ac) c = next; next = c->next_conn; #if HAVE_POLL - if (!fds[c->sock].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) { + if ((fds[c->sock].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) == 0) { continue; } #else @@ -620,7 +628,6 @@ int process_all_clients(const fd_set * const active_clients, const int num_ac) if (fds[c->sock].revents & (POLLERR|POLLHUP|POLLNVAL)) { destroy_conn(c); - continue; } } return checked_through; @@ -791,11 +798,7 @@ int do_download(struct ftran *f) * Here we use a rather simplified sending `algorithm', * leaving most of the quirks to the system calls. */ - if (f->dir_listing == 0 -#if WANT_UPLOAD - && f->upload == 0 -#endif - ) { + if (sendfile_supported == 1 && f->dir_listing == 0) { int err; size = f->size - f->pos; @@ -1002,6 +1005,19 @@ int main(void) alarm(60); signal(SIGALRM, handle_alarm); +#if HAVE_LINUX_SENDFILE + /* check that sendfile() is really implemented (same check as configure does) */ + { + int out_fd = 1, in_fd = 0; + off_t offset = 0; + size_t size = 1024; + + errno = 0; + sendfile(out_fd, in_fd, &offset, size); + if (errno == ENOSYS) sendfile_supported = 0; + } +#endif + for ( ;; ) { int i; #ifndef HAVE_POLL @@ -1378,7 +1394,7 @@ void init_file_transfer(struct ftran * const f) #if HAVE_MMAP if (f->dir_listing == 0) { #if HAVE_LINUX_SENDFILE - int do_mmap = 0; + int do_mmap = (sendfile_supported) ? 0 : 1; #else int do_mmap = 1; #endif