commit 0e07631cb4b92b74d6fe7c027d41cd7cc80e576d
parent b4cb5ca9f3f17b5b179e14f9cec4a60eae62b393
Author: Andrew Kloet <andrew@kloet.net>
Date: Sun, 29 Mar 2026 01:45:32 -0400
cleanup
Diffstat:
| D | .gitignore | | | 3 | --- |
| M | Makefile | | | 4 | ++-- |
| M | nio.1 | | | 2 | +- |
| M | nio.c | | | 122 | +++++++++++++++++++++++++------------------------------------------------------ |
4 files changed, 41 insertions(+), 90 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -1,2 +0,0 @@
-irc
-*.sw[po]
-\ No newline at end of file
diff --git a/Makefile b/Makefile
@@ -1,7 +1,7 @@
BIN = nio
-CFLAGS = -std=c99 -Os -D_POSIX_C_SOURCE=201112 -D_GNU_SOURCE -D_XOPEN_CURSES -D_XOPEN_SOURCE_EXTENDED=1 -D_DEFAULT_SOURCE -D_BSD_SOURCE
-LDLIBS = -lncursesw -lssl -lcrypto
+CFLAGS = -std=c99 -Os -Wall -Wextra -Wpedantic -D_POSIX_C_SOURCE=201112 -D_GNU_SOURCE -D_XOPEN_CURSES -D_XOPEN_SOURCE_EXTENDED=1 -D_DEFAULT_SOURCE -D_BSD_SOURCE
+LDLIBS = -lncursesw -lssl -lcrypto -ltinfo
PREFIX=/usr/local
diff --git a/nio.1 b/nio.1
@@ -152,6 +152,6 @@ m nickserv cert add
.El
.
.Sh AUTHORS
+.An Andrew Kloet Aq Mt andrew@kloet.net
.An Quentin Carbonneaux Aq Mt qcarbonneaux@gmail.com
.An Hiltjo Posthuma Aq Mt hiltjo@codemadness.org
-.An Andrew Kloet Aq Mt andrew@kloet.net
diff --git a/nio.c b/nio.c
@@ -67,8 +67,7 @@ enum {
typedef wchar_t Rune;
static struct {
- int x;
- int y;
+ size_t x, y;
WINDOW *sw, *mw, *iw;
} scr;
@@ -157,28 +156,6 @@ utf8decode(char *c, Rune *u, size_t clen)
return len;
}
-static char
-utf8encodebyte(Rune u, size_t i)
-{
- return utfbyte[i] | (u & ~utfmask[i]);
-}
-
-static size_t
-utf8encode(Rune u, char *c)
-{
- size_t len, i;
-
- len = utf8validate(&u, 0);
- if (len > UtfSz)
- return 0;
- for (i = len - 1; i != 0; --i) {
- c[i] = utf8encodebyte(u, 0);
- u >>= 6;
- }
- c[0] = utf8encodebyte(u, len);
- return len;
-}
-
static int
is_empty(const char *str) {
return (str == NULL || str[0] == '\0');
@@ -274,27 +251,26 @@ static char *
dial(const char *host, const char *service)
{
struct addrinfo hints, *res = NULL, *rp;
- int fd = -1, e;
+ int fd = -1;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; /* allow IPv4 or IPv6 */
hints.ai_flags = AI_NUMERICSERV; /* avoid name lookup for port */
hints.ai_socktype = SOCK_STREAM;
- if ((e = getaddrinfo(host, service, &hints, &res)))
+ if (getaddrinfo(host, service, &hints, &res))
return "Getaddrinfo failed.";
for (rp = res; rp; rp = rp->ai_next) {
- if ((fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
- continue;
- if (connect(fd, res->ai_addr, res->ai_addrlen) == -1) {
- close(fd);
+ fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+ if (fd == -1)
continue;
- }
- break;
+ if (connect(fd, rp->ai_addr, rp->ai_addrlen) == 0)
+ break;
+ close(fd);
+ fd = -1;
}
freeaddrinfo(res);
- if (fd == -1)
+ if ((srv.fd = fd) == -1)
return "Cannot connect to host.";
- srv.fd = fd;
if (ssl) {
SSL_load_error_strings();
SSL_library_init();
@@ -322,19 +298,11 @@ dial(const char *host, const char *service)
static void
hangup(void)
{
- if (srv.ssl) {
- SSL_shutdown(srv.ssl);
- SSL_free(srv.ssl);
- srv.ssl = 0;
- }
- if (srv.fd) {
- close(srv.fd);
- srv.fd = 0;
- }
- if (srv.ctx) {
- SSL_CTX_free(srv.ctx);
- srv.ctx = 0;
- }
+ if (srv.ssl) SSL_shutdown(srv.ssl);
+ SSL_free(srv.ssl);
+ if (srv.fd) close(srv.fd);
+ SSL_CTX_free(srv.ctx);
+ memset(&srv, 0, sizeof(srv));
}
static inline int
@@ -376,7 +344,9 @@ chadd(const char *name, int joined)
static int
chdel(char *name)
{
- int n = chfind(name); if (n <= 0) return 0;
+ int n = chfind(name);
+
+ if (n <= 0) return 0;
free(chl[n].buf);
nch--;
if (n < nch) /* Shift the channel buffers down. */
@@ -390,7 +360,8 @@ chdel(char *name)
static char *
pushl(char *p, char *e)
{
- int x, cl;
+ size_t x;
+ int cl;
char *w;
Rune u[2];
cchar_t cc;
@@ -409,7 +380,7 @@ pushl(char *p, char *e)
w++;
x += p - w;
}
- if (p >= e || *p == ' ' || p - w + INDENT >= scr.x - 1) {
+ if (p >= e || *p == ' ' || p - w + INDENT >= (ptrdiff_t)scr.x - 1) {
while (w < p) {
w += utf8decode(w, u, UtfSz);
if (wcwidth(*u) > 0 || *u == '\n') {
@@ -417,8 +388,7 @@ pushl(char *p, char *e)
wadd_wch(scr.mw, &cc);
}
}
- if (p >= e)
- return e;
+ if (p >= e) return e;
}
p += utf8decode(p, u, UtfSz);
if ((cl = wcwidth(*u)) >= 0)
@@ -454,7 +424,6 @@ pushf(int cn, const char *fmt, ...)
s = c->eol + n;
n += vsnprintf(s, LineLen - n - 1, fmt, vl);
va_end(vl);
-
if (logfp) {
fprintf(logfp, "%-12.12s\t%04d-%02d-%02dT%02d:%02d:%02dZ\t%s\n",
c->name,
@@ -462,7 +431,6 @@ pushf(int cn, const char *fmt, ...)
gmtm->tm_hour, gmtm->tm_min, gmtm->tm_sec, s);
fflush(logfp);
}
-
strcat(c->eol, "\n");
if (n >= LineLen - 1)
c->eol += LineLen - 1;
@@ -486,21 +454,18 @@ scmd(char *usr, char *cmd, char *par, char *data)
char *pm = strtok(par, " ");
char *chan;
- for (int i = 0; i < sizeof(cmd_map)/sizeof(cmd_map[0]); i++) {
+ for (size_t i = 0; i < sizeof(cmd_map)/sizeof(cmd_map[0]); i++) {
if (!strcmp(cmd, cmd_map[i].name)) {
type = cmd_map[i].id;
break;
}
}
-
if (!usr)
usr = "?";
else {
char *bang = strchr(usr, '!');
- if (bang)
- *bang = 0;
+ if (bang) *bang = 0;
}
-
switch (type) {
case PRIVMSG:
if (!pm || !data) break;
@@ -593,11 +558,9 @@ uparse(char *m)
if (!p[0] || (p[1] != ' ' && p[1] != 0)) {
pmsg:
- if (ch == 0)
- return;
+ if (ch == 0) return;
m += strspn(m, " ");
- if (!*m)
- return;
+ if (!*m) return;
pushf(ch, PFMT, nick, m);
sndf("PRIVMSG %s :%s", chl[ch].name, m);
return;
@@ -617,14 +580,13 @@ uparse(char *m)
case 'l': /* Leave channels. */
p += 1 + (p[1] == ' ');
if (!*p) {
- if (ch == 0)
- return; /* Cannot leave server window. */
- strcat(p, chl[ch].name);
+ if (ch == 0) return; /* Cannot leave server window. */
+ p = chl[ch].name;
}
p = strtok(p, " ");
while (p) {
- if (chdel(p))
- sndf("PART %s", p);
+ if (chdel(p) && strchr("&#!+", p[0]))
+ sndf("PART %s", p); /* PART should not be sent for users. */
p = strtok(0, " ");
}
tredraw();
@@ -651,8 +613,7 @@ uparse(char *m)
static void
sigwinch(int sig)
{
- if (sig)
- winchg = 1;
+ if (sig) winchg = 1;
}
static void
@@ -688,8 +649,7 @@ tresize(void)
winchg = 0;
if (ioctl(0, TIOCGWINSZ, &ws) < 0)
panic("Ioctl (TIOCGWINSZ) failed.");
- if (ws.ws_row <= 2)
- return;
+ if (ws.ws_row <= 2) return;
resizeterm(scr.y = ws.ws_row, scr.x = ws.ws_col);
wresize(scr.mw, scr.y - 2, scr.x);
wresize(scr.iw, 1, scr.x);
@@ -721,7 +681,7 @@ tredraw(void)
c->n -= i;
}
q = p;
- while (nl < scr.y - 2) {
+ while (nl < (int)scr.y - 2) {
while (*q != '\n' && q > c->buf)
q--;
nl++;
@@ -746,7 +706,6 @@ tdrawbar(void)
for (l = 0; fst > 0 && l < scr.x / 2; fst--)
l += strlen(chl[fst].name) + 3;
-
werase(scr.sw);
for (l = 0; fst < nch && l < scr.x; fst++) {
char *p = chl[fst].name;
@@ -819,30 +778,26 @@ tgetch(void)
dirty = len = cu;
break;
case CTRL('u'):
- if (cu == 0)
- return;
+ if (cu == 0) return;
len -= cu;
memmove(l, &l[cu], len);
dirty = cu = 0;
break;
case CTRL('d'):
- if (cu >= len)
- return;
+ if (cu >= len) return;
memmove(&l[cu], &l[cu + 1], len - cu - 1);
dirty = cu;
len--;
break;
case CTRL('h'):
case KEY_BACKSPACE:
- if (cu == 0)
- return;
+ if (cu == 0) return;
memmove(&l[cu - 1], &l[cu], len - cu);
dirty = --cu;
len--;
break;
case CTRL('w'):
- if (cu == 0)
- break;
+ if (cu == 0) break;
i = 1;
while (l[cu - i] == ' ' && cu - i != 0) i++;
while (l[cu - i] != ' ' && cu - i != 0) i++;
@@ -949,8 +904,7 @@ main(int argc, char *argv[])
goto usage;
tinit();
err = dial(server, port);
- if (err)
- panic(err);
+ if (err) panic(err);
chadd(server, 0);
sinit(nick, user);
reconn = 0;