summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-23 15:44:19 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-23 15:44:19 +0100
commit390576c3839ee7abb845e27b7267de45495e6b2f (patch)
treec481c37c868ccc65a3476f60b17369b21a90b79b /src/server/server.c
parent4355548f79375a62bb5e3bb5695190d48e4c0bc3 (diff)
Starting to turn relabsd into a proper daemon...
Diffstat (limited to 'src/server/server.c')
-rw-r--r--src/server/server.c113
1 files changed, 113 insertions, 0 deletions
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 <relabsd/config.h>
+#include <relabsd/debug.h>
+#include <relabsd/server.h>
+
+#include <relabsd/config/parameters.h>
+
+/******************************************************************************/
+/**** 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;
+}