summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/meta_net')
-rw-r--r--src/meta_net/meta_net.c89
-rw-r--r--src/meta_net/meta_net.h1
-rw-r--r--src/meta_net/meta_net_handle_reply.c232
-rw-r--r--src/meta_net/meta_net_select.c8
-rw-r--r--src/meta_net/meta_net_try_request.c106
-rw-r--r--src/meta_net/meta_net_types.h23
6 files changed, 391 insertions, 68 deletions
diff --git a/src/meta_net/meta_net.c b/src/meta_net/meta_net.c
index fdd0fec..8f290a8 100644
--- a/src/meta_net/meta_net.c
+++ b/src/meta_net/meta_net.c
@@ -33,7 +33,7 @@ static int open_socket
JH_FATAL
(
stderr,
- "Unable to create socket: %s.",
+ "Unable to create JabberHive (UNIX) socket: %s.",
strerror(errno)
);
@@ -62,7 +62,8 @@ static int open_socket
JH_FATAL
(
stderr,
- "Unable to connect to address: %s.",
+ "Unable to connect to JabberHive (UNIX) address \"%s\": %s",
+ socket_name,
strerror(errno)
);
@@ -82,7 +83,7 @@ static int open_socket
JH_FATAL
(
stderr,
- "Unable to get fd flag information for JabberHive socket: %s.",
+ "Unable to get fd flag information for JabberHive (UNIX) socket: %s.",
strerror(errno)
);
@@ -100,7 +101,7 @@ static int open_socket
JH_FATAL
(
stderr,
- "Unable to get fd flag information for JabberHive socket: %s.",
+ "Unable to get fd flag information for JabberHive (UNIX) socket: %s.",
strerror(errno)
);
@@ -154,5 +155,83 @@ void JH_meta_net_finalize
struct JH_meta_net socket [const restrict static 1]
)
{
- /* TODO */
+ if (socket->in.data != (char *) NULL)
+ {
+ free((void *) socket->in.data);
+ socket->in.data = (char *) NULL;
+ }
+
+ socket->in.capacity = 0;
+ socket->in.length = 0;
+ socket->in.index = 0;
+
+ if (socket->out.data != (char *) NULL)
+ {
+ free((void *) socket->out.data);
+ socket->out.data = (char *) NULL;
+ }
+
+ socket->out.capacity = 0;
+ socket->out.length = 0;
+ socket->out.index = 0;
+
+ if (socket->fd != -1)
+ {
+ close(socket->fd);
+ socket->fd = -1;
+ }
+
+ socket->has_request_in_progress = 0;
+}
+
+int JH_meta_net_write
+(
+ struct JH_meta_net socket [const restrict static 1]
+)
+{
+ const int old_errno = errno;
+ ssize_t written;
+
+ written =
+ write
+ (
+ socket->fd,
+ (socket->out.data + socket->out.index),
+ (socket->out.length - socket->out.index)
+ );
+
+ if (written <= 0)
+ {
+ if (errno == EAGAIN)
+ {
+ errno = old_errno;
+
+ return 0;
+ }
+
+ JH_ERROR
+ (
+ stderr,
+ "Unable to write to JabberHive (UNIX) socket: %s.",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ return -1;
+ }
+
+ errno = old_errno;
+
+ /* Move the index to track how much of the message we have sent. */
+ socket->out.index += (size_t) written;
+
+ if (socket->out.index >= socket->out.length)
+ {
+ /* Message completely sent, let's get ready for the next one. */
+ socket->out.index = 0;
+ socket->out.length = 0;
+ }
+
+ return 0;
}
diff --git a/src/meta_net/meta_net.h b/src/meta_net/meta_net.h
index ce5c61e..0673f74 100644
--- a/src/meta_net/meta_net.h
+++ b/src/meta_net/meta_net.h
@@ -49,7 +49,6 @@ int JH_meta_net_read
struct JH_meta_net socket [const restrict static 1]
);
-/* TODO */
int JH_meta_net_write
(
struct JH_meta_net socket [const restrict static 1]
diff --git a/src/meta_net/meta_net_handle_reply.c b/src/meta_net/meta_net_handle_reply.c
index b823078..558daed 100644
--- a/src/meta_net/meta_net_handle_reply.c
+++ b/src/meta_net/meta_net_handle_reply.c
@@ -5,70 +5,216 @@
#include "meta_net.h"
-void JH_meta_net_handle_reply
+static void handle_generated_reply
(
struct JH_meta_net socket [const restrict static 1],
struct JH_irc irc [const restrict static 1],
const struct JH_parameters params [const restrict static 1]
)
{
- if (socket->in.index == 0)
- {
- /* No reply to handle. */
- return;
- }
-
- socket->in.data[socket->in.index] = '\0';
-
- if (JH_IS_PREFIX("!CPV ", socket->in.data))
- {
- }
- else if (JH_IS_PREFIX("!CPS ", socket->in.data))
+ if
+ (
+ JH_IS_PREFIX
+ (
+ JH_META_NET_ACTION_STRING " ",
+ (
+ socket->in.data
+ +
+ (
+ JH_META_NET_GR_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ )
+ )
+ )
{
+ JH_irc_send_action
+ (
+ irc,
+ (
+ socket->in.data
+ +
+ (
+ JH_META_NET_GR_STRING_LENGTH
+ + 1 /* ' ' */
+ + JH_META_NET_ACTION_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ )
+ );
}
- else if (JH_IS_PREFIX("!GR ", socket->in.data))
+ else if
+ (
+ socket->in.index
+ >
+ (
+ JH_META_NET_GR_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ )
{
- /* TODO: /me vs message should be handled prior to this. */
- JH_irc_send_message(irc, (socket->in.data + 4));
-
- JH_DEBUG
+ JH_irc_send_message
(
- stderr,
- /* TODO: Parameter dependent behavior. */
- JH_DEBUG_DISPLAY_IRC_MSG_EXCHANGES,
- "<%s> %s",
- JH_parameters_get_irc_nick(params),
- (socket->in.data + 4)
+ irc,
+ (
+ socket->in.data
+ +
+ (
+ JH_META_NET_GR_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ )
);
}
- else if (JH_IS_PREFIX("!AI ", socket->in.data))
+}
+
+static void move_to_next_reply
+(
+ struct JH_meta_net socket [const restrict static 1]
+)
+{
+ if (socket->in.index < socket->in.length)
{
- /* TODO: Parameter dependent behavior. */
- JH_DEBUG
+ memmove
(
- stderr,
- 1,
- "Received: %s.",
- socket->in.data
+ (void *) socket->in.data,
+ (const void *) (socket->in.data + socket->in.index + 1),
+ ((socket->in.length - 1) - socket->in.index) * sizeof(char)
);
}
- else if (JH_IS_PREFIX("!P ", socket->in.data))
+
+ socket->in.length = (socket->in.length - 1) - socket->in.index;
+
+ for
+ (
+ socket->in.index = 0;
+ (socket->in.index < socket->in.length);
+ socket->in.index += 1
+ )
{
- socket->has_request_in_progress = 0;
+ if (socket->in.data[socket->in.index] == '\n')
+ {
+ return;
+ }
}
- else if (JH_IS_PREFIX("!N ", socket->in.data))
- {
- JH_S_WARNING(stderr, "Received Negative reply.");
- socket->has_request_in_progress = 0;
- }
- else
+ socket->in.index = 0;
+}
+
+static void handle_additional_info
+(
+ struct JH_meta_net socket [const restrict static 1],
+ const struct JH_parameters params [const restrict static 1]
+)
+{
+ if (JH_parameters_get_print_additional_info(params))
{
- JH_WARNING
+ printf
(
- stderr,
- "Unsupported reply received: %s.",
- socket->in.data
+ "[JH][AI] %s\n",
+ (
+ socket->in.data
+ +
+ (
+ JH_META_NET_AI_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ )
);
}
}
+
+void JH_meta_net_handle_reply
+(
+ struct JH_meta_net socket [const restrict static 1],
+ struct JH_irc irc [const restrict static 1],
+ const struct JH_parameters params [const restrict static 1]
+)
+{
+ while
+ (
+ (socket->in.length != 0)
+ && (socket->in.data[socket->in.index] == '\n')
+ )
+ {
+ socket->in.data[socket->in.index] = '\0';
+
+ if
+ (
+ JH_IS_PREFIX
+ (
+ JH_META_NET_CPV_STRING " ",
+ socket->in.data
+ )
+ )
+ {
+ }
+ else if
+ (
+ JH_IS_PREFIX
+ (
+ JH_META_NET_CPS_STRING " ",
+ socket->in.data
+ )
+ )
+ {
+ }
+ else if
+ (
+ JH_IS_PREFIX
+ (
+ JH_META_NET_GR_STRING " ",
+ socket->in.data
+ )
+ )
+ {
+ handle_generated_reply(socket, irc, params);
+ }
+ else if
+ (
+ JH_IS_PREFIX
+ (
+ JH_META_NET_AI_STRING " ",
+ socket->in.data
+ )
+ )
+ {
+ handle_additional_info(socket, params);
+ }
+ else if
+ (
+ JH_IS_PREFIX
+ (
+ JH_META_NET_P_STRING " ",
+ socket->in.data
+ )
+ )
+ {
+ socket->has_request_in_progress = 0;
+ }
+ else if
+ (
+ JH_IS_PREFIX
+ (
+ JH_META_NET_N_STRING " ",
+ socket->in.data
+ )
+ )
+ {
+ JH_S_WARNING(stderr, "[JH] Received Negative reply.");
+
+ socket->has_request_in_progress = 0;
+ }
+ else
+ {
+ JH_WARNING
+ (
+ stderr,
+ "[JH] Unsupported reply received: %s.",
+ socket->in.data
+ );
+ }
+
+ move_to_next_reply(socket);
+ }
+}
diff --git a/src/meta_net/meta_net_select.c b/src/meta_net/meta_net_select.c
index 069a671..f126176 100644
--- a/src/meta_net/meta_net_select.c
+++ b/src/meta_net/meta_net_select.c
@@ -13,7 +13,11 @@ int JH_meta_net_pre_select
)
{
FD_SET(socket->fd, in);
- FD_SET(socket->fd, out);
+
+ if (socket->out.length != 0)
+ {
+ FD_SET(socket->fd, out);
+ }
if ((*max_fd) < socket->fd)
{
@@ -40,7 +44,7 @@ int JH_meta_net_post_select
}
}
- if (FD_ISSET(socket->fd, out))
+ if ((socket->out.length != 0) && FD_ISSET(socket->fd, out))
{
if (JH_meta_net_write(socket) < 0)
{
diff --git a/src/meta_net/meta_net_try_request.c b/src/meta_net/meta_net_try_request.c
index 121ef8d..89c7539 100644
--- a/src/meta_net/meta_net_try_request.c
+++ b/src/meta_net/meta_net_try_request.c
@@ -76,7 +76,12 @@ int JH_meta_net_handle_user_message
(
&(socket->out.data),
&(socket->out.capacity),
- string_size
+ (
+ string_size
+ + JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ + 1 /* '\n' */
+ )
)
< 0
)
@@ -87,13 +92,41 @@ int JH_meta_net_handle_user_message
memcpy
(
(void *) socket->out.data,
+ (const void *) (JH_META_NET_RLR_STRING " "),
+ (
+ (
+ JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ * sizeof(char)
+ )
+ );
+
+ memcpy
+ (
+ (void *)
+ (
+ socket->out.data
+ +
+ (
+ JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ ),
(const void *) string,
(string_size * sizeof(char))
);
- socket->out.length = string_size;
- socket->out.index = 0;
+ socket->out.length =
+ (
+ string_size
+ + JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ + 1 /* '\n' */
+ );
+ socket->out.index = 0;
+ socket->out.data[socket->out.length - 1] = '\n';
socket->has_request_in_progress = 1;
return 0;
@@ -117,7 +150,14 @@ int JH_meta_net_handle_user_action
(
&(socket->out.data),
&(socket->out.capacity),
- (string_size + (JH_META_NET_ACTION_STRING_LENGTH + 1))
+ (
+ string_size
+ + JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ + JH_META_NET_ACTION_STRING_LENGTH
+ + 1 /* ' ' */
+ + 1 /* '\n' */
+ )
)
< 0
)
@@ -128,22 +168,53 @@ int JH_meta_net_handle_user_action
memcpy
(
(void *) socket->out.data,
- (const void *) JH_META_NET_ACTION_STRING,
- (JH_META_NET_ACTION_STRING_LENGTH * sizeof(char))
+ (const void *)
+ (
+ JH_META_NET_RLR_STRING
+ " "
+ JH_META_NET_ACTION_STRING
+ " "
+ ),
+ (
+ (
+ JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ + JH_META_NET_ACTION_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ * sizeof(char)
+ )
);
- socket->out.data[JH_META_NET_ACTION_STRING_LENGTH] = ' ';
-
memcpy
(
- (void *) (socket->out.data + (JH_META_NET_ACTION_STRING_LENGTH + 1)),
+ (void *)
+ (
+ socket->out.data
+ +
+ (
+ JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ + JH_META_NET_ACTION_STRING_LENGTH
+ + 1 /* ' ' */
+ )
+ ),
(const void *) string,
(string_size * sizeof(char))
);
- socket->out.length = string_size;
- socket->out.index = 0;
+ socket->out.length =
+ (
+ string_size
+ + JH_META_NET_RLR_STRING_LENGTH
+ + 1 /* ' ' */
+ + JH_META_NET_ACTION_STRING_LENGTH
+ + 1 /* ' ' */
+ + 1 /* '\n' */
+ );
+ socket->out.index = 0;
+ socket->out.data[socket->out.length - 1] = '\n';
socket->has_request_in_progress = 1;
return 0;
@@ -188,13 +259,13 @@ int JH_meta_net_read
read
(
socket->fd,
- (&(socket->in.data) + socket->in.length),
+ (socket->in.data + socket->in.length),
(size_t) JH_META_NET_READ_SIZE
);
- if (in_bytes_count < 0)
+ if (in_bytes_count <= 0)
{
- if (errno == EAGAIN)
+ if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
{
errno = old_errno;
@@ -204,8 +275,9 @@ int JH_meta_net_read
JH_ERROR
(
stderr,
- "Unable to read from JabberHive socket: %s.",
- strerror(errno)
+ "Unable to read from JabberHive (UNIX) socket: %s (errno: %d).",
+ strerror(errno),
+ errno
);
errno = old_errno;
@@ -216,7 +288,7 @@ int JH_meta_net_read
errno = old_errno;
/* Safe. */
- socket->in.length += (size_t) in_bytes_count;
+ socket->in.length += (size_t) (in_bytes_count);
while (socket->in.index < socket->in.length)
{
diff --git a/src/meta_net/meta_net_types.h b/src/meta_net/meta_net_types.h
index 251f85b..0d0a847 100644
--- a/src/meta_net/meta_net_types.h
+++ b/src/meta_net/meta_net_types.h
@@ -7,6 +7,29 @@
#define JH_META_NET_ACTION_STRING "/me"
#define JH_META_NET_ACTION_STRING_LENGTH 3
+#define JH_META_NET_RPV_STRING "?RPV"
+#define JH_META_NET_RPV_STRING_LENGTH 4
+#define JH_META_NET_RPS_STRING "?RPS"
+#define JH_META_NET_RPS_STRING_LENGTH 4
+#define JH_META_NET_RL_STRING "?RL"
+#define JH_META_NET_RL_STRING_LENGTH 3
+#define JH_META_NET_RR_STRING "?RR"
+#define JH_META_NET_RR_STRING_LENGTH 3
+#define JH_META_NET_RLR_STRING "?RLR"
+#define JH_META_NET_RLR_STRING_LENGTH 4
+
+#define JH_META_NET_CPV_STRING "!CPV"
+#define JH_META_NET_CPV_STRING_LENGTH 4
+#define JH_META_NET_CPS_STRING "!CPV"
+#define JH_META_NET_CPS_STRING_LENGTH 4
+#define JH_META_NET_GR_STRING "!GR"
+#define JH_META_NET_GR_STRING_LENGTH 3
+#define JH_META_NET_AI_STRING "!AI"
+#define JH_META_NET_AI_STRING_LENGTH 3
+#define JH_META_NET_P_STRING "!P"
+#define JH_META_NET_P_STRING_LENGTH 2
+#define JH_META_NET_N_STRING "!N"
+#define JH_META_NET_N_STRING_LENGTH 2
struct JH_meta_net_buffer
{
char * data;