summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/communication_node.c33
-rw-r--r--src/server/communication_thread.c40
-rw-r--r--src/server/handle_client.c7
-rw-r--r--src/server/interruption.c4
-rw-r--r--src/server/server.c3
5 files changed, 81 insertions, 6 deletions
diff --git a/src/server/communication_node.c b/src/server/communication_node.c
index c621f06..46b5f08 100644
--- a/src/server/communication_node.c
+++ b/src/server/communication_node.c
@@ -164,3 +164,36 @@ int relabsd_server_create_communication_node
return 0;
}
+
+void relabsd_server_destroy_communication_node
+(
+ const char socket_name [const restrict static 1],
+ const int socket
+)
+{
+ errno = 0;
+
+ if (close(socket) == -1)
+ {
+ RELABSD_WARNING
+ (
+ "Could not properly close the communication socket: %s.",
+ strerror(errno)
+ );
+ }
+
+ errno = 0;
+
+ if (remove(socket_name) == -1)
+ {
+ RELABSD_ERROR
+ (
+ "Could not remove communication node %s. Please delete it manually."
+ " Error: %s.",
+ socket_name,
+ strerror(errno)
+ );
+ }
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Destroyed communication node.");
+}
diff --git a/src/server/communication_thread.c b/src/server/communication_thread.c
index cc91065..fd8f5cf 100644
--- a/src/server/communication_thread.c
+++ b/src/server/communication_thread.c
@@ -1,4 +1,8 @@
/**** POSIX *******************************************************************/
+#include <sys/select.h>
+#include <sys/socket.h>
+
+#include <errno.h>
#include <pthread.h>
#include <string.h>
@@ -6,6 +10,8 @@
#include <relabsd/debug.h>
#include <relabsd/server.h>
+#include <relabsd/config/parameters.h>
+
/******************************************************************************/
/**** LOCAL FUNCTIONS *********************************************************/
/******************************************************************************/
@@ -48,6 +54,8 @@ static void main_loop (struct relabsd_server server [const static 1])
FD_SET(communication_socket, &ready_to_read);
FD_SET(interrupt_fd, &ready_to_read);
+ errno = 0;
+
ready_fds =
select
(
@@ -58,10 +66,30 @@ static void main_loop (struct relabsd_server server [const static 1])
(struct timeval *) NULL
);
+ if (ready_fds == -1)
+ {
+ RELABSD_ERROR
+ (
+ "Unable to select on the server's socket: %s.",
+ strerror(errno)
+ );
+
+ relabsd_server_interrupt();
+ }
+
/* TODO: select error handling. */
if (!relabsd_server_keep_running())
{
+ relabsd_server_destroy_communication_node
+ (
+ relabsd_parameters_get_communication_node_name
+ (
+ &(server->parameters)
+ ),
+ communication_socket
+ );
+
return;
}
@@ -83,7 +111,17 @@ static void main_loop (struct relabsd_server server [const static 1])
strerror(errno)
);
- return -1;
+ relabsd_server_interrupt();
+ relabsd_server_destroy_communication_node
+ (
+ relabsd_parameters_get_communication_node_name
+ (
+ &(server->parameters)
+ ),
+ communication_socket
+ );
+
+ return;
}
(void) relabsd_server_handle_client(current_client_socket, server);
diff --git a/src/server/handle_client.c b/src/server/handle_client.c
index 696725b..a5eb7f7 100644
--- a/src/server/handle_client.c
+++ b/src/server/handle_client.c
@@ -9,6 +9,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
/**** RELABSD *****************************************************************/
#include <relabsd/debug.h>
@@ -19,9 +20,9 @@
/******************************************************************************/
static void handle_input
(
- const ssize_t input_size,
- const char input [const static 1],
- struct relabsd_server server [const static 1]
+ const ssize_t input_size __attribute__((unused)),
+ const char input [const static 1] __attribute__((unused)),
+ struct relabsd_server server [const static 1] __attribute__((unused))
)
{
}
diff --git a/src/server/interruption.c b/src/server/interruption.c
index 32cda53..7dabd3d 100644
--- a/src/server/interruption.c
+++ b/src/server/interruption.c
@@ -19,7 +19,7 @@ static void interrupt (int unused_mandatory_parameter __attribute__((unused)))
errno = 0;
- if (write(RELABSD_INTERRUPTION_PIPES[0], (void *) "!", (size_t) 1) == -1)
+ if (write(RELABSD_INTERRUPTION_PIPES[1], (void *) "!", (size_t) 1) == -1)
{
RELABSD_ERROR
(
@@ -82,5 +82,5 @@ void relabsd_server_finalize_signal_handlers (void)
int relabsd_server_get_interruption_file_descriptor (void)
{
- return RELABSD_INTERRUPTION_PIPES[1];
+ return RELABSD_INTERRUPTION_PIPES[0];
}
diff --git a/src/server/server.c b/src/server/server.c
index 1b17d12..223e57a 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -21,6 +21,8 @@ static int initialize
{
int err;
+ relabsd_server_initialize_signal_handlers();
+
if
(
relabsd_physical_device_open
@@ -97,6 +99,7 @@ static void finalize (struct relabsd_server server [const static 1])
relabsd_physical_device_close(&(server->physical_device));
(void) pthread_mutex_destroy(&(server->mutex));
+ relabsd_server_finalize_signal_handlers();
}
/******************************************************************************/