| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-04-22 17:55:59 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-04-22 17:55:59 +0200 | 
| commit | 1e96b266a195338cb1721aa76313cce6a1b96950 (patch) | |
| tree | 8c1056871a0a49af3723bf9efa361000064097c4 /src/main.c | |
Initial Commit.
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 209 | 
1 files changed, 209 insertions, 0 deletions
| diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..9b8be44 --- /dev/null +++ b/src/main.c @@ -0,0 +1,209 @@ +#include <sys/socket.h> +#include <sys/un.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <unistd.h> + +#include "error/error.h" + +#include "pervasive.h" + +static void print_help (const char runnable []) +{ +   printf +   ( +      "JabberHive - CLI Gateway\n" +      "Software Version %d\n" +      "Protocol Version %d\n" +      "\nUsages:\n" +      "   JH GATEWAY:\t%s SOCKET_NAME\n" +      "   SHOW HELP:\tAnything else\n" +      "\nParameters:\n" +      "   SOCKET_NAME: valid UNIX socket.\n", +      JH_PROGRAM_VERSION, +      JH_PROTOCOL_VERSION, +      runnable +   ); +} + +static int open_socket +( +   FILE * s [const restrict static 1], +   const char socket_name [const restrict static 1] +) +{ +   int fd; +   struct sockaddr_un addr; + +   const int old_errno = errno; + +   errno = 0; + +   if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) +   { +      JH_FATAL +      ( +         stderr, +         "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) +   { +      JH_FATAL +      ( +         stderr, +         "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) +   { +      JH_FATAL +      ( +         stderr, +         "Unable to open socket as a file: %s.", +         strerror(errno) +      ); + +      errno = old_errno; + +      close(fd); + +      return -1; +   } + +   errno = old_errno; + +   return 0; +} + +static void gateway +( +   FILE socket [const restrict static 1] +) +{ +   int is_sending; +   int data, data_prev, is_last_message; + +   is_sending = 1; + +   for (;;) +   { +      if (is_sending) +      { +         data = fgetc(stdin); + +         if (data == EOF) +         { +            return; +         } +         else +         { +            if (fputc(data, socket) == EOF) +            { +               JH_S_FATAL(stderr, "Unable to write to socket."); + +               return; +            } +         } + +         if (data == '\n') +         { +            is_sending = 0; +            data = 0; +            is_last_message = 0; +         } +      } +      else +      { +         data_prev = data; +         data = fgetc(socket); + +         if (data == EOF) +         { +            JH_S_FATAL(stderr, "Unable to read from socket."); + +            return; +         } +         else +         { +            if (fputc(data, stdout) == EOF) +            { +               /* ... seems like it wouldn't work. */ +               JH_S_FATAL(stderr, "Unable to write to stdout."); + +               return; +            } +         } + +         is_last_message = +            ( +               is_last_message +               || ( +                  (data_prev == '!') +                  && ( +                     (data == 'P') +                     || (data == 'N') +                  ) +                  // TODO: check for the ' '. +               ) +            ); + +         if (is_last_message && (data == '\n')) +         { +            is_sending = 1; +         } +      } +   } +} + +int main (int const argc, const char * argv [const static argc]) +{ +   FILE * socket; + +   if (argc != 2) +   { +      print_help(argv[0]); + +      return -1; +   } + +   if (open_socket(&socket, argv[1]) < 0) +   { +      return -1; +   } + +   gateway(socket); + +   fclose(socket); + +   return 0; +} | 


