ii-2.0-ucspi.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       ii-2.0-ucspi.diff (9012B)
       ---
            1 commit 42a582d675b09f387b154f8149c0c75e303955e0
            2 Author: Jan Klemkow <j.klemkow@wemelug.de>
            3 Date:   Sat Sep 2 12:36:34 2017 +0200
            4 
            5     replace socket handling with ucspi backend
            6 
            7 diff --git a/ii.c b/ii.c
            8 index c402a87..193b0b9 100644
            9 --- a/ii.c
           10 +++ b/ii.c
           11 @@ -1,16 +1,13 @@
           12  /* See LICENSE file for license details. */
           13  #include <sys/select.h>
           14 -#include <sys/socket.h>
           15  #include <sys/stat.h>
           16  #include <sys/types.h>
           17 -#include <sys/un.h>
           18  
           19  #include <ctype.h>
           20  #include <errno.h>
           21  #include <fcntl.h>
           22  #include <limits.h>
           23  #include <netdb.h>
           24 -#include <netinet/in.h>
           25  #include <pwd.h>
           26  #include <signal.h>
           27  #include <stdarg.h>
           28 @@ -20,6 +17,9 @@
           29  #include <time.h>
           30  #include <unistd.h>
           31  
           32 +#define READ_FD 6
           33 +#define WRITE_FD 7
           34 +
           35  char *argv0;
           36  
           37  #include "arg.h"
           38 @@ -59,16 +59,16 @@ static void      create_dirtree(const char *);
           39  static void      create_filepath(char *, size_t, const char *, const char *, const char *);
           40  static void      die(const char *, ...);
           41  static void      ewritestr(int, const char *);
           42 -static void      handle_channels_input(int, Channel *);
           43 -static void      handle_server_output(int);
           44 +static void      handle_channels_input(Channel *);
           45 +static void      handle_server_output(void);
           46  static int       isnumeric(const char *);
           47 -static void      loginkey(int, const char *);
           48 -static void      loginuser(int, const char *, const char *);
           49 -static void      proc_channels_input(int, Channel *, char *);
           50 -static void      proc_channels_privmsg(int, Channel *, char *);
           51 -static void      proc_server_cmd(int, char *);
           52 +static void      loginkey(const char *);
           53 +static void      loginuser(const char *, const char *);
           54 +static void      proc_channels_input(Channel *, char *);
           55 +static void      proc_channels_privmsg(Channel *, char *);
           56 +static void      proc_server_cmd(char *);
           57  static int       read_line(int, char *, size_t);
           58 -static void      run(int, const char *);
           59 +static void      run(const char *);
           60  static void      setup(void);
           61  static void      sighandler(int);
           62  static int       tcpopen(const char *, const char *);
           63 @@ -341,73 +341,19 @@ channel_leave(Channel *c)
           64  }
           65  
           66  static void
           67 -loginkey(int ircfd, const char *key)
           68 +loginkey(const char *key)
           69  {
           70          snprintf(msg, sizeof(msg), "PASS %s\r\n", key);
           71 -        ewritestr(ircfd, msg);
           72 +        ewritestr(WRITE_FD, msg);
           73  }
           74  
           75  static void
           76 -loginuser(int ircfd, const char *host, const char *fullname)
           77 +loginuser(const char *host, const char *fullname)
           78  {
           79          snprintf(msg, sizeof(msg), "NICK %s\r\nUSER %s localhost %s :%s\r\n",
           80                   nick, nick, host, fullname);
           81          puts(msg);
           82 -        ewritestr(ircfd, msg);
           83 -}
           84 -
           85 -static int
           86 -udsopen(const char *uds)
           87 -{
           88 -        struct sockaddr_un sun;
           89 -        size_t len;
           90 -        int fd;
           91 -
           92 -        if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
           93 -                die("%s: socket: %s\n", argv0, strerror(errno));
           94 -
           95 -        sun.sun_family = AF_UNIX;
           96 -        if (strlcpy(sun.sun_path, uds, sizeof(sun.sun_path)) >= sizeof(sun.sun_path))
           97 -                die("%s: UNIX domain socket path truncation\n", argv0);
           98 -
           99 -        len = strlen(sun.sun_path) + 1 + sizeof(sun.sun_family);
          100 -        if (connect(fd, (struct sockaddr *)&sun, len) == -1)
          101 -                die("%s: connect: %s\n", argv0, strerror(errno));
          102 -
          103 -        return fd;
          104 -}
          105 -
          106 -static int
          107 -tcpopen(const char *host, const char *service)
          108 -{
          109 -        struct addrinfo hints, *res = NULL, *rp;
          110 -        int fd = -1, e;
          111 -
          112 -        memset(&hints, 0, sizeof(hints));
          113 -        hints.ai_family = AF_UNSPEC; /* allow IPv4 or IPv6 */
          114 -        hints.ai_flags = AI_NUMERICSERV; /* avoid name lookup for port */
          115 -        hints.ai_socktype = SOCK_STREAM;
          116 -
          117 -        if ((e = getaddrinfo(host, service, &hints, &res)))
          118 -                die("%s: getaddrinfo: %s\n", argv0, gai_strerror(e));
          119 -
          120 -        for (rp = res; rp; rp = rp->ai_next) {
          121 -                fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
          122 -                if (fd == -1)
          123 -                        continue;
          124 -                if (connect(fd, rp->ai_addr, rp->ai_addrlen) == -1) {
          125 -                        close(fd);
          126 -                        fd = -1;
          127 -                        continue;
          128 -                }
          129 -                break; /* success */
          130 -        }
          131 -        if (fd == -1)
          132 -                die("%s: could not connect to %s:%s: %s\n",
          133 -                        argv0, host, service, strerror(errno));
          134 -
          135 -        freeaddrinfo(res);
          136 -        return fd;
          137 +        ewritestr(WRITE_FD, msg);
          138  }
          139  
          140  static int
          141 @@ -459,16 +405,16 @@ channel_print(Channel *c, const char *buf)
          142  }
          143  
          144  static void
          145 -proc_channels_privmsg(int ircfd, Channel *c, char *buf)
          146 +proc_channels_privmsg(Channel *c, char *buf)
          147  {
          148          snprintf(msg, sizeof(msg), "<%s> %s", nick, buf);
          149          channel_print(c, msg);
          150          snprintf(msg, sizeof(msg), "PRIVMSG %s :%s\r\n", c->name, buf);
          151 -        ewritestr(ircfd, msg);
          152 +        ewritestr(WRITE_FD, msg);
          153  }
          154  
          155  static void
          156 -proc_channels_input(int ircfd, Channel *c, char *buf)
          157 +proc_channels_input(Channel *c, char *buf)
          158  {
          159          char *p = NULL;
          160          size_t buflen;
          161 @@ -476,7 +422,7 @@ proc_channels_input(int ircfd, Channel *c, char *buf)
          162          if (buf[0] == '\0')
          163                  return;
          164          if (buf[0] != '/') {
          165 -                proc_channels_privmsg(ircfd, c, buf);
          166 +                proc_channels_privmsg(c, buf);
          167                  return;
          168          }
          169  
          170 @@ -501,7 +447,7 @@ proc_channels_input(int ircfd, Channel *c, char *buf)
          171                                  channel_join(&buf[3]);
          172                          } else if (p) {
          173                                  if ((c = channel_join(&buf[3])))
          174 -                                        proc_channels_privmsg(ircfd, c, p + 1);
          175 +                                        proc_channels_privmsg(c, p + 1);
          176                                  return;
          177                          }
          178                          break;
          179 @@ -533,7 +479,7 @@ proc_channels_input(int ircfd, Channel *c, char *buf)
          180                          else
          181                                  snprintf(msg, sizeof(msg),
          182                                           "PART %s :leaving\r\n", c->name);
          183 -                        ewritestr(ircfd, msg);
          184 +                        ewritestr(WRITE_FD, msg);
          185                          channel_leave(c);
          186                          return;
          187                          break;
          188 @@ -543,7 +489,7 @@ proc_channels_input(int ircfd, Channel *c, char *buf)
          189                          else
          190                                  snprintf(msg, sizeof(msg),
          191                                           "QUIT %s\r\n", "bye");
          192 -                        ewritestr(ircfd, msg);
          193 +                        ewritestr(WRITE_FD, msg);
          194                          isrunning = 0;
          195                          return;
          196                          break;
          197 @@ -556,11 +502,11 @@ proc_channels_input(int ircfd, Channel *c, char *buf)
          198                  snprintf(msg, sizeof(msg), "%s\r\n", &buf[1]);
          199          }
          200          if (msg[0] != '\0')
          201 -                ewritestr(ircfd, msg);
          202 +                ewritestr(WRITE_FD, msg);
          203  }
          204  
          205  static void
          206 -proc_server_cmd(int fd, char *buf)
          207 +proc_server_cmd(char *buf)
          208  {
          209          Channel *c;
          210          const char *channel;
          211 @@ -608,7 +554,7 @@ proc_server_cmd(int fd, char *buf)
          212                  return;
          213          } else if (!strcmp("PING", argv[TOK_CMD])) {
          214                  snprintf(msg, sizeof(msg), "PONG %s\r\n", argv[TOK_TEXT]);
          215 -                ewritestr(fd, msg);
          216 +                ewritestr(WRITE_FD, msg);
          217                  return;
          218          } else if (!argv[TOK_NICKSRV] || !argv[TOK_USER]) {
          219                  /* server command */
          220 @@ -695,7 +641,7 @@ read_line(int fd, char *buf, size_t bufsiz)
          221  }
          222  
          223  static void
          224 -handle_channels_input(int ircfd, Channel *c)
          225 +handle_channels_input(Channel *c)
          226  {
          227          /*
          228           * Do not allow to read this fully, since commands will be
          229 @@ -711,20 +657,19 @@ handle_channels_input(int ircfd, Channel *c)
          230                          channel_rm(c);
          231                  return;
          232          }
          233 -        proc_channels_input(ircfd, c, buf);
          234 +        proc_channels_input(c, buf);
          235  }
          236  
          237  static void
          238 -handle_server_output(int ircfd)
          239 +handle_server_output(void)
          240  {
          241          char buf[IRC_MSG_MAX];
          242  
          243 -        if (read_line(ircfd, buf, sizeof(buf)) == -1)
          244 +        if (read_line(READ_FD, buf, sizeof(buf)) == -1)
          245                  die("%s: remote host closed connection: %s\n", argv0, strerror(errno));
          246 -
          247          fprintf(stdout, "%lu %s\n", (unsigned long)time(NULL), buf);
          248          fflush(stdout);
          249 -        proc_server_cmd(ircfd, buf);
          250 +        proc_server_cmd(buf);
          251  }
          252  
          253  static void
          254 @@ -746,7 +691,7 @@ setup(void)
          255  }
          256  
          257  static void
          258 -run(int ircfd, const char *host)
          259 +run(const char *host)
          260  {
          261          Channel *c, *tmp;
          262          fd_set rdset;
          263 @@ -756,9 +701,9 @@ run(int ircfd, const char *host)
          264  
          265          snprintf(ping_msg, sizeof(ping_msg), "PING %s\r\n", host);
          266          while (isrunning) {
          267 -                maxfd = ircfd;
          268 +                maxfd = READ_FD;
          269                  FD_ZERO(&rdset);
          270 -                FD_SET(ircfd, &rdset);
          271 +                FD_SET(READ_FD, &rdset);
          272                  for (c = channels; c; c = c->next) {
          273                          if (c->fdin > maxfd)
          274                                  maxfd = c->fdin;
          275 @@ -777,17 +722,17 @@ run(int ircfd, const char *host)
          276                                  cleanup();
          277                                  exit(2); /* status code 2 for timeout */
          278                          }
          279 -                        ewritestr(ircfd, ping_msg);
          280 +                        ewritestr(WRITE_FD, ping_msg);
          281                          continue;
          282                  }
          283 -                if (FD_ISSET(ircfd, &rdset)) {
          284 -                        handle_server_output(ircfd);
          285 +                if (FD_ISSET(READ_FD, &rdset)) {
          286 +                        handle_server_output();
          287                          last_response = time(NULL);
          288                  }
          289                  for (c = channels; c; c = tmp) {
          290                          tmp = c->next;
          291                          if (FD_ISSET(c->fdin, &rdset))
          292 -                                handle_channels_input(ircfd, c);
          293 +                                handle_channels_input(c);
          294                  }
          295          }
          296  }
          297 @@ -799,7 +744,7 @@ main(int argc, char *argv[])
          298          const char *key = NULL, *fullname = NULL, *host = "";
          299          const char *uds = NULL, *service = "6667";
          300          char prefix[PATH_MAX];
          301 -        int ircfd, r;
          302 +        int r;
          303  
          304          /* use nickname and home dir of user by default */
          305          if (!(spw = getpwuid(getuid())))
          306 @@ -838,11 +783,6 @@ main(int argc, char *argv[])
          307          if (!*host)
          308                  usage();
          309  
          310 -        if (uds)
          311 -                ircfd = udsopen(uds);
          312 -        else
          313 -                ircfd = tcpopen(host, service);
          314 -
          315  #ifdef __OpenBSD__
          316          /* OpenBSD pledge(2) support */
          317          if (pledge("stdio rpath wpath cpath dpath", NULL) == -1)
          318 @@ -856,10 +796,10 @@ main(int argc, char *argv[])
          319  
          320          channelmaster = channel_add(""); /* master channel */
          321          if (key)
          322 -                loginkey(ircfd, key);
          323 -        loginuser(ircfd, host, fullname && *fullname ? fullname : nick);
          324 +                loginkey(key);
          325 +        loginuser(host, fullname && *fullname ? fullname : nick);
          326          setup();
          327 -        run(ircfd, host);
          328 +        run(host);
          329          cleanup();
          330  
          331          return 0;