From 4a9df9b604cec6ee4b4a6f01ef940443583f7573 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Thu, 26 Dec 2019 18:32:26 +0100 Subject: Still working on the daemonization (and rewrite). I am not sure that what I am doing is going to provide what was requested in https://github.com/nsensfel/relabsd/issues/3 but it will at the very least turn relabsd into a proper daemon, and the additions will help create some kind of relabsd device manager if someone needs such a thing. --- src/server/communication_node.c | 177 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 src/server/communication_node.c (limited to 'src/server/communication_node.c') diff --git a/src/server/communication_node.c b/src/server/communication_node.c new file mode 100644 index 0000000..70c7323 --- /dev/null +++ b/src/server/communication_node.c @@ -0,0 +1,177 @@ +/**** POSIX *******************************************************************/ +#include +#include + +#include +#include +#include +#include + +/**** RELABSD *****************************************************************/ +#include + +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ + +static int create_socket (int result [const restrict static 1]) +{ + errno = 0; + + *result = socket(AF_UNIX, SOCK_STREAM, 0); + + if (*result == -1) + { + RELABSD_FATAL + ( + "Unable to create server socket: %s.", + strerror(errno) + ); + + return -1; + } + + return 0; +} + +static int bind_socket +( + const char socket_name [const restrict static 1], + const int socket +) +{ + struct sockaddr_un addr; + + + memset(&addr, 0, sizeof(struct sockaddr_un)); + + addr.sun_family = AF_UNIX; + + strncpy + ( + (void *) addr.sun_path, + (const void *) socket_name, + (sizeof(addr.sun_path) - 1) + ); + + errno = 0; + + if + ( + bind + ( + socket, + (const struct sockaddr *) &addr, + (socklen_t) sizeof(struct sockaddr_un) + ) + == -1 + ) + { + RELABSD_FATAL + ( + "Unable to bind communication socket to %s: %s.", + socket_name, + strerror(errno) + ); + + return -1; + } + + return 0; +} + +static int set_socket_to_unblocking (const int socket) +{ + int current_flags; + + errno = 0; + current_flags = fcntl(socket, F_GETFD); + + if (current_flags == -1) + { + RELABSD_FATAL + ( + "Unable to get communication socket properties: %s.", + strerror(errno) + ); + + return -1; + } + + errno = 0; + current_flags = fcntl(socket, F_SETFD, (current_flags | O_NONBLOCK)); + + if (current_flags == -1) + { + RELABSD_FATAL + ( + "Unable to set communication socket properties: %s.", + strerror(errno) + ); + + return -2; + } + + return 0; +} + +static int set_socket_as_listener (const int socket) +{ + errno = 0; + + if (listen(socket, 0) == -1) + { + RELABSD_FATAL + ( + "Unable to set server socket properties: %s.", + strerror(errno) + ); + + return -1; + } + + return 0; +} + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +int relabsd_server_create_communication_node +( + const char socket_name [const restrict static 1], + int socket [const restrict static 1] +) +{ + if (create_socket(socket) < 0) + { + return -1; + } + + if (bind_socket(socket_name, *socket) < 0) + { + /* TODO: err message. */ + (void) close(*socket); + + return -1; + } + + /* + if (set_socket_to_unblocking(*socket) < 0) + { + /* TODO: err message. *//* + (void) close(*socket); + + return -1; + } + */ + + if (set_socket_as_listener(*socket) < 0) + { + /* TODO: err message. */ + (void) close(*socket); + + return -1; + } + + return 0; +} -- cgit v1.2.3-70-g09d2