Guest User

Untitled

a guest
Jul 22nd, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1.  /* See LICENSE file for license details. */
  2. #include <ctype.h>
  3. #include <errno.h>
  4. #include <stdarg.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <unistd.h>
  10.  
  11. static char *host = "irc.oftc.net";
  12. static char *port = "ircd";
  13. static char *password;
  14. static char nick[32];
  15. static char bufin[4096];
  16. static char bufout[4096];
  17. static time_t trespond;
  18. static FILE *srv;
  19.  
  20. #include "util.c"
  21.  
  22. static void
  23. pout(char *channel, char *fmt, ...) {
  24.     static char timestr[18];
  25.     time_t t;
  26.     va_list ap;
  27.  
  28.     va_start(ap, fmt);
  29.     vsnprintf(bufout, sizeof bufout, fmt, ap);
  30.     va_end(ap);
  31.     t = time(NULL);
  32.     strftime(timestr, sizeof timestr, "%D %R", localtime(&t));
  33.     fprintf(stdout, "%s: %s  %s\n", channel, timestr, bufout);
  34. }
  35.  
  36. static void
  37. sout(char *fmt, ...) {
  38.     va_list ap;
  39.  
  40.     va_start(ap, fmt);
  41.     vsnprintf(bufout, sizeof bufout, fmt, ap);
  42.     va_end(ap);
  43.     fprintf(srv, "%s\r\n", bufout);
  44. }
  45.  
  46. static void
  47. parsein(char *s) {
  48.     if(s[0] == '\0')
  49.         return;
  50.     skip(s, '\n');
  51.     sout("%s", s);
  52.     pout(nick, "> %s", s);
  53. }
  54.  
  55. static void
  56. parsesrv(char *cmd) {
  57.     char *usr, *par, *txt;
  58.  
  59.     usr = host;
  60.     if(!cmd || !*cmd)
  61.         return;
  62.     if(cmd[0] == ':') {
  63.         usr = cmd + 1;
  64.         cmd = skip(usr, ' ');
  65.         if(cmd[0] == '\0')
  66.             return;
  67.         skip(usr, '!');
  68.     }
  69.     skip(cmd, '\r');
  70.     par = skip(cmd, ' ');
  71.     txt = skip(par, ':');
  72.     trim(par);
  73.     if(!strcmp("PONG", cmd))
  74.         return;
  75.     if(!strcmp("PRIVMSG", cmd))
  76.         pout(par, "<%s> %s", usr, txt);
  77.     else if(!strcmp("PING", cmd))
  78.         sout("PONG %s", txt);
  79.     else {
  80.         pout(usr, ">< %s (%s): %s", cmd, par, txt);
  81.         if(!strcmp("NICK", cmd) && !strcmp(usr, nick))
  82.             strlcpy(nick, txt, sizeof nick);
  83.     }
  84. }
  85.  
  86. int
  87. main(int argc, char *argv[]) {
  88.     int i, c;
  89.     struct timeval tv;
  90.     const char *user = getenv("USER");
  91.     fd_set rd;
  92.  
  93.     strlcpy(nick, user ? user : "unknown", sizeof nick);
  94.     for(i = 1; i < argc; i++) {
  95.         c = argv[i][1];
  96.         if(argv[i][0] != '-' || argv[i][2])
  97.             c = -1;
  98.         switch(c) {
  99.         case 'h':
  100.             if(++i < argc) host = argv[i];
  101.             break;
  102.         case 'p':
  103.             if(++i < argc) port = argv[i];
  104.             break;
  105.         case 'n':
  106.             if(++i < argc) strlcpy(nick, argv[i], sizeof nick);
  107.             break;
  108.         case 'k':
  109.             if(++i < argc) password = argv[i];
  110.             break;
  111.         case 'v':
  112.             eprint("sic-"VERSION", © 2005-2009 Kris Maglione, Anselm R. Garbe, Nico Golde\n");
  113.         default:
  114.             eprint("usage: sic [-h host] [-p port] [-n nick] [-k keyword] [-v]\n");
  115.         }
  116.     }
  117.     /* init */
  118.     i = dial(host, port);
  119.     srv = fdopen(i, "r+");
  120.     /* login */
  121.     if(password)
  122.         sout("PASS %s", password);
  123.     sout("NICK %s", nick);
  124.     sout("USER %s localhost %s :%s", nick, host, nick);
  125.     fflush(srv);
  126.     setbuf(stdout, NULL);
  127.     setbuf(srv, NULL);
  128.     for(;;) { /* main loop */
  129.         FD_ZERO(&rd);
  130.         FD_SET(0, &rd);
  131.         FD_SET(fileno(srv), &rd);
  132.         tv.tv_sec = 120;
  133.         tv.tv_usec = 0;
  134.         i = select(fileno(srv) + 1, &rd, 0, 0, &tv);
  135.         if(i < 0) {
  136.             if(errno == EINTR)
  137.                 continue;
  138.             eprint("sic: error on select():");
  139.         }
  140.         else if(i == 0) {
  141.             if(time(NULL) - trespond >= 300)
  142.                 eprint("sic shutting down: parse timeout\n");
  143.             sout("PING %s", host);
  144.             continue;
  145.         }
  146.         if(FD_ISSET(fileno(srv), &rd)) {
  147.             if(fgets(bufin, sizeof bufin, srv) == NULL)
  148.                 eprint("sic: remote host closed connection\n");
  149.             parsesrv(bufin);
  150.             trespond = time(NULL);
  151.         }
  152.         if(FD_ISSET(0, &rd)) {
  153.             if(fgets(bufin, sizeof bufin, stdin) == NULL)
  154.                 eprint("sic: broken pipe\n");
  155.             parsein(bufin);
  156.         }
  157.     }
  158.     return 0;
  159. }
Add Comment
Please, Sign In to add comment