Index: filed.c ================================================================== --- filed.c +++ filed.c @@ -1,12 +1,16 @@ +#include #include #include #include #include +#include #include #include #include +#include +#include /* Default values */ #define MAX_FAILURE_COUNT 30 #define PORT 8080 #define THREAD_COUNT 10 @@ -60,13 +64,79 @@ static int filed_logging_thread_init(void) { /* XXX:TODO: Unimplemented */ return(0); } -static void filed_handle_client(int fd) { +struct filed_fileinfo { + int fd; + size_t len; +}; + +static struct filed_fileinfo *filed_open_file(const char *path, struct filed_fileinfo *buffer) { + /* XXX:TODO: Cache file descriptors */ + + off_t len; + int fd; + + fd = open(path, O_RDONLY); + if (fd < 0) { + return(NULL); + } + + len = lseek(fd, 0, SEEK_END); + lseek(fd, 0, SEEK_SET); + + buffer->fd = fd; + buffer->len = len; + + return(buffer); +} + +static char *filed_get_http_request(FILE *fp, char *buffer, size_t buffer_len) { /* XXX:TODO: Unimplemented */ - fd = fd; + setlinebuf(fp); + + fp = fp; + buffer = buffer; + buffer_len = buffer_len; + + fflush(fp); + + return("./hello_world.txt"); +} + +static void filed_handle_client(int fd) { + struct filed_fileinfo *fileinfo, fileinfo_b; + char *path, path_b[1010]; + FILE *fp; + + fp = fdopen(fd, "w+b"); + if (fp == NULL) { + close(fd); + + return; + } + + path = filed_get_http_request(fp, path_b, sizeof(path_b)); + if (path == NULL) { + fclose(fp); + + return; + } + + fileinfo = filed_open_file(path, &fileinfo_b); + if (fileinfo == NULL) { + /* XXX: TODO: Return error page */ + } else { + /* XXX: TODO: Send HTTP response header */ + sendfile(fd, fileinfo->fd, NULL, fileinfo->len); + + close(fileinfo->fd); + } + + fclose(fp); + return; } static void *filed_worker_thread(void *arg_v) { struct filed_worker_thread_args *arg; @@ -103,13 +173,10 @@ /* Reset failure count*/ failure_count = 0; /* Handle socket */ filed_handle_client(fd); - - /* Cleanup */ - close(fd); } /* XXX:TODO: Report error */ return(NULL); } @@ -144,10 +211,12 @@ argv = argv; /* Create listening socket */ fd = filed_listen(bind_addr, port); if (fd < 0) { + perror("filed_listen"); + return(1); } /* Become a daemon */ /* XXX:TODO: Become a daemon */