sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

ii-1.8-ucspi.diff (9092B)


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