ii-2.0-ucspi.diff - 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 <[email protected]> | |
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 ch… | |
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… | |
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(… | |
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_prot… | |
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,… | |
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->nam… | |
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 *b… | |
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, s… | |
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; |