ref: e57fc06379d7784bf90fadc8ac4440e2d2b2270b
parent: 30d35379c291756e560de78b033c9fc0f3d443b7
author: kemal <[email protected]>
date: Sun Oct 3 06:01:48 EDT 2021
ircs: simplify and fix parts of connect() - tls shouldn't be static and global. - tls.cert must be freed. - good idea to have an err goto. - send the USER command in a way that is more conforming to RFC2812
--- a/main.c
+++ b/main.c
@@ -66,8 +66,6 @@
static Ioproc *outio;
static Ioproc *logio;
-static TLSconn tls;
-
static int debug;
static int timestamps = 1;
static int usetls;
@@ -707,41 +705,42 @@
static int
connect(void)
{
+ TLSconn tls;
UserPasswd *u;
char buf[Bufsize];
long t;
int fd;
- u = nil;
- if(passwd && usetls){
- u = auth_getuserpasswd(auth_getkey, "proto=pass service=irc server=%q user=%q", addr, mynick);
+ if(ircfd >= 0)
+ close(ircfd);
+
+ if(passwd){
+ u = auth_getuserpasswd(auth_getkey,
+ "proto=pass service=irc server=%q user=%q", addr, mynick);
if(u == nil){
perror("auth_getuserpasswd");
return -1;
}
- }
- if(ircfd >= 0)
- close(ircfd);
+ }else
+ u = nil;
ircfd = dial(netmkaddr(addr, "tcp", usetls ? "6697" : "6667"), nil, nil, nil);
if(ircfd < 0){
perror("dial");
- free(u);
- return -1;
+ goto err;
}
if(usetls){
memset(&tls, 0, sizeof(tls));
fd = tlsClient(ircfd, &tls);
+ free(tls.cert);
if(fd < 0){
perror("tlsClient");
- close(ircfd);
- free(u);
- return -1;
+ goto err;
}
ircfd = fd;
}
- t = time(0);
+ t = time(0);
if(u != nil){
snprint(buf, sizeof(buf), "PASS");
logsend(buf, t, &mainlog);
@@ -749,7 +748,7 @@
ircsend(buf);
free(u);
}
- snprint(buf, sizeof(buf), "USER %s foo bar :<nil>", user);
+ snprint(buf, sizeof(buf), "USER %s 0 * :<nil>", user);
logsend(buf, t, &mainlog);
ircsend(buf);
@@ -758,6 +757,10 @@
ircsend(buf);
return 0;
+err:
+ free(u);
+ close(ircfd);
+ return -1;
}
static void