summaryrefslogtreecommitdiff
path: root/src/server/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/server.c')
-rw-r--r--src/server/server.c112
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);
}
+