From 34ff0d8d259088a6c17f07590d524bd9334a59a2 Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Wed, 4 Jan 2023 00:36:58 -0600 Subject: server: add server control functions Add functions that initialize and control the server listening socket. Signed-off-by: Danny Holman --- server/include/server.h | 11 ++++++++++ server/src/server.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 server/include/server.h create mode 100644 server/src/server.c diff --git a/server/include/server.h b/server/include/server.h new file mode 100644 index 0000000..8bd0b94 --- /dev/null +++ b/server/include/server.h @@ -0,0 +1,11 @@ +#ifndef MRAT_SERVER_H +#define MRAT_SERVER_H + +#include + +void* control_listener(void *port); +void* control_worker(void *sock_desc); +void* listener(void *port); +void* worker(void *sock_desc); + +#endif diff --git a/server/src/server.c b/server/src/server.c new file mode 100644 index 0000000..cc6dbaf --- /dev/null +++ b/server/src/server.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +void* listener(void *port) { + uint16_t port_num = *(int*)port; + int server_sock = socket(PF_INET, SOCK_STREAM, 0); + struct sockaddr_in client_name; + unsigned int client_name_len = sizeof(client_name); + + struct sockaddr_in name; + memset(&name, 0, sizeof(name)); + name.sin_family = AF_INET; + name.sin_port = htons(port_num); + name.sin_addr.s_addr = htons(INADDR_ANY); + if (bind(server_sock, (struct sockaddr*)&name, sizeof(name)) < 0) { + log_msg(LOG_SEVERE, "Cannot bind to port %d\n", port_num); + return NULL; + } + listen(server_sock, 5); + log_msg(LOG_INFO, "Mini-RAT running on port %d\n", port_num); + + int client_sock = 0; + pthread_t newthread; + while (client_sock = accept(server_sock, (struct sockaddr*)&client_name, &client_name_len)) { + pthread_create(&newthread, NULL, worker, (void*)&client_sock); + pthread_detach(newthread); + } + + close_logfile(); + close(server_sock); +} + +int perform_handshake(int socket) { + // TODO: call openssl stuff here + return 0; +} + +void* worker(void *sock_desc) { + int sock = *(int*)sock_desc; + if (perform_handshake(sock) != 0) + return NULL; + + int id = init_session(sock); + log_msg(LOG_INFO, "New session created with ID=%d\n", id); + // TODO: keep the client from timing out + + close(sock); + return 0; +} -- cgit v1.2.3