Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.