ii-1.8-ucspi.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) 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