ii-ssl-20200811-ecf3902.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
ii-ssl-20200811-ecf3902.diff (21310B) | |
--- | |
1 From 68d3498bb0ce639875c5927a618567231b500d61 Mon Sep 17 00:00:00 2001 | |
2 From: Alexandre Hannedouche <[email protected]> | |
3 Date: Tue, 11 Aug 2020 22:51:08 +0200 | |
4 Subject: [PATCH] porting ssh patch to 1.8 | |
5 | |
6 --- | |
7 config.mk | 2 +- | |
8 ii.1 | 5 ++ | |
9 ii.c | 154 +++++++++++++++++++++++++++++++++++++++++------------- | |
10 3 files changed, 123 insertions(+), 38 deletions(-) | |
11 | |
12 diff --git a/config.mk b/config.mk | |
13 index 957bae0..9becc42 100644 | |
14 --- a/config.mk | |
15 +++ b/config.mk | |
16 @@ -10,5 +10,5 @@ DOCPREFIX = ${PREFIX}/share/doc | |
17 # remove NEED_STRLCPY from CFLAGS and | |
18 # remove strlcpy.o from LIBS | |
19 CFLAGS = -DNEED_STRLCPY -Os | |
20 -LDFLAGS = -s | |
21 +LDFLAGS = -s -lssl -lcrypto | |
22 LIBS = strlcpy.o | |
23 diff --git a/ii.1 b/ii.1 | |
24 index 8e06af7..6d7704c 100644 | |
25 --- a/ii.1 | |
26 +++ b/ii.1 | |
27 @@ -21,6 +21,8 @@ and ii creates a new channel directory with in and out… | |
28 .IR servername > | |
29 .RB [ \-p | |
30 .IR port ] | |
31 +.RB [ \-e | |
32 +.IR ssl ] | |
33 .RB [ \-k | |
34 .IR "environment variable" ] | |
35 .RB [ \-i | |
36 @@ -42,6 +44,9 @@ connect to a UNIX domain socket instead of directly to… | |
37 .BI \-p " port" | |
38 lets you override the default port (6667) | |
39 .TP | |
40 +.BI \-e " ssl" | |
41 +lets you connect using ssl encryption. The default ssl port is 6697. | |
42 +.TP | |
43 .BI \-k " environment variable" | |
44 lets you specify an environment variable that contains your IRC passwor… | |
45 This is done in order to prevent other users from eavesdropping the ser… | |
46 diff --git a/ii.c b/ii.c | |
47 index 426fcff..9a09135 100644 | |
48 --- a/ii.c | |
49 +++ b/ii.c | |
50 @@ -20,6 +20,10 @@ | |
51 #include <time.h> | |
52 #include <unistd.h> | |
53 | |
54 +#include <openssl/rand.h> | |
55 +#include <openssl/ssl.h> | |
56 +#include <openssl/err.h> | |
57 + | |
58 char *argv0; | |
59 | |
60 #include "arg.h" | |
61 @@ -43,6 +47,13 @@ struct Channel { | |
62 Channel *next; | |
63 }; | |
64 | |
65 +typedef struct { | |
66 + int use_ssl; | |
67 + int irc; | |
68 + SSL *sslHandle; | |
69 + SSL_CTX *sslContext; | |
70 +} conn; | |
71 + | |
72 static Channel * channel_add(const char *); | |
73 static Channel * channel_find(const char *); | |
74 static Channel * channel_join(const char *); | |
75 @@ -56,20 +67,23 @@ static int channel_reopen(Channel *); | |
76 static void channel_rm(Channel *); | |
77 static void create_dirtree(const char *); | |
78 static void create_filepath(char *, size_t, const char *, const ch… | |
79 -static void ewritestr(int, const char *); | |
80 -static void handle_channels_input(int, Channel *); | |
81 -static void handle_server_output(int); | |
82 +static int swrite(conn *, const char *, size_t); | |
83 +static void ewritestr(conn *, const char *); | |
84 +static void handle_channels_input(conn *, Channel *); | |
85 +static void handle_server_output(conn *); | |
86 static int isnumeric(const char *); | |
87 -static void loginkey(int, const char *); | |
88 -static void loginuser(int, const char *, const char *); | |
89 -static void proc_channels_input(int, Channel *, char *); | |
90 -static void proc_channels_privmsg(int, Channel *, char *); | |
91 -static void proc_server_cmd(int, char *); | |
92 -static int read_line(int, char *, size_t); | |
93 -static void run(int, const char *); | |
94 +static void loginkey(conn *, const char *); | |
95 +static void loginuser(conn *, const char *, const char *); | |
96 +static void proc_channels_input(conn *, Channel *, char *); | |
97 +static void proc_channels_privmsg(conn *, Channel *, char *); | |
98 +static void proc_server_cmd(conn *, char *); | |
99 +static int sread(conn *, char *, size_t); | |
100 +static int read_line(conn *, char *, size_t); | |
101 +static int read_line_from_channel(int, char *, size_t); | |
102 +static void run(conn *, const char *); | |
103 static void setup(void); | |
104 static void sighandler(int); | |
105 -static int tcpopen(const char *, const char *); | |
106 +static void tcpopen(conn *ircfd, const char *, const char *); | |
107 static size_t tokenize(char **, size_t, char *, int); | |
108 static int udsopen(const char *); | |
109 static void usage(void); | |
110 @@ -87,20 +101,29 @@ static void | |
111 usage(void) | |
112 { | |
113 fprintf(stderr, "usage: %s <-s host> [-i <irc dir>] [-p <port>]… | |
114 - "[-u <sockname>] [-n <nick>] [-k <password>] " | |
115 + "[-e <ssl>] [-u <sockname>] [-n <nick>] [-k <password>]… | |
116 "[-f <fullname>]\n", argv0); | |
117 exit(1); | |
118 } | |
119 | |
120 +static int | |
121 +swrite(conn *ircfd, const char *msg, size_t len) | |
122 +{ | |
123 + if (ircfd->use_ssl) | |
124 + return SSL_write(ircfd->sslHandle, msg, len); | |
125 + | |
126 + return write(ircfd->irc, msg, len); | |
127 +} | |
128 + | |
129 static void | |
130 -ewritestr(int fd, const char *s) | |
131 +ewritestr(conn *fd, const char *s) | |
132 { | |
133 size_t len, off = 0; | |
134 int w = -1; | |
135 | |
136 len = strlen(s); | |
137 for (off = 0; off < len; off += w) { | |
138 - if ((w = write(fd, s + off, len - off)) == -1) | |
139 + if ((w = swrite(fd, s + off, len - off)) == -1) | |
140 break; | |
141 } | |
142 if (w == -1) { | |
143 @@ -319,14 +342,14 @@ channel_leave(Channel *c) | |
144 } | |
145 | |
146 static void | |
147 -loginkey(int ircfd, const char *key) | |
148 +loginkey(conn *ircfd, const char *key) | |
149 { | |
150 snprintf(msg, sizeof(msg), "PASS %s\r\n", key); | |
151 ewritestr(ircfd, msg); | |
152 } | |
153 | |
154 static void | |
155 -loginuser(int ircfd, const char *host, const char *fullname) | |
156 +loginuser(conn *ircfd, const char *host, const char *fullname) | |
157 { | |
158 snprintf(msg, sizeof(msg), "NICK %s\r\nUSER %s localhost %s :%s… | |
159 nick, nick, host, fullname); | |
160 @@ -359,12 +382,15 @@ udsopen(const char *uds) | |
161 return fd; | |
162 } | |
163 | |
164 -static int | |
165 -tcpopen(const char *host, const char *service) | |
166 +static void | |
167 +tcpopen(conn *ircfd, const char *host, const char *service) | |
168 { | |
169 struct addrinfo hints, *res = NULL, *rp; | |
170 int fd = -1, e; | |
171 | |
172 + ircfd->sslHandle = NULL; | |
173 + ircfd->sslContext = NULL; | |
174 + | |
175 memset(&hints, 0, sizeof(hints)); | |
176 hints.ai_family = AF_UNSPEC; /* allow IPv4 or IPv6 */ | |
177 hints.ai_flags = AI_NUMERICSERV; /* avoid name lookup for port … | |
178 @@ -393,7 +419,19 @@ tcpopen(const char *host, const char *service) | |
179 } | |
180 | |
181 freeaddrinfo(res); | |
182 - return fd; | |
183 + ircfd->irc = fd; | |
184 + if (!ircfd->use_ssl) | |
185 + return; | |
186 + | |
187 + //SSL_load_error_strings(); | |
188 + //SSL_library_init(); | |
189 + ircfd->sslContext = SSL_CTX_new(SSLv23_client_method()); | |
190 + if (ircfd->sslContext == NULL) | |
191 + ERR_print_errors_fp(stderr); | |
192 + ircfd->sslHandle = SSL_new(ircfd->sslContext); | |
193 + if (!SSL_set_fd(ircfd->sslHandle, ircfd->irc) || | |
194 + (SSL_connect(ircfd->sslHandle) != 1)) | |
195 + ERR_print_errors_fp(stderr); | |
196 } | |
197 | |
198 static int | |
199 @@ -445,7 +483,7 @@ channel_print(Channel *c, const char *buf) | |
200 } | |
201 | |
202 static void | |
203 -proc_channels_privmsg(int ircfd, Channel *c, char *buf) | |
204 +proc_channels_privmsg(conn *ircfd, Channel *c, char *buf) | |
205 { | |
206 snprintf(msg, sizeof(msg), "<%s> %s", nick, buf); | |
207 channel_print(c, msg); | |
208 @@ -454,7 +492,7 @@ proc_channels_privmsg(int ircfd, Channel *c, char *b… | |
209 } | |
210 | |
211 static void | |
212 -proc_channels_input(int ircfd, Channel *c, char *buf) | |
213 +proc_channels_input(conn *ircfd, Channel *c, char *buf) | |
214 { | |
215 char *p = NULL; | |
216 size_t buflen; | |
217 @@ -546,7 +584,7 @@ proc_channels_input(int ircfd, Channel *c, char *buf) | |
218 } | |
219 | |
220 static void | |
221 -proc_server_cmd(int fd, char *buf) | |
222 +proc_server_cmd(conn *fd, char *buf) | |
223 { | |
224 Channel *c; | |
225 const char *channel; | |
226 @@ -665,8 +703,33 @@ proc_server_cmd(int fd, char *buf) | |
227 channel_print(c, msg); | |
228 } | |
229 | |
230 + | |
231 +static int | |
232 +sread(conn *fd, char *buf, size_t bufsize) | |
233 +{ | |
234 + if (fd->use_ssl) | |
235 + return SSL_read(fd->sslHandle, buf, bufsize); | |
236 + | |
237 + return read(fd->irc, buf, bufsize); | |
238 +} | |
239 + | |
240 +static int | |
241 +read_line(conn *fd, char *buf, size_t bufsiz) | |
242 +{ | |
243 + size_t i = 0; | |
244 + char c = '\0'; | |
245 + | |
246 + do { | |
247 + if (sread(fd, &c, sizeof(char)) != sizeof(char)) | |
248 + return -1; | |
249 + buf[i++] = c; | |
250 + } while (c != '\n' && i < bufsiz); | |
251 + buf[i - 1] = '\0'; /* eliminates '\n' */ | |
252 + return 0; | |
253 +} | |
254 + | |
255 static int | |
256 -read_line(int fd, char *buf, size_t bufsiz) | |
257 +read_line_from_channel(int fd, char *buf, size_t bufsiz) | |
258 { | |
259 size_t i = 0; | |
260 char c = '\0'; | |
261 @@ -681,11 +744,11 @@ read_line(int fd, char *buf, size_t bufsiz) | |
262 } | |
263 | |
264 static void | |
265 -handle_channels_input(int ircfd, Channel *c) | |
266 +handle_channels_input(conn *ircfd, Channel *c) | |
267 { | |
268 char buf[IRC_MSG_MAX]; | |
269 | |
270 - if (read_line(c->fdin, buf, sizeof(buf)) == -1) { | |
271 + if (read_line_from_channel(c->fdin, buf, sizeof(buf)) == -1) { | |
272 if (channel_reopen(c) == -1) | |
273 channel_rm(c); | |
274 return; | |
275 @@ -694,7 +757,7 @@ handle_channels_input(int ircfd, Channel *c) | |
276 } | |
277 | |
278 static void | |
279 -handle_server_output(int ircfd) | |
280 +handle_server_output(conn *ircfd) | |
281 { | |
282 char buf[IRC_MSG_MAX]; | |
283 | |
284 @@ -727,7 +790,7 @@ setup(void) | |
285 } | |
286 | |
287 static void | |
288 -run(int ircfd, const char *host) | |
289 +run(conn *ircfd, const char *host) | |
290 { | |
291 Channel *c, *tmp; | |
292 fd_set rdset; | |
293 @@ -737,9 +800,9 @@ run(int ircfd, const char *host) | |
294 | |
295 snprintf(ping_msg, sizeof(ping_msg), "PING %s\r\n", host); | |
296 while (isrunning) { | |
297 - maxfd = ircfd; | |
298 + maxfd = ircfd->irc; | |
299 FD_ZERO(&rdset); | |
300 - FD_SET(ircfd, &rdset); | |
301 + FD_SET(ircfd->irc, &rdset); | |
302 for (c = channels; c; c = c->next) { | |
303 if (c->fdin > maxfd) | |
304 maxfd = c->fdin; | |
305 @@ -761,7 +824,7 @@ run(int ircfd, const char *host) | |
306 ewritestr(ircfd, ping_msg); | |
307 continue; | |
308 } | |
309 - if (FD_ISSET(ircfd, &rdset)) { | |
310 + if (FD_ISSET(ircfd->irc, &rdset)) { | |
311 handle_server_output(ircfd); | |
312 last_response = time(NULL); | |
313 } | |
314 @@ -779,9 +842,12 @@ main(int argc, char *argv[]) | |
315 Channel *c, *tmp; | |
316 struct passwd *spw; | |
317 const char *key = NULL, *fullname = NULL, *host = ""; | |
318 - const char *uds = NULL, *service = "6667"; | |
319 + const char *uds = NULL; | |
320 + const char *service = "6667"; | |
321 + const char *sservice = "6697"; | |
322 char prefix[PATH_MAX]; | |
323 - int ircfd, r; | |
324 + int r, defaultPort = 1; | |
325 + conn ircfd; | |
326 | |
327 /* use nickname and home dir of user by default */ | |
328 if (!(spw = getpwuid(getuid()))) { | |
329 @@ -806,6 +872,7 @@ main(int argc, char *argv[]) | |
330 break; | |
331 case 'p': | |
332 service = EARGF(usage()); | |
333 + defaultPort = 0; | |
334 break; | |
335 case 's': | |
336 host = EARGF(usage()); | |
337 @@ -813,6 +880,11 @@ main(int argc, char *argv[]) | |
338 case 'u': | |
339 uds = EARGF(usage()); | |
340 break; | |
341 + case 'e': | |
342 + if (defaultPort) | |
343 + service = sservice; | |
344 + ircfd.use_ssl = 1; | |
345 + break; | |
346 default: | |
347 usage(); | |
348 break; | |
349 @@ -822,9 +894,9 @@ main(int argc, char *argv[]) | |
350 usage(); | |
351 | |
352 if (uds) | |
353 - ircfd = udsopen(uds); | |
354 + ircfd.irc = udsopen(uds); | |
355 else | |
356 - ircfd = tcpopen(host, service); | |
357 + tcpopen(&ircfd, host, service); | |
358 | |
359 #ifdef __OpenBSD__ | |
360 /* OpenBSD pledge(2) support */ | |
361 @@ -843,10 +915,10 @@ main(int argc, char *argv[]) | |
362 | |
363 channelmaster = channel_add(""); /* master channel */ | |
364 if (key) | |
365 - loginkey(ircfd, key); | |
366 - loginuser(ircfd, host, fullname && *fullname ? fullname : nick); | |
367 + loginkey(&ircfd, key); | |
368 + loginuser(&ircfd, host, fullname && *fullname ? fullname : nick… | |
369 setup(); | |
370 - run(ircfd, host); | |
371 + run(&ircfd, host); | |
372 if (channelmaster) | |
373 channel_leave(channelmaster); | |
374 | |
375 @@ -855,5 +927,13 @@ main(int argc, char *argv[]) | |
376 channel_leave(c); | |
377 } | |
378 | |
379 + if (ircfd.use_ssl) { | |
380 + SSL_shutdown(ircfd.sslHandle); | |
381 + SSL_free(ircfd.sslHandle); | |
382 + SSL_CTX_free(ircfd.sslContext); | |
383 + } | |
384 + | |
385 + close(ircfd.irc); | |
386 + | |
387 return 0; | |
388 } | |
389 -- | |
390 2.28.0 | |
391 | |
392 From 6c237478845fa047a5f414f9c032b2674da8f30b Mon Sep 17 00:00:00 2001 | |
393 From: Alexandre Hannedouche <[email protected]> | |
394 Date: Tue, 11 Aug 2020 22:51:08 +0200 | |
395 Subject: [PATCH] porting ssl patch to 1.8 | |
396 | |
397 --- | |
398 config.mk | 2 +- | |
399 ii.1 | 5 ++ | |
400 ii.c | 154 +++++++++++++++++++++++++++++++++++++++++------------- | |
401 3 files changed, 123 insertions(+), 38 deletions(-) | |
402 | |
403 diff --git a/config.mk b/config.mk | |
404 index 957bae0..9becc42 100644 | |
405 --- a/config.mk | |
406 +++ b/config.mk | |
407 @@ -10,5 +10,5 @@ DOCPREFIX = ${PREFIX}/share/doc | |
408 # remove NEED_STRLCPY from CFLAGS and | |
409 # remove strlcpy.o from LIBS | |
410 CFLAGS = -DNEED_STRLCPY -Os | |
411 -LDFLAGS = -s | |
412 +LDFLAGS = -s -lssl -lcrypto | |
413 LIBS = strlcpy.o | |
414 diff --git a/ii.1 b/ii.1 | |
415 index 8e06af7..6d7704c 100644 | |
416 --- a/ii.1 | |
417 +++ b/ii.1 | |
418 @@ -21,6 +21,8 @@ and ii creates a new channel directory with in and out… | |
419 .IR servername > | |
420 .RB [ \-p | |
421 .IR port ] | |
422 +.RB [ \-e | |
423 +.IR ssl ] | |
424 .RB [ \-k | |
425 .IR "environment variable" ] | |
426 .RB [ \-i | |
427 @@ -42,6 +44,9 @@ connect to a UNIX domain socket instead of directly to… | |
428 .BI \-p " port" | |
429 lets you override the default port (6667) | |
430 .TP | |
431 +.BI \-e " ssl" | |
432 +lets you connect using ssl encryption. The default ssl port is 6697. | |
433 +.TP | |
434 .BI \-k " environment variable" | |
435 lets you specify an environment variable that contains your IRC passwor… | |
436 This is done in order to prevent other users from eavesdropping the ser… | |
437 diff --git a/ii.c b/ii.c | |
438 index 426fcff..9a09135 100644 | |
439 --- a/ii.c | |
440 +++ b/ii.c | |
441 @@ -20,6 +20,10 @@ | |
442 #include <time.h> | |
443 #include <unistd.h> | |
444 | |
445 +#include <openssl/rand.h> | |
446 +#include <openssl/ssl.h> | |
447 +#include <openssl/err.h> | |
448 + | |
449 char *argv0; | |
450 | |
451 #include "arg.h" | |
452 @@ -43,6 +47,13 @@ struct Channel { | |
453 Channel *next; | |
454 }; | |
455 | |
456 +typedef struct { | |
457 + int use_ssl; | |
458 + int irc; | |
459 + SSL *sslHandle; | |
460 + SSL_CTX *sslContext; | |
461 +} conn; | |
462 + | |
463 static Channel * channel_add(const char *); | |
464 static Channel * channel_find(const char *); | |
465 static Channel * channel_join(const char *); | |
466 @@ -56,20 +67,23 @@ static int channel_reopen(Channel *); | |
467 static void channel_rm(Channel *); | |
468 static void create_dirtree(const char *); | |
469 static void create_filepath(char *, size_t, const char *, const ch… | |
470 -static void ewritestr(int, const char *); | |
471 -static void handle_channels_input(int, Channel *); | |
472 -static void handle_server_output(int); | |
473 +static int swrite(conn *, const char *, size_t); | |
474 +static void ewritestr(conn *, const char *); | |
475 +static void handle_channels_input(conn *, Channel *); | |
476 +static void handle_server_output(conn *); | |
477 static int isnumeric(const char *); | |
478 -static void loginkey(int, const char *); | |
479 -static void loginuser(int, const char *, const char *); | |
480 -static void proc_channels_input(int, Channel *, char *); | |
481 -static void proc_channels_privmsg(int, Channel *, char *); | |
482 -static void proc_server_cmd(int, char *); | |
483 -static int read_line(int, char *, size_t); | |
484 -static void run(int, const char *); | |
485 +static void loginkey(conn *, const char *); | |
486 +static void loginuser(conn *, const char *, const char *); | |
487 +static void proc_channels_input(conn *, Channel *, char *); | |
488 +static void proc_channels_privmsg(conn *, Channel *, char *); | |
489 +static void proc_server_cmd(conn *, char *); | |
490 +static int sread(conn *, char *, size_t); | |
491 +static int read_line(conn *, char *, size_t); | |
492 +static int read_line_from_channel(int, char *, size_t); | |
493 +static void run(conn *, const char *); | |
494 static void setup(void); | |
495 static void sighandler(int); | |
496 -static int tcpopen(const char *, const char *); | |
497 +static void tcpopen(conn *ircfd, const char *, const char *); | |
498 static size_t tokenize(char **, size_t, char *, int); | |
499 static int udsopen(const char *); | |
500 static void usage(void); | |
501 @@ -87,20 +101,29 @@ static void | |
502 usage(void) | |
503 { | |
504 fprintf(stderr, "usage: %s <-s host> [-i <irc dir>] [-p <port>]… | |
505 - "[-u <sockname>] [-n <nick>] [-k <password>] " | |
506 + "[-e <ssl>] [-u <sockname>] [-n <nick>] [-k <password>]… | |
507 "[-f <fullname>]\n", argv0); | |
508 exit(1); | |
509 } | |
510 | |
511 +static int | |
512 +swrite(conn *ircfd, const char *msg, size_t len) | |
513 +{ | |
514 + if (ircfd->use_ssl) | |
515 + return SSL_write(ircfd->sslHandle, msg, len); | |
516 + | |
517 + return write(ircfd->irc, msg, len); | |
518 +} | |
519 + | |
520 static void | |
521 -ewritestr(int fd, const char *s) | |
522 +ewritestr(conn *fd, const char *s) | |
523 { | |
524 size_t len, off = 0; | |
525 int w = -1; | |
526 | |
527 len = strlen(s); | |
528 for (off = 0; off < len; off += w) { | |
529 - if ((w = write(fd, s + off, len - off)) == -1) | |
530 + if ((w = swrite(fd, s + off, len - off)) == -1) | |
531 break; | |
532 } | |
533 if (w == -1) { | |
534 @@ -319,14 +342,14 @@ channel_leave(Channel *c) | |
535 } | |
536 | |
537 static void | |
538 -loginkey(int ircfd, const char *key) | |
539 +loginkey(conn *ircfd, const char *key) | |
540 { | |
541 snprintf(msg, sizeof(msg), "PASS %s\r\n", key); | |
542 ewritestr(ircfd, msg); | |
543 } | |
544 | |
545 static void | |
546 -loginuser(int ircfd, const char *host, const char *fullname) | |
547 +loginuser(conn *ircfd, const char *host, const char *fullname) | |
548 { | |
549 snprintf(msg, sizeof(msg), "NICK %s\r\nUSER %s localhost %s :%s… | |
550 nick, nick, host, fullname); | |
551 @@ -359,12 +382,15 @@ udsopen(const char *uds) | |
552 return fd; | |
553 } | |
554 | |
555 -static int | |
556 -tcpopen(const char *host, const char *service) | |
557 +static void | |
558 +tcpopen(conn *ircfd, const char *host, const char *service) | |
559 { | |
560 struct addrinfo hints, *res = NULL, *rp; | |
561 int fd = -1, e; | |
562 | |
563 + ircfd->sslHandle = NULL; | |
564 + ircfd->sslContext = NULL; | |
565 + | |
566 memset(&hints, 0, sizeof(hints)); | |
567 hints.ai_family = AF_UNSPEC; /* allow IPv4 or IPv6 */ | |
568 hints.ai_flags = AI_NUMERICSERV; /* avoid name lookup for port … | |
569 @@ -393,7 +419,19 @@ tcpopen(const char *host, const char *service) | |
570 } | |
571 | |
572 freeaddrinfo(res); | |
573 - return fd; | |
574 + ircfd->irc = fd; | |
575 + if (!ircfd->use_ssl) | |
576 + return; | |
577 + | |
578 + //SSL_load_error_strings(); | |
579 + //SSL_library_init(); | |
580 + ircfd->sslContext = SSL_CTX_new(SSLv23_client_method()); | |
581 + if (ircfd->sslContext == NULL) | |
582 + ERR_print_errors_fp(stderr); | |
583 + ircfd->sslHandle = SSL_new(ircfd->sslContext); | |
584 + if (!SSL_set_fd(ircfd->sslHandle, ircfd->irc) || | |
585 + (SSL_connect(ircfd->sslHandle) != 1)) | |
586 + ERR_print_errors_fp(stderr); | |
587 } | |
588 | |
589 static int | |
590 @@ -445,7 +483,7 @@ channel_print(Channel *c, const char *buf) | |
591 } | |
592 | |
593 static void | |
594 -proc_channels_privmsg(int ircfd, Channel *c, char *buf) | |
595 +proc_channels_privmsg(conn *ircfd, Channel *c, char *buf) | |
596 { | |
597 snprintf(msg, sizeof(msg), "<%s> %s", nick, buf); | |
598 channel_print(c, msg); | |
599 @@ -454,7 +492,7 @@ proc_channels_privmsg(int ircfd, Channel *c, char *b… | |
600 } | |
601 | |
602 static void | |
603 -proc_channels_input(int ircfd, Channel *c, char *buf) | |
604 +proc_channels_input(conn *ircfd, Channel *c, char *buf) | |
605 { | |
606 char *p = NULL; | |
607 size_t buflen; | |
608 @@ -546,7 +584,7 @@ proc_channels_input(int ircfd, Channel *c, char *buf) | |
609 } | |
610 | |
611 static void | |
612 -proc_server_cmd(int fd, char *buf) | |
613 +proc_server_cmd(conn *fd, char *buf) | |
614 { | |
615 Channel *c; | |
616 const char *channel; | |
617 @@ -665,8 +703,33 @@ proc_server_cmd(int fd, char *buf) | |
618 channel_print(c, msg); | |
619 } | |
620 | |
621 + | |
622 +static int | |
623 +sread(conn *fd, char *buf, size_t bufsize) | |
624 +{ | |
625 + if (fd->use_ssl) | |
626 + return SSL_read(fd->sslHandle, buf, bufsize); | |
627 + | |
628 + return read(fd->irc, buf, bufsize); | |
629 +} | |
630 + | |
631 +static int | |
632 +read_line(conn *fd, char *buf, size_t bufsiz) | |
633 +{ | |
634 + size_t i = 0; | |
635 + char c = '\0'; | |
636 + | |
637 + do { | |
638 + if (sread(fd, &c, sizeof(char)) != sizeof(char)) | |
639 + return -1; | |
640 + buf[i++] = c; | |
641 + } while (c != '\n' && i < bufsiz); | |
642 + buf[i - 1] = '\0'; /* eliminates '\n' */ | |
643 + return 0; | |
644 +} | |
645 + | |
646 static int | |
647 -read_line(int fd, char *buf, size_t bufsiz) | |
648 +read_line_from_channel(int fd, char *buf, size_t bufsiz) | |
649 { | |
650 size_t i = 0; | |
651 char c = '\0'; | |
652 @@ -681,11 +744,11 @@ read_line(int fd, char *buf, size_t bufsiz) | |
653 } | |
654 | |
655 static void | |
656 -handle_channels_input(int ircfd, Channel *c) | |
657 +handle_channels_input(conn *ircfd, Channel *c) | |
658 { | |
659 char buf[IRC_MSG_MAX]; | |
660 | |
661 - if (read_line(c->fdin, buf, sizeof(buf)) == -1) { | |
662 + if (read_line_from_channel(c->fdin, buf, sizeof(buf)) == -1) { | |
663 if (channel_reopen(c) == -1) | |
664 channel_rm(c); | |
665 return; | |
666 @@ -694,7 +757,7 @@ handle_channels_input(int ircfd, Channel *c) | |
667 } | |
668 | |
669 static void | |
670 -handle_server_output(int ircfd) | |
671 +handle_server_output(conn *ircfd) | |
672 { | |
673 char buf[IRC_MSG_MAX]; | |
674 | |
675 @@ -727,7 +790,7 @@ setup(void) | |
676 } | |
677 | |
678 static void | |
679 -run(int ircfd, const char *host) | |
680 +run(conn *ircfd, const char *host) | |
681 { | |
682 Channel *c, *tmp; | |
683 fd_set rdset; | |
684 @@ -737,9 +800,9 @@ run(int ircfd, const char *host) | |
685 | |
686 snprintf(ping_msg, sizeof(ping_msg), "PING %s\r\n", host); | |
687 while (isrunning) { | |
688 - maxfd = ircfd; | |
689 + maxfd = ircfd->irc; | |
690 FD_ZERO(&rdset); | |
691 - FD_SET(ircfd, &rdset); | |
692 + FD_SET(ircfd->irc, &rdset); | |
693 for (c = channels; c; c = c->next) { | |
694 if (c->fdin > maxfd) | |
695 maxfd = c->fdin; | |
696 @@ -761,7 +824,7 @@ run(int ircfd, const char *host) | |
697 ewritestr(ircfd, ping_msg); | |
698 continue; | |
699 } | |
700 - if (FD_ISSET(ircfd, &rdset)) { | |
701 + if (FD_ISSET(ircfd->irc, &rdset)) { | |
702 handle_server_output(ircfd); | |
703 last_response = time(NULL); | |
704 } | |
705 @@ -779,9 +842,12 @@ main(int argc, char *argv[]) | |
706 Channel *c, *tmp; | |
707 struct passwd *spw; | |
708 const char *key = NULL, *fullname = NULL, *host = ""; | |
709 - const char *uds = NULL, *service = "6667"; | |
710 + const char *uds = NULL; | |
711 + const char *service = "6667"; | |
712 + const char *sservice = "6697"; | |
713 char prefix[PATH_MAX]; | |
714 - int ircfd, r; | |
715 + int r, defaultPort = 1; | |
716 + conn ircfd; | |
717 | |
718 /* use nickname and home dir of user by default */ | |
719 if (!(spw = getpwuid(getuid()))) { | |
720 @@ -806,6 +872,7 @@ main(int argc, char *argv[]) | |
721 break; | |
722 case 'p': | |
723 service = EARGF(usage()); | |
724 + defaultPort = 0; | |
725 break; | |
726 case 's': | |
727 host = EARGF(usage()); | |
728 @@ -813,6 +880,11 @@ main(int argc, char *argv[]) | |
729 case 'u': | |
730 uds = EARGF(usage()); | |
731 break; | |
732 + case 'e': | |
733 + if (defaultPort) | |
734 + service = sservice; | |
735 + ircfd.use_ssl = 1; | |
736 + break; | |
737 default: | |
738 usage(); | |
739 break; | |
740 @@ -822,9 +894,9 @@ main(int argc, char *argv[]) | |
741 usage(); | |
742 | |
743 if (uds) | |
744 - ircfd = udsopen(uds); | |
745 + ircfd.irc = udsopen(uds); | |
746 else | |
747 - ircfd = tcpopen(host, service); | |
748 + tcpopen(&ircfd, host, service); | |
749 | |
750 #ifdef __OpenBSD__ | |
751 /* OpenBSD pledge(2) support */ | |
752 @@ -843,10 +915,10 @@ main(int argc, char *argv[]) | |
753 | |
754 channelmaster = channel_add(""); /* master channel */ | |
755 if (key) | |
756 - loginkey(ircfd, key); | |
757 - loginuser(ircfd, host, fullname && *fullname ? fullname : nick); | |
758 + loginkey(&ircfd, key); | |
759 + loginuser(&ircfd, host, fullname && *fullname ? fullname : nick… | |
760 setup(); | |
761 - run(ircfd, host); | |
762 + run(&ircfd, host); | |
763 if (channelmaster) | |
764 channel_leave(channelmaster); | |
765 | |
766 @@ -855,5 +927,13 @@ main(int argc, char *argv[]) | |
767 channel_leave(c); | |
768 } | |
769 | |
770 + if (ircfd.use_ssl) { | |
771 + SSL_shutdown(ircfd.sslHandle); | |
772 + SSL_free(ircfd.sslHandle); | |
773 + SSL_CTX_free(ircfd.sslContext); | |
774 + } | |
775 + | |
776 + close(ircfd.irc); | |
777 + | |
778 return 0; | |
779 } | |
780 -- | |
781 2.28.0 | |
782 |