From e3b9f1f48848fb8962046c84edd90cd0d5cf74bb Mon Sep 17 00:00:00 2001 From: atxr Date: Mon, 26 Feb 2024 10:20:50 +0100 Subject: [PATCH] Add mineziperd server --- mineziper/CMakeLists.txt | 18 +++----- mineziper/{src => }/mineziper.c | 0 mineziper/mineziperd.c | 77 +++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 13 deletions(-) rename mineziper/{src => }/mineziper.c (100%) create mode 100644 mineziper/mineziperd.c diff --git a/mineziper/CMakeLists.txt b/mineziper/CMakeLists.txt index 3311cf0..8bee269 100644 --- a/mineziper/CMakeLists.txt +++ b/mineziper/CMakeLists.txt @@ -1,14 +1,6 @@ -set(mineziper_STATIC_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src) -set(mineziper_STATIC_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/include) - -# mineziper sources -set(mineziper_SRC - ${mineziper_STATIC_SRC}/mineziper.c -) - -set(mineziper_INCLUDE -) - -add_executable(mineziper ${mineziper_SRC} ${mineziper_INCLUDE}) -target_include_directories(mineziper PUBLIC ${mineziper_STATIC_INCLUDE}) +# mineziper(d) sources +add_executable(mineziper ${CMAKE_CURRENT_SOURCE_DIR}/mineziper.c) target_link_libraries(mineziper PUBLIC libmineziper) + +add_executable(mineziperd ${CMAKE_CURRENT_SOURCE_DIR}/mineziperd.c) +target_link_libraries(mineziperd PUBLIC libmineziper) diff --git a/mineziper/src/mineziper.c b/mineziper/mineziper.c similarity index 100% rename from mineziper/src/mineziper.c rename to mineziper/mineziper.c diff --git a/mineziper/mineziperd.c b/mineziper/mineziperd.c new file mode 100644 index 0000000..836bbdc --- /dev/null +++ b/mineziper/mineziperd.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "libmineziper.h" +#include "libmineziper_crypto.h" + +#define PORT 8989 + +int main() +{ + int server_sockfd, client_sockfd; + int server_len, client_len; + struct sockaddr_in server_address; + struct sockaddr_in client_address; + + server_sockfd = socket(AF_INET, SOCK_STREAM, 0); + + server_address.sin_family = AF_INET; + server_address.sin_addr.s_addr = htonl(INADDR_ANY); + server_address.sin_port = htons(PORT); + server_len = sizeof(server_address); + bind(server_sockfd, (struct sockaddr *) &server_address, server_len); + + // Create a connection queue, ignore child exit details and wait for clients. + + // Handle only one connection at a time for now + listen(server_sockfd, 1); + + signal(SIGCHLD, SIG_IGN); + + while (1) + { + printf("mineziperd waiting for duty\n"); + + /* Accept connection. */ + client_len = sizeof(client_address); + client_sockfd = accept( + server_sockfd, (struct sockaddr *) &client_address, &client_len); + + /* Fork to create a process for this client and perform a test to see + whether we're the parent or the child. */ + if (fork() == 0) + { + // Get size of buffer + unsigned int read_size; + read(client_sockfd, &read_size, sizeof(int)); + + char *buffer = malloc(read_size); + if (!buffer) + { + fprintf( + stderr, "[ERROR] Cannot allocate buffer of size %d\n", read_size); + exit(1); + } + + unsigned int crc = xcrc32(buffer, read_size, -1); + bool scan_result = scan_zip(buffer, read_size); + + write(client_sockfd, &crc, sizeof(crc)); + write(client_sockfd, &scan_result, sizeof(scan_result)); + + close(client_sockfd); + exit(0); + } + + // Otherwise, we must be the parent + else + { + close(client_sockfd); + } + } +} \ No newline at end of file