Index: filed.c ================================================================== --- filed.c +++ filed.c @@ -12,11 +12,11 @@ #include #include /* Default values */ #define MAX_FAILURE_COUNT 30 -#define PORT 8080 +#define PORT 8081 #define THREAD_COUNT 10 #define BIND_ADDR "::" /* Arguments for worker threads */ struct filed_worker_thread_args { @@ -100,25 +100,32 @@ } return(fd); } +/* Log a message */ +#define FILED_DONT_LOG +#ifdef FILED_DONT_LOG +# define filed_logging_thread_init() 0 +# define filed_log_msg_debug(x, ...) /**/ +# define filed_log_msg(x) /**/ +#else /* Initialize logging thread */ static int filed_logging_thread_init(void) { /* XXX:TODO: Unimplemented */ return(0); } -/* Log a message */ #define filed_log_msg_debug(x, ...) { fprintf(stderr, x, __VA_ARGS__); fprintf(stderr, "\n"); fflush(stderr); } static void filed_log_msg(const char *buffer) { /* XXX:TODO: Unimplemented */ fprintf(stderr, "%s\n", buffer); return; } +#endif /* Format time per RFC2616 */ static char *filed_format_time(char *buffer, size_t buffer_len, const time_t timeinfo) { struct tm timeinfo_tm, *timeinfo_tm_p; timeinfo_tm_p = gmtime_r(&timeinfo, &timeinfo_tm); @@ -294,10 +301,11 @@ /* Handle a single request from a client */ static void filed_handle_client(int fd) { struct filed_fileinfo *fileinfo, fileinfo_b; ssize_t sendfile_ret; + size_t sendfile_len; off_t sendfile_offset; char *path, path_b[1010]; char *date_current, date_current_b[64]; FILE *fp; @@ -343,16 +351,24 @@ filed_log_msg("PROCESS_REPLY_COMPLETE FD=... STATUS=200"); filed_log_msg("SEND_START IFD=... OFD=... BYTES=..."); sendfile_offset = 0; - sendfile_ret = sendfile(fd, fileinfo->fd, &sendfile_offset, fileinfo->len); - if (sendfile_ret < 0 || ((size_t) sendfile_ret) != fileinfo->len) { - filed_log_msg("SEND_COMPLETE STATUS=ERROR IFD=... OFD=... BYTES=... BYTES_SENT=..."); - } else { - filed_log_msg("SEND_COMPLETE STATUS=OK IFD=... OFD=... BYTES=..."); + sendfile_len = fileinfo->len; + while (1) { + sendfile_ret = sendfile(fd, fileinfo->fd, &sendfile_offset, sendfile_len); + if (sendfile_ret <= 0) { + break; + } + + sendfile_len -= sendfile_ret; + if (sendfile_len == 0) { + break; + } } + + filed_log_msg("SEND_COMPLETE STATUS=... IFD=... OFD=... BYTES=... BYTES_SENT=..."); close(fileinfo->fd); filed_log_msg("CLOSE_FILE FD=..."); } @@ -464,16 +480,24 @@ return(3); } /* Create logging thread */ - /* XXX:TODO: Check for errors */ - filed_logging_thread_init(); + init_ret = filed_logging_thread_init(); + if (init_ret != 0) { + perror("filed_logging_thread_init"); + + return(4); + } /* Create worker threads */ - /* XXX:TODO: Check for errors */ - filed_worker_threads_init(fd, thread_count); + init_ret = filed_worker_threads_init(fd, thread_count); + if (init_ret != 0) { + perror("filed_worker_threads_init"); + + return(4); + } /* Wait for threads to exit */ /* XXX:TODO: Monitor thread usage */ while (1) { sleep(60);