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/client.c
parent4355548f79375a62bb5e3bb5695190d48e4c0bc3 (diff)
Starting to turn relabsd into a proper daemon...
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/src/client.c b/src/client.c
new file mode 100644
index 0000000..d03a768
--- /dev/null
+++ b/src/client.c
@@ -0,0 +1,189 @@
+/**** POSIX *******************************************************************/
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+/**** RELABSD *****************************************************************/
+#include <relabsd/client.h>
+#include <relabsd/config.h>
+#include <relabsd/debug.h>
+
+#include <relabsd/config/parameters.h>
+
+/******************************************************************************/
+/**** LOCAL FUNCTIONS *********************************************************/
+/******************************************************************************/
+static int open_socket
+(
+ FILE * s [const restrict static 1],
+ const char socket_name [const restrict static 1]
+)
+{
+ const int old_errno = errno;
+ int fd;
+ struct sockaddr_un addr;
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Opening socket to server...");
+
+ errno = 0;
+
+ if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+ {
+ RELABSD_FATAL
+ (
+ "Unable to create socket: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ return -1;
+ }
+
+ errno = old_errno;
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, socket_name, (sizeof(addr.sun_path) - 1));
+
+ errno = 0;
+
+ if (connect(fd, ((struct sockaddr*) &addr), sizeof(addr)) == -1)
+ {
+ RELABSD_FATAL
+ (
+ "Unable to connect to address: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ close(fd);
+
+ return -1;
+ }
+
+ errno = 0;
+
+ *s = fdopen(fd, "w+");
+
+ if (*s == ((FILE *) NULL))
+ {
+ RELABSD_FATAL
+ (
+ "Unable to open socket as a file: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ close(fd);
+
+ return -1;
+ }
+
+ errno = old_errno;
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Opened socket to server.");
+
+ return 0;
+}
+
+static int send_commands
+(
+ const int argc,
+ const char * argv [const restrict static argc],
+ FILE socket [const restrict static 1]
+)
+{
+ int i, j;
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Sending commands to server...");
+
+ for (i = 3; i < argc;)
+ {
+
+ if (fputs(argv[i], socket) == EOF)
+ {
+ // TODO: error
+ }
+
+ for
+ (
+ j = relabsd_parameters_argument_count_for(argv[i]),
+ i++;
+ ((j > 0) && (i < argc));
+ j++, i--
+ )
+ {
+ if (fputc(' ', socket) == EOF)
+ {
+ // TODO: error
+ }
+ if (fputs(argv[i], socket) == EOF)
+ {
+ // TODO: error
+ }
+ }
+
+ if (fputc('\0', socket) == EOF)
+ {
+ // TODO: error
+ }
+ }
+
+ if (fputc('\0', socket) == EOF)
+ {
+ }
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Sent commands to server.");
+
+ return 0;
+}
+
+static int receive_reply
+(
+ FILE socket [const restrict static 1]
+)
+{
+ return 0;
+}
+
+/******************************************************************************/
+/**** EXPORTED FUNCTIONS ******************************************************/
+/******************************************************************************/
+int relabsd_client
+(
+ const int argc,
+ const char * argv [const restrict static argc],
+ struct relabsd_parameters params [const restrict static 1]
+)
+{
+ FILE * socket;
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Started client mode.");
+
+ if (open_socket(&socket, relabsd_parameters_get_node(params)) < 0)
+ {
+ return -1;
+ }
+
+ if (send_commands(argc, argv, socket) < 0)
+ {
+ return -2;
+ }
+
+ if (receive_reply(socket) < 0)
+ {
+ return -3;
+ }
+
+ RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Completed client mode.");
+
+ return 0;
+}