ssl support, thanks xcko shrdlu! - irc - Unnamed repository; edit this file 'de… | |
git clone git://vernunftzentrum.de/irc.git | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 21c47bf2c7498d9fdabbcfe886d6f549b858ae9b | |
parent 0cfe3fad8f593bcf11d495d90f158afd567b1984 | |
Author: Quentin Carbonneaux <[email protected]> | |
Date: Wed, 18 Jan 2017 17:39:31 -0500 | |
ssl support, thanks xcko shrdlu! | |
Diffstat: | |
Makefile | 2 +- | |
irc.c | 57 +++++++++++++++++++++++-------- | |
2 files changed, 44 insertions(+), 15 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
@@ -1,7 +1,7 @@ | |
BIN = irc | |
CFLAGS = -std=c99 -Os -D_POSIX_C_SOURCE=201112 -D_GNU_SOURCE -D_XOPEN_CURSES -… | |
-LDFLAGS = -lncursesw | |
+LDFLAGS = -lncursesw -lssl -lcrypto | |
all: ${BIN} | |
diff --git a/irc.c b/irc.c | |
@@ -20,6 +20,7 @@ | |
#include <netdb.h> | |
#include <locale.h> | |
#include <wchar.h> | |
+#include <openssl/ssl.h> | |
#undef CTRL | |
#define CTRL(x) (x & 037) | |
@@ -59,9 +60,14 @@ static struct Chan { | |
char new; /* New message. */ | |
} chl[MaxChans]; | |
+static int ssl; | |
+static struct { | |
+ int fd; | |
+ SSL *ssl; | |
+ SSL_CTX *ctx; | |
+} srv; | |
static char nick[64]; | |
static int quit, winchg; | |
-static int sfd; /* Server file descriptor. */ | |
static int nch, ch; /* Current number of channels, and current channel. */ | |
static char outb[BufSz], *outp = outb; /* Output buffer. */ | |
static FILE *logfp; | |
@@ -174,7 +180,10 @@ srd(void) | |
if (p - l >= BufSz) | |
p = l; /* Input buffer overflow, there should something better… | |
- rd = read(sfd, p, BufSz - (p - l)); | |
+ if (ssl) | |
+ rd = SSL_read(srv.ssl, p, BufSz - (p - l)); | |
+ else | |
+ rd = read(srv.fd, p, BufSz - (p - l)); | |
if (rd < 0) { | |
if (errno == EINTR) | |
return 1; | |
@@ -210,7 +219,7 @@ srd(void) | |
} | |
} | |
-static int | |
+static void | |
dial(const char *host, const char *service) | |
{ | |
struct addrinfo hints, *res = NULL, *rp; | |
@@ -233,8 +242,19 @@ dial(const char *host, const char *service) | |
} | |
if (fd == -1) | |
panic("Cannot connect to host."); | |
+ srv.fd = fd; | |
+ if (ssl) { | |
+ SSL_load_error_strings(); | |
+ SSL_library_init(); | |
+ srv.ctx = SSL_CTX_new(SSLv23_client_method()); | |
+ if (!srv.ctx) | |
+ panic("Could not initialize ssl context."); | |
+ srv.ssl = SSL_new(srv.ctx); | |
+ if (SSL_set_fd(srv.ssl, srv.fd) == 0 | |
+ || SSL_connect(srv.ssl) != 1) | |
+ panic("Could not connect with ssl."); | |
+ } | |
freeaddrinfo(res); | |
- return fd; | |
} | |
static int | |
@@ -761,12 +781,12 @@ main(int argc, char *argv[]) | |
const char *port = PORT; | |
int o; | |
- while ((o = getopt(argc, argv, "hk:n:u:s:p:l:")) >= 0) | |
+ while ((o = getopt(argc, argv, "thk:n:u:s:p:l:")) >= 0) | |
switch (o) { | |
case 'h': | |
case '?': | |
usage: | |
- fputs("usage: irc [-n NICK] [-u USER] [-s SERVER] [-p … | |
+ fputs("usage: irc [-n NICK] [-u USER] [-s SERVER] [-p … | |
exit(0); | |
case 'l': | |
if (!(logfp = fopen(optarg, "a"))) | |
@@ -777,6 +797,9 @@ main(int argc, char *argv[]) | |
goto usage; | |
strcpy(nick, optarg); | |
break; | |
+ case 't': | |
+ ssl = 1; | |
+ break; | |
case 'u': | |
user = optarg; | |
break; | |
@@ -794,7 +817,7 @@ main(int argc, char *argv[]) | |
if (!user) | |
user = "anonymous"; | |
tinit(); | |
- sfd = dial(server, port); | |
+ dial(server, port); | |
chadd("*server*", 1); | |
if (key) | |
sndf("PASS %s", key); | |
@@ -811,23 +834,26 @@ main(int argc, char *argv[]) | |
FD_ZERO(&wfs); | |
FD_ZERO(&rfs); | |
FD_SET(0, &rfs); | |
- FD_SET(sfd, &rfs); | |
+ FD_SET(srv.fd, &rfs); | |
if (outp != outb) | |
- FD_SET(sfd, &wfs); | |
- ret = select(sfd + 1, &rfs, &wfs, 0, 0); | |
+ FD_SET(srv.fd, &wfs); | |
+ ret = select(srv.fd + 1, &rfs, &wfs, 0, 0); | |
if (ret < 0) { | |
if (errno == EINTR) | |
continue; | |
panic("Select failed."); | |
} | |
- if (FD_ISSET(sfd, &rfs)) { | |
+ if (FD_ISSET(srv.fd, &rfs)) { | |
if (!srd()) | |
quit = 1; | |
} | |
- if (FD_ISSET(sfd, &wfs)) { | |
+ if (FD_ISSET(srv.fd, &wfs)) { | |
int wr; | |
- wr = write(sfd, outb, outp - outb); | |
+ if (ssl) | |
+ wr = SSL_write(srv.ssl, outb, outp - outb); | |
+ else | |
+ wr = write(srv.fd, outb, outp - outb); | |
if (wr < 0) { | |
if (errno == EINTR) | |
continue; | |
@@ -843,7 +869,10 @@ main(int argc, char *argv[]) | |
wrefresh(scr.iw); | |
} | |
} | |
- close(sfd); | |
+ SSL_shutdown(srv.ssl); | |
+ SSL_free(srv.ssl); | |
+ close(srv.fd); | |
+ SSL_CTX_free(srv.ctx); | |
while (nch--) | |
free(chl[nch].buf); | |
treset(); |