diff --git a/include/server/server.h b/include/server/server.h index ba8c947..e308a55 100644 --- a/include/server/server.h +++ b/include/server/server.h @@ -31,14 +31,14 @@ typedef struct cws_server { cws_config_s *config; } cws_server_s; -cws_server_ret cws_server_setup(cws_config_s *config, cws_server_s *server); +cws_server_ret cws_server_setup(cws_server_s *server, cws_config_s *config); -cws_server_ret cws_server_loop(cws_server_s *server); +cws_server_ret cws_server_start(cws_server_s *server); void cws_server_shutdown(cws_server_s *server); int cws_server_handle_new_client(int server_fd); -int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa, socklen_t *theirsa_size); +int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa); #endif diff --git a/include/server/worker.h b/include/server/worker.h index 582fac2..4e851d0 100644 --- a/include/server/worker.h +++ b/include/server/worker.h @@ -26,7 +26,7 @@ void *cws_worker_loop(void *arg); void cws_server_close_client(int epfd, int client_fd); -cws_server_ret cws_epoll_add(int epfd, int sockfd, uint32_t events); +cws_server_ret cws_epoll_add(int epfd, int sockfd); cws_server_ret cws_epoll_del(int epfd, int sockfd); diff --git a/src/http/http.c b/src/http/http.c index 639a0fc..a2eb10d 100644 --- a/src/http/http.c +++ b/src/http/http.c @@ -1,3 +1,5 @@ +#define _XOPEN_SOURCE 1 + #include "http/http.h" #include diff --git a/src/main.c b/src/main.c index 4725942..a516750 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 700 +#define _XOPEN_SOURCE 1 #include #include @@ -32,13 +32,13 @@ int main(void) { } cws_server_s server; - cws_server_ret ret = cws_server_setup(config, &server); + cws_server_ret ret = cws_server_setup(&server, config); if (ret != CWS_SERVER_OK) { CWS_LOG_ERROR("Unable to setup web server"); } CWS_LOG_INFO("Running cws on http://%s:%s...", config->hostname, config->port); - ret = cws_server_loop(&server); + ret = cws_server_start(&server); if (ret != CWS_SERVER_OK) { CWS_LOG_ERROR("Unable to start web server"); } diff --git a/src/server/server.c b/src/server/server.c index 3ae6395..2cbbe61 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -38,13 +38,13 @@ static cws_server_ret cws_server_setup_epoll(int server_fd, int *epfd_out) { return ret; } - cws_epoll_add(epfd, server_fd, EPOLLIN); + cws_epoll_add(epfd, server_fd); *epfd_out = epfd; return CWS_SERVER_OK; } -cws_server_ret cws_server_setup(cws_config_s *config, cws_server_s *server) { +cws_server_ret cws_server_setup(cws_server_s *server, cws_config_s *config) { if (!config || !config->hostname || !config->port) { return CWS_SERVER_CONFIG; } @@ -103,7 +103,7 @@ cws_server_ret cws_server_setup(cws_config_s *config, cws_server_s *server) { return CWS_SERVER_OK; } -cws_server_ret cws_server_loop(cws_server_s *server) { +cws_server_ret cws_server_start(cws_server_s *server) { struct epoll_event events[128]; memset(events, 0, sizeof(events)); int client_fd = 0; @@ -141,10 +141,9 @@ cws_server_ret cws_server_loop(cws_server_s *server) { int cws_server_handle_new_client(int server_fd) { struct sockaddr_storage their_sa; - socklen_t theirsa_size = sizeof their_sa; char ip[INET_ADDRSTRLEN]; - int client_fd = cws_server_accept_client(server_fd, &their_sa, &theirsa_size); + int client_fd = cws_server_accept_client(server_fd, &their_sa); if (client_fd < 0) { return client_fd; } @@ -155,8 +154,9 @@ int cws_server_handle_new_client(int server_fd) { return client_fd; } -int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa, socklen_t *theirsa_size) { - const int client_fd = accept(server_fd, (struct sockaddr *)their_sa, theirsa_size); +int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa) { + socklen_t theirsa_size = sizeof(struct sockaddr_storage); + const int client_fd = accept(server_fd, (struct sockaddr *)their_sa, &theirsa_size); if (client_fd == -1) { if (errno != EWOULDBLOCK) { diff --git a/src/server/worker.c b/src/server/worker.c index 3a681b4..e797804 100644 --- a/src/server/worker.c +++ b/src/server/worker.c @@ -25,7 +25,7 @@ static int cws_worker_setup_epoll(cws_worker_s *worker) { return -1; } - ret = cws_epoll_add(worker->epfd, worker->pipefd[0], EPOLLIN); + ret = cws_epoll_add(worker->epfd, worker->pipefd[0]); if (ret != CWS_SERVER_OK) { sock_close(worker->epfd); sock_close(worker->pipefd[0]); @@ -34,6 +34,41 @@ static int cws_worker_setup_epoll(cws_worker_s *worker) { return 0; } +static size_t cws_read_data(int sockfd, string_s **str) { + size_t total_bytes = 0; + ssize_t bytes_read; + + if (*str == NULL) { + *str = string_new("", 4096); + } + + char tmp[4096]; + memset(tmp, 0, sizeof(tmp)); + + while (1) { + bytes_read = recv(sockfd, tmp, sizeof(tmp), 0); + + if (bytes_read == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + break; + } else if (errno == ECONNRESET) { + return 0; + } + + CWS_LOG_ERROR("recv(): %s", strerror(errno)); + + return -1; + } else if (bytes_read == 0) { + return -1; + } + + total_bytes += bytes_read; + string_append(*str, tmp); + } + + return total_bytes; +} + cws_worker_s **cws_worker_new(size_t workers_num, cws_config_s *config) { cws_worker_s **workers = malloc(sizeof(cws_worker_s) * workers_num); if (workers == NULL) { @@ -113,7 +148,7 @@ void *cws_worker_loop(void *arg) { int client_fd; read(worker->pipefd[0], &client_fd, sizeof(int)); cws_fd_set_nonblocking(client_fd); - cws_epoll_add(worker->epfd, client_fd, EPOLLIN | EPOLLET); + cws_epoll_add(worker->epfd, client_fd); } else { /* Handle client data */ int client_fd = events[i].data.fd; @@ -130,9 +165,9 @@ void cws_server_close_client(int epfd, int client_fd) { sock_close(client_fd); } -cws_server_ret cws_epoll_add(int epfd, int sockfd, uint32_t events) { +cws_server_ret cws_epoll_add(int epfd, int sockfd) { struct epoll_event event; - event.events = events; + event.events = EPOLLIN | EPOLLET; event.data.fd = sockfd; const int status = epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &event); @@ -155,43 +190,7 @@ cws_server_ret cws_epoll_del(int epfd, int sockfd) { return CWS_SERVER_OK; } -static size_t cws_read_data(int sockfd, string_s **str) { - size_t total_bytes = 0; - ssize_t bytes_read; - - if (*str == NULL) { - *str = string_new("", 4096); - } - - char tmp[4096]; - memset(tmp, 0, sizeof(tmp)); - - while (1) { - bytes_read = recv(sockfd, tmp, sizeof(tmp), 0); - - if (bytes_read == -1) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { - break; - } else if (errno == ECONNRESET) { - return 0; - } - - CWS_LOG_ERROR("recv(): %s", strerror(errno)); - - return -1; - } else if (bytes_read == 0) { - return -1; - } - - total_bytes += bytes_read; - string_append(*str, tmp); - } - - return total_bytes; -} - cws_server_ret cws_server_handle_client_data(int epfd, int client_fd) { - /* Read data from socket */ string_s *data; size_t total_bytes = cws_read_data(client_fd, &data); if (total_bytes <= 0) { @@ -203,7 +202,6 @@ cws_server_ret cws_server_handle_client_data(int epfd, int client_fd) { return CWS_SERVER_CLIENT_DISCONNECTED_ERROR; } - /* Parse HTTP request */ cws_http_s *request = cws_http_parse(data, client_fd); string_free(data);