| summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/meta_net')
| -rw-r--r-- | src/meta_net/meta_net.c | 89 | ||||
| -rw-r--r-- | src/meta_net/meta_net.h | 1 | ||||
| -rw-r--r-- | src/meta_net/meta_net_handle_reply.c | 232 | ||||
| -rw-r--r-- | src/meta_net/meta_net_select.c | 8 | ||||
| -rw-r--r-- | src/meta_net/meta_net_try_request.c | 106 | ||||
| -rw-r--r-- | src/meta_net/meta_net_types.h | 23 |
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; |


