| 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; | 


