diff options
Diffstat (limited to 'src/server/server.c')
-rw-r--r-- | src/server/server.c | 112 |
1 files changed, 71 insertions, 41 deletions
diff --git a/src/server/server.c b/src/server/server.c index c8975ee..27cc9d9 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -1,25 +1,67 @@ -#define _POSIX_SOURCE +#define _POSIX_C_SOURCE 200809L #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> +#include <pthread.h> #include "addr.h" #include "server.h" #include "resolver.h" #include "../io/log.h" +#include "../io/map.h" +#include "../io/config.h" -static pid_t udp, tcp; +static pthread_t udp, tcp; +static RecordMap map; void server_init(uint16_t port, Server* server) { INFO("Server port set to %hu", port); create_binding(UDP, port, &server->udp); create_binding(TCP, port, &server->tcp); + load_config("config", &map); } -static void server_listen(Binding* binding) { +struct DnsRequest { + Connection connection; + Packet request; +}; + +static void* server_respond(void* arg) { + struct DnsRequest req = *(struct DnsRequest*) arg; + + INFO("Recieved packet request ID %hu", req.request.header.id); + + Packet response; + handle_query(&req.request, &response, req.connection.type, &map); + + if (!write_connection(&req.connection, &response)) { + ERROR("Faled to respond to connection ID %hu: %s", + req.request.header.id, + strerror(errno) + ); + } + + free_packet(&req.request); + free_connection(&req.connection); + + if (response.header.z == false) { + free_packet(&response); + } else { + // Dont free from config + free(response.questions); + free(response.answers); + free(response.authorities); + free(response.resources); + } + + return NULL; +} + +static void* server_listen(void* arg) { + Binding* binding = (Binding*) arg; while(1) { Connection connection; @@ -34,67 +76,55 @@ static void server_listen(Binding* binding) { free_connection(&connection); continue; } + + struct DnsRequest req; + req.connection = connection; + req.request = request; - if(fork() != 0) { + pthread_t thread; + if(pthread_create(&thread, NULL, &server_respond, &req)) { + ERROR("Failed to create thread for dns request ID %hu: %s", + request.header.id, + strerror(errno) + ); free_packet(&request); free_connection(&connection); continue; } - - INFO("Recieved packet request ID %hu", request.header.id); - - Packet response; - handle_query(&request, &response, connection.type); - - if (!write_connection(&connection, &response)) { - ERROR("Failed to respond to connection ID %hu: %s", request.header.id, strerror(errno)); - } - - free_packet(&request); - free_packet(&response); - free_connection(&connection); - exit(EXIT_SUCCESS); } + + return NULL; } static void signal_handler() { printf("\n"); - kill(udp, SIGTERM); - kill(tcp, SIGTERM); + pthread_kill(udp, SIGTERM); + pthread_kill(tcp, SIGTERM); } void server_run(Server* server) { - if ((udp = fork()) == 0) { + if (!pthread_create(&udp, NULL, &server_listen, &server->udp)) { INFO("Listening for connections on UDP"); - server_listen(&server->udp); - exit(EXIT_SUCCESS); + } else { + ERROR("Failed to start UDP thread"); + exit(EXIT_FAILURE); } - if ((tcp = fork()) == 0) { + if (!pthread_create(&tcp, NULL, &server_listen, &server->tcp)) { INFO("Listening for connections on TCP"); - server_listen(&server->tcp); - exit(EXIT_SUCCESS); - } - - signal(SIGINT, signal_handler); - - int status; - waitpid(udp, &status, 0); - if (status == 0) { - INFO("UDP process closed successfully"); } else { - ERROR("UDP process failed with error code %d", status); + ERROR("Failed to start TCP thread"); + exit(EXIT_FAILURE); } + signal(SIGINT, signal_handler); - waitpid(tcp, &status, 0); - if (status == 0) { - INFO("TCP process closed successfully"); - } else { - ERROR("TCP process failed with error code %d", status); - } + pthread_join(udp, NULL); + pthread_join(tcp, NULL); } void server_free(Server* server) { free_binding(&server->udp); free_binding(&server->tcp); + record_map_free(&map); } + |