sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | 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;