summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-04-22 22:24:06 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-04-22 22:24:06 +0200
commit7c321d614e8d91b23434b13bfcf89274797815ec (patch)
tree58b8e4fcba63b38a052423401df413606a7e8076 /src/meta_net/meta_net.c
Initial Commit.
Diffstat (limited to 'src/meta_net/meta_net.c')
-rw-r--r--src/meta_net/meta_net.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/meta_net/meta_net.c b/src/meta_net/meta_net.c
new file mode 100644
index 0000000..fdd0fec
--- /dev/null
+++ b/src/meta_net/meta_net.c
@@ -0,0 +1,158 @@
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "../error/error.h"
+
+#include "../parameters/parameters.h"
+
+#include "meta_net.h"
+
+static int open_socket
+(
+ struct JH_meta_net s [const restrict static 1],
+ const char socket_name [const restrict static 1]
+)
+{
+ struct sockaddr_un addr;
+ int flags;
+ const int old_errno = errno;
+
+ errno = 0;
+
+ s->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+
+ if (s->fd == -1)
+ {
+ JH_FATAL
+ (
+ stderr,
+ "Unable to create socket: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ return -1;
+ }
+
+ errno = old_errno;
+
+ memset((void *) &addr, 0, sizeof(addr));
+
+ addr.sun_family = AF_UNIX;
+
+ strncpy
+ (
+ (void *) addr.sun_path,
+ (const void *) socket_name,
+ (sizeof(addr.sun_path) - 1)
+ );
+
+ errno = 0;
+
+ if (connect(s->fd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
+ {
+ JH_FATAL
+ (
+ stderr,
+ "Unable to connect to address: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ close(s->fd);
+
+ return -1;
+ }
+
+ errno = 0;
+
+ flags = fcntl(s->fd, F_GETFD, 0);
+
+ if (flags < 0)
+ {
+ JH_FATAL
+ (
+ stderr,
+ "Unable to get fd flag information for JabberHive socket: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ close(s->fd);
+
+ return -1;
+ }
+
+ errno = 0;
+
+ if (fcntl(s->fd, F_SETFL, (flags | O_NONBLOCK)) == -1)
+ {
+ JH_FATAL
+ (
+ stderr,
+ "Unable to get fd flag information for JabberHive socket: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ close(s->fd);
+
+ return -1;
+ }
+
+ errno = old_errno;
+
+ return 0;
+}
+
+int JH_meta_net_connect
+(
+ struct JH_meta_net socket [const restrict static 1],
+ const struct JH_parameters params [const restrict static 1]
+)
+{
+ return
+ open_socket
+ (
+ socket,
+ JH_parameters_get_socket_name(params)
+ );
+}
+
+void JH_meta_net_initialize
+(
+ struct JH_meta_net socket [const restrict static 1]
+)
+{
+ socket->in.data = (char *) NULL;
+ socket->in.capacity = 0;
+ socket->in.length = 0;
+ socket->in.index = 0;
+
+ socket->out.data = (char *) NULL;
+ socket->out.capacity = 0;
+ socket->out.length = 0;
+ socket->out.index = 0;
+
+ socket->fd = -1;
+ socket->has_request_in_progress = 0;
+}
+
+void JH_meta_net_finalize
+(
+ struct JH_meta_net socket [const restrict static 1]
+)
+{
+ /* TODO */
+}