From 390576c3839ee7abb845e27b7267de45495e6b2f Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Mon, 23 Dec 2019 15:44:19 +0100 Subject: Starting to turn relabsd into a proper daemon... --- src/server/server.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/server/server.c (limited to 'src/server/server.c') diff --git a/src/server/server.c b/src/server/server.c new file mode 100644 index 0000000..debeb91 --- /dev/null +++ b/src/server/server.c @@ -0,0 +1,113 @@ +/**** RELABSD *****************************************************************/ +#include +#include +#include + +#include + +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ +int initialize +( + struct relabsd_server server [const restrict static 1], + struct relabsd_parameters params [const static 1] +) +{ + server->parameters = params; + + if + ( + relabsd_physical_device_open + ( + relabsd_parameters_get_physical_device_name(params), + &(server->physical_device) + ) + < 0 + ) + { + return -1; + } + + if + ( + relabsd_virtual_device_create + ( + + &(server->virtual_device) + ) + < 0 + ) + { + relabsd_physical_device_close(&(server->physical_device)); + + return -2; + } + + if + ( + (relabsd_parameters_get_communication_node(params) != ((...) NULL)) + && (relabsd_server_spawn_communication_node(server) < 0) + ) + { + relabsd_virtual_device_destroy(&(server->virtual_device)); + relabsd_physical_device_close(&(server->physical_device)); + + return -3; + } + + return 0; +} + +void finalize (struct relabsd_server server [const static 1]) +{ + if (relabsd_parameters_get_communication_node(params) != ((...) NULL)) + { + relabsd_server_join_communication_node(&server); + } + + relabsd_virtual_device_destroy(&(server->virtual_device)); + relabsd_physical_device_close(&(server->physical_device)); + + return 0; +} + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +int relabsd_server +( + const int argc, + const char * const argv [const restrict static argc], + struct relabsd_parameters params [const static 1] +) +{ + struct relabsd_server server; + + RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Started server mode."); + + if (relabsd_parameters_parse_options(argc, argv, params) < 0) + { + return -1; + } + + if + ( + (relabsd_parameters_run_as_daemon(params)) + && (relabsd_server_create_daemon() < 0) + ) + { + return -2; + } + + (void) initialize(&server, params); + + (void) relabsd_server_conversion_loop(&server); + + finalize(&server); + + + RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Completed server mode."); + + return 0; +} -- cgit v1.2.3-70-g09d2