Index: filed.c ================================================================== --- filed.c +++ filed.c @@ -10,10 +10,11 @@ #include #include #include #include #include +#include #include /* Default values */ #define MAX_FAILURE_COUNT 30 #define PORT 8080 @@ -464,20 +465,64 @@ } fprintf(fp, "\r\n"); fflush(fp); filed_log_msg("PROCESS_REPLY_COMPLETE FD=... STATUS=20X"); + +#ifdef FILED_NONBLOCK_HTTP + int socket_flags; + fd_set rfd, wfd; + char sinkbuf[8192]; + ssize_t read_ret; + + FD_ZERO(&rfd); + FD_ZERO(&wfd); + FD_SET(fd, &rfd); + FD_SET(fd, &wfd); + + socket_flags = fcntl(fd, F_GETFL); + fcntl(fd, F_SETFL, socket_flags | O_NONBLOCK); +#endif filed_log_msg("SEND_START IFD=... OFD=... BYTES=..."); sendfile_offset = request->headers.range.offset; sendfile_len = request->headers.range.length; sendfile_sent = 0; while (1) { sendfile_ret = sendfile(fd, fileinfo->fd, &sendfile_offset, sendfile_len); if (sendfile_ret <= 0) { +#ifdef FILED_NONBLOCK_HTTP + if (errno == EAGAIN) { + sendfile_ret = 0; + + while (1) { + select(fd + 1, &rfd, &wfd, NULL, NULL); + if (FD_ISSET(fd, &rfd)) { + read_ret = read(fd, sinkbuf, sizeof(sinkbuf)); + + if (read_ret <= 0) { + break; + } + } + + if (FD_ISSET(fd, &wfd)) { + read_ret = 1; + + break; + } + } + + if (read_ret <= 0) { + break; + } + } else { + break; + } +#else break; +#endif } sendfile_len -= sendfile_ret; sendfile_sent += sendfile_ret; if (sendfile_len == 0) {