changeset 971:f365e5be1261

misc: remove more stdbool
author David Demelier <markand@malikania.fr>
date Wed, 03 Feb 2021 15:03:12 +0100
parents c745bb6721fd
children dfbdab8ea485
files irccd/js-plugin.c irccd/jsapi-chrono.c irccd/jsapi-directory.c irccd/jsapi-plugin.c irccd/jsapi-server.c irccd/jsapi-timer.c irccd/jsapi-util.c irccd/peer.c irccd/transport.c irccdctl/main.c lib/irccd/event.c lib/irccd/event.h lib/irccd/irccd.c lib/irccd/log.c lib/irccd/log.h lib/irccd/plugin.h lib/irccd/rule.c lib/irccd/rule.h lib/irccd/server.c lib/irccd/subst.c tests/test-channel.c tests/test-log.c
diffstat 22 files changed, 162 insertions(+), 198 deletions(-) [+]
line wrap: on
line diff
--- a/irccd/js-plugin.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/js-plugin.c	Wed Feb 03 15:03:12 2021 +0100
@@ -155,7 +155,7 @@
 
 	duk_enum(ctx, -1, 0);
 
-	for (size_t i = 0; i < listsz && duk_next(ctx, -1, true); ++i) {
+	for (size_t i = 0; i < listsz && duk_next(ctx, -1, 1); ++i) {
 		list[i] = irc_util_strdup(duk_to_string(ctx, -2));
 		duk_pop_n(ctx, 2);
 	}
@@ -408,7 +408,7 @@
 
 	free(ret);
 
-	return false;
+	return NULL;
 }
 
 static void *
--- a/irccd/jsapi-chrono.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/jsapi-chrono.c	Wed Feb 03 15:03:12 2021 +0100
@@ -16,7 +16,6 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <stdbool.h>
 #include <time.h>
 
 #include <duktape.h>
--- a/irccd/jsapi-directory.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/jsapi-directory.c	Wed Feb 03 15:03:12 2021 +0100
@@ -22,7 +22,6 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <regex.h>
-#include <stdbool.h>
 #include <unistd.h>
 
 #if defined(_WIN32)
@@ -41,9 +40,9 @@
 struct cursor {
 	char path[PATH_MAX];
 	char entry[FILENAME_MAX];
-	bool recursive;
+	int recursive;
 	void *data;
-	bool (*fn)(const struct cursor *);
+	int (*fn)(const struct cursor *);
 };
 
 struct finder {
@@ -155,7 +154,7 @@
 	return ret;
 }
 
-static bool
+static int
 find_regex(const struct cursor *curs)
 {
 	const struct finder *fd = curs->data;
@@ -163,7 +162,7 @@
 	return regexec(&fd->regex, curs->entry, 0, NULL, 0) == 0;
 }
 
-static bool
+static int
 find_name(const struct cursor *curs)
 {
 	const struct finder *fd = curs->data;
@@ -178,7 +177,7 @@
 }
 
 static int
-find_helper(duk_context *ctx, const char *base, bool recursive, int pattern_index)
+find_helper(duk_context *ctx, const char *base, int recursive, int pattern_index)
 {
 	struct finder finder = {
 		.curs = {
@@ -222,18 +221,18 @@
 	return 1;
 }
 
-static bool
+static int
 rm(const struct cursor *curs)
 {
-	return remove(curs->path), false;
+	return remove(curs->path), 0;
 }
 
 static int
-rm_helper(duk_context *ctx, const char *base, bool recursive)
+rm_helper(duk_context *ctx, const char *base, int recursive)
 {
 	struct stat st;
 	struct cursor curs = {
-		.recursive = true,
+		.recursive = 1,
 		.fn = rm
 	};
 
@@ -279,13 +278,13 @@
 static int
 Directory_prototype_find(duk_context *ctx)
 {
-	return find_helper(ctx, path(ctx), duk_opt_boolean(ctx, 1, false), 0);
+	return find_helper(ctx, path(ctx), duk_opt_boolean(ctx, 1, 0), 0);
 }
 
 static int
 Directory_prototype_remove(duk_context *ctx)
 {
-	return rm_helper(ctx, path(ctx), duk_opt_boolean(ctx, 0, false));
+	return rm_helper(ctx, path(ctx), duk_opt_boolean(ctx, 0, 0));
 }
 
 static int
@@ -338,7 +337,7 @@
 Directory_find(duk_context *ctx)
 {
 	const char *path = duk_require_string(ctx, 0);
-	bool recursive = duk_opt_boolean(ctx, 2, false);
+	int recursive = duk_opt_boolean(ctx, 2, 0);
 
 	return find_helper(ctx, path, recursive, 1);
 }
@@ -346,7 +345,7 @@
 static duk_ret_t
 Directory_remove(duk_context* ctx)
 {
-	return rm_helper(ctx, duk_require_string(ctx, 0), duk_opt_boolean(ctx, 1, false));
+	return rm_helper(ctx, duk_require_string(ctx, 0), duk_opt_boolean(ctx, 1, 0));
 }
 
 static duk_ret_t
--- a/irccd/jsapi-plugin.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/jsapi-plugin.c	Wed Feb 03 15:03:12 2021 +0100
@@ -16,8 +16,6 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <stdbool.h>
-
 #include <irccd/irccd.h>
 #include <irccd/plugin.h>
 
@@ -69,7 +67,7 @@
 	duk_get_global_string(ctx, name);
 	duk_enum(ctx, -1, 0);
 
-	while (duk_next(ctx, -1, true))
+	while (duk_next(ctx, -1, 1))
 		duk_put_prop(ctx, 0);
 
 	/* Pop enum and old table. */
--- a/irccd/jsapi-server.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/jsapi-server.c	Wed Feb 03 15:03:12 2021 +0100
@@ -127,7 +127,7 @@
 {
 	duk_get_prop_string(ctx, 0, "channels");
 
-	for (duk_enum(ctx, -1, 0); duk_next(ctx, -1, true); ) {
+	for (duk_enum(ctx, -1, 0); duk_next(ctx, -1, 1); ) {
 		duk_get_prop_string(ctx, -1, "name");
 		duk_get_prop_string(ctx, -2, "password");
 
--- a/irccd/jsapi-timer.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/jsapi-timer.c	Wed Feb 03 15:03:12 2021 +0100
@@ -17,7 +17,6 @@
  */
 
 #include <pthread.h>
-#include <stdbool.h>
 #include <stdatomic.h>
 #include <time.h>
 #include <errno.h>
@@ -135,10 +134,10 @@
 	ts.tv_sec += tm->duration / 1000;
 	ts.tv_nsec += (tm->duration % 1000) * 1000;
 
-	/* Wait at most time unless I'm getting kill. */
 	if (pthread_mutex_lock(&tm->mtx) != 0)
 		tm->status = TIMER_MUST_STOP;
 
+	/* Wait at most time unless I'm getting kill. */
 	while (tm->status == TIMER_ACTIVE && rc == 0)
 		rc = pthread_cond_timedwait(&tm->cv, &tm->mtx, &ts);
 
@@ -146,8 +145,8 @@
 	 * When the thread ends, there are several possibilities:
 	 *
 	 * 1. It has completed without being aborted.
-	 * 2. It has been stopped by the user (tm->stopped is true).
-	 * 3. The plugin is shutting down (tm->kill is true).
+	 * 2. It has been stopped by the user.
+	 * 3. The plugin is shutting down.
 	 */
 	if (rc == ETIMEDOUT && tm->status == TIMER_ACTIVE)
 		irc_bot_post(timer_expired, tm);
@@ -239,7 +238,6 @@
 	duk_del_prop_string(ctx, -2, SIGNATURE);
 
 	/* Remove callback from timer table. */
-	puts("DELETE");
 	duk_push_global_stash(tm->ctx);
 	duk_get_prop_string(tm->ctx, -1, TABLE);
 	duk_remove(tm->ctx, -2);
--- a/irccd/jsapi-util.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/jsapi-util.c	Wed Feb 03 15:03:12 2021 +0100
@@ -60,7 +60,7 @@
 
 	duk_enum(ctx, index, 0);
 
-	while (duk_next(ctx, -1, true)) {
+	while (duk_next(ctx, -1, 1)) {
 		if (strcmp(duk_get_string(ctx, -2), "date") == 0) {
 			pkg->subst.time = duk_get_number(ctx, -1);
 			continue;
@@ -185,7 +185,7 @@
 	struct string *token;
 
 	if (!(fp = open_memstream(&out, &outsz)))
-		return false;
+		return NULL;
 
 	TAILQ_FOREACH(token, tokens, link) {
 		tokensz = strlen(token->value);
--- a/irccd/peer.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/peer.c	Wed Feb 03 15:03:12 2021 +0100
@@ -312,7 +312,7 @@
 {
 	(void)line;
 
-	p->is_watching = true;
+	p->is_watching = 1;
 
 	return ok(p);
 }
--- a/irccd/transport.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccd/transport.c	Wed Feb 03 15:03:12 2021 +0100
@@ -63,7 +63,7 @@
 	irc_log_info("transport: listening on %s", path);
 	irc_log_debug("transport: file descriptor %d", fd);
 
-	return true;
+	return 0;
 
 err:
 	irc_log_warn("transport: %s: %s", path, strerror(errno));
--- a/irccdctl/main.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/irccdctl/main.c	Wed Feb 03 15:03:12 2021 +0100
@@ -26,7 +26,6 @@
 #include <errno.h>
 #include <limits.h>
 #include <stdarg.h>
-#include <stdbool.h>
 #include <stdlib.h>
 #include <stdnoreturn.h>
 #include <string.h>
@@ -37,7 +36,7 @@
 #include <irccd/limits.h>
 #include <irccd/util.h>
 
-static bool verbose;
+static int verbose;
 static int sock;
 static struct sockaddr_un sockaddr = {
 	.sun_family = PF_LOCAL,
@@ -520,7 +519,7 @@
 	c->exec(argc, argv);
 }
 
-static noreturn void
+noreturn static void
 usage(void)
 {
 	fprintf(stderr, "usage: %s [-v] [-s sock] command [arguments...]\n", getprogname());
@@ -538,7 +537,7 @@
 			strlcpy(sockaddr.sun_path, optarg, sizeof (sockaddr.sun_path));
 			break;
 		case 'v':
-			verbose = true;
+			verbose = 1;
 			break;
 		default:
 			break;
--- a/lib/irccd/event.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/event.c	Wed Feb 03 15:03:12 2021 +0100
@@ -25,7 +25,7 @@
 #include "event.h"
 #include "server.h"
 
-bool
+int
 irc_event_str(const struct irc_event *ev, char *str, size_t strsz)
 {
 	assert(ev);
--- a/lib/irccd/event.h	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/event.h	Wed Feb 03 15:03:12 2021 +0100
@@ -19,7 +19,6 @@
 #ifndef IRCCD_EVENT_H
 #define IRCCD_EVENT_H
 
-#include <stdbool.h>
 #include <stddef.h>
 
 #include "limits.h"
@@ -141,7 +140,7 @@
 	};
 };
 
-bool
+int
 irc_event_str(const struct irc_event *, char *, size_t);
 
 void
--- a/lib/irccd/irccd.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/irccd.c	Wed Feb 03 15:03:12 2021 +0100
@@ -48,14 +48,14 @@
 
 static int pipes[2];
 
-static bool
+static int
 is_command(const struct irc_plugin *p, const struct irc_event *ev)
 {
 	const char *cc;
 	size_t ccsz;
 
 	if (ev->type != IRC_EVENT_MESSAGE)
-		return false;
+		return 0;
 
 	/* Get the command prefix (e.g !)*/
 	cc = ev->server->commandchar;
@@ -85,7 +85,7 @@
 	return ev;
 }
 
-static bool
+static int
 invokable(const struct irc_plugin *p, const struct irc_event *ev)
 {
 	switch (ev->type) {
@@ -136,7 +136,7 @@
 		return irc_rule_matchlist(&irc.rules, ev->server->name,
 		    NULL, NULL, p->name, "onWhois");
 	default:
-		return true;
+		return 1;
 	}
 }
 
--- a/lib/irccd/log.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/log.c	Wed Feb 03 15:03:12 2021 +0100
@@ -32,7 +32,7 @@
 };
 
 static FILE *out, *err;
-static bool verbosity;
+static int verbosity;
 
 static void
 handler_files(enum level level, const char *fmt, va_list ap)
@@ -127,7 +127,7 @@
 }
 
 void
-irc_log_set_verbose(bool mode)
+irc_log_set_verbose(int mode)
 {
 	verbosity = mode;
 }
--- a/lib/irccd/log.h	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/log.h	Wed Feb 03 15:03:12 2021 +0100
@@ -19,8 +19,6 @@
 #ifndef IRCCD_LOG_H
 #define IRCCD_LOG_H
 
-#include <stdbool.h>
-
 void
 irc_log_to_syslog(void);
 
@@ -34,7 +32,7 @@
 irc_log_to_null(void);
 
 void
-irc_log_set_verbose(bool);
+irc_log_set_verbose(int);
 
 void
 irc_log_info(const char *, ...);
--- a/lib/irccd/plugin.h	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/plugin.h	Wed Feb 03 15:03:12 2021 +0100
@@ -20,7 +20,6 @@
 #define IRCCD_PLUGIN_H
 
 #include <sys/queue.h>
-#include <stdbool.h>
 
 #include "limits.h"
 
--- a/lib/irccd/rule.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/rule.c	Wed Feb 03 15:03:12 2021 +0100
@@ -50,16 +50,16 @@
 	return NULL;
 }
 
-static bool
+static int
 match(const char *str, const char *value)
 {
 	size_t len;
 	const char *p;
 
 	if (!str[0])
-		return true;
+		return 1;
 	if (!value || (len = strlen(value)) == 0 || !(p = find(str, value)))
-		return false;
+		return 0;
 
 	/*
 	 * Consider the following scenario:
@@ -87,25 +87,25 @@
 	return r;
 }
 
-bool
+int
 irc_rule_add(char *str, const char *value)
 {
 	size_t slen, vlen;
 
 	if (find(str, value))
-		return true;
+		return 0;
 
 	slen = strlen(str);
 	vlen = strlen(value);
 
 	if (vlen + 1 >= IRC_RULE_LEN - slen) {
 		errno = ENOMEM;
-		return false;
+		return -1;
 	}
 
 	sprintf(&str[slen], "%s:", value);
 
-	return true;
+	return 0;
 }
 
 void
@@ -123,7 +123,7 @@
 	memmove(&pos[0], &pos[vlen], IRC_RULE_LEN - (&pos[vlen] - str));
 }
 
-bool
+int
 irc_rule_match(const struct irc_rule *rule,
                const char *server,
                const char *channel,
@@ -138,7 +138,7 @@
 	       match(rule->events, event);
 }
 
-bool
+int
 irc_rule_matchlist(const struct irc_rule_list *rules,
                    const char *server,
                    const char *channel,
@@ -146,7 +146,7 @@
                    const char *plugin,
                    const char *event)
 {
-	bool result = true;
+	int result = 1;
 	struct irc_rule *r;
 
 	TAILQ_FOREACH(r, rules, link)
--- a/lib/irccd/rule.h	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/rule.h	Wed Feb 03 15:03:12 2021 +0100
@@ -20,8 +20,6 @@
 #define IRCCD_RULE_H
 
 #include <sys/queue.h>
-#include <stdbool.h>
-#include <stddef.h>
 
 #include "limits.h"
 
@@ -45,13 +43,13 @@
 struct irc_rule *
 irc_rule_new(enum irc_rule_action);
 
-bool
+int
 irc_rule_add(char *, const char *);
 
 void
 irc_rule_remove(char *, const char *);
 
-bool
+int
 irc_rule_match(const struct irc_rule *,
                const char *,
                const char *,
@@ -59,7 +57,7 @@
                const char *,
                const char *);
 
-bool
+int
 irc_rule_matchlist(const struct irc_rule_list *,
                    const char *,
                    const char *,
--- a/lib/irccd/server.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/server.c	Wed Feb 03 15:03:12 2021 +0100
@@ -236,7 +236,7 @@
 	ev->join.origin = strdup(msg->prefix);
 	ev->join.channel = strdup(msg->args[0]);
 
-	add_channel(s, ev->join.channel, NULL, true);
+	add_channel(s, ev->join.channel, NULL, 1);
 
 	if (is_self(s, ev->join.origin))
 		irc_log_info("server %s: joined channel %s", s->name, ev->join.channel);
@@ -251,7 +251,7 @@
 	ev->kick.target = strdup(msg->args[1]);
 	ev->kick.reason = msg->args[2] ? strdup(msg->args[2]) : NULL;
 
-	struct irc_channel *ch = add_channel(s, ev->kick.channel, NULL, true);
+	struct irc_channel *ch = add_channel(s, ev->kick.channel, NULL, 1);
 
 	/*
 	 * If the bot was kicked itself mark the channel as not joined and
@@ -297,7 +297,7 @@
 	ev->part.channel = strdup(msg->args[0]);
 	ev->part.reason = msg->args[1] ? strdup(msg->args[1]) : NULL;
 
-	ch = add_channel(s, ev->part.channel, NULL, true);
+	ch = add_channel(s, ev->part.channel, NULL, 1);
 
 	if (is_self(s, ev->part.origin) == 0) {
 		remove_channel(ch);
@@ -386,7 +386,7 @@
 	struct irc_channel *ch;
 	char *p, *token;
 
-	ch = add_channel(s, msg->args[2], NULL, true);
+	ch = add_channel(s, msg->args[2], NULL, 1);
 
 	/* Track existing nicknames into the given channel. */
 	for (p = msg->args[3]; (token = strtok_r(p, " ", &p)); )
@@ -597,7 +597,7 @@
 
 	irc_conn_disconnect(&s->conn);
 
-	clear_channels(s, false);
+	clear_channels(s, 0);
 	clear_server(s);
 }
 
@@ -706,7 +706,7 @@
 	assert(name);
 
 	struct irc_channel *ch;
-	bool ret = true;
+	int ret = 1;
 
 	/*
 	 * Search if there is already a channel pending or joined. If the
@@ -898,7 +898,7 @@
 	assert(s->refc >= 1);
 
 	if (--s->refc == 0) {
-		clear_channels(s, true);
+		clear_channels(s, 1);
 		free(s);
 	}
 }
--- a/lib/irccd/subst.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/lib/irccd/subst.c	Wed Feb 03 15:03:12 2021 +0100
@@ -18,7 +18,7 @@
 
 #include <assert.h>
 #include <errno.h>
-#include <stdbool.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -103,41 +103,39 @@
 	{ NULL,         NULL    }
 };
 
-static inline bool
+static inline int
 is_reserved(char token)
 {
 	return token == '#' || token == '@' || token == '$' || token == '!';
 }
 
-static inline bool
+static inline int
 scat(char **out, size_t *outsz, const char *value)
 {
 	size_t written;
 
-	if ((written = strlcpy(*out, value, *outsz)) >= *outsz) {
-		errno = ENOMEM;
-		return false;
-	}
+	if ((written = strlcpy(*out, value, *outsz)) >= *outsz)
+		return errno = ENOMEM, -1;
 
 	*out += written;
 	*outsz -= written;
 
-	return true;
+	return 0;
 }
 
-static inline bool
+static inline int
 ccat(char **out, size_t *outsz, char c)
 {
 	if (*outsz == 0)
-		return false;
+		return -1;
 
 	*(*out)++ = c;
 	*(outsz) -= 1;
 
-	return true;
+	return 0;
 }
 
-static inline void
+static void
 attributes_parse(const char *key, struct attributes *attrs)
 {
 	char attributes[64] = {0};
@@ -170,25 +168,25 @@
 	return NULL;
 }
 
-static bool
+static int
 subst_date(char *out, size_t outsz, const char *input, const struct irc_subst *subst)
 {
 	struct tm *tm;
 
 	if (!(subst->flags & IRC_SUBST_DATE))
-		return true;
+		return 0;
 
 	tm = localtime(&subst->time);
 
 	if (strftime(out, outsz, input, tm) == 0) {
 		errno = ENOMEM;
-		return false;
+		return -1;
 	}
 
-	return true;
+	return 0;
 }
 
-static bool
+static int
 subst_keyword(const char *key, char **out, size_t *outsz, const struct irc_subst *subst)
 {
 	const char *value = NULL;
@@ -201,23 +199,23 @@
 	}
 
 	if (!value)
-		return true;
+		return 0;
 
 	return scat(out, outsz, value);
 }
 
-static bool
+static int
 subst_env(const char *key, char **out, size_t *outsz)
 {
 	const char *value;
 
 	if (!(value = getenv(key)))
-		return true;
+		return 0;
 
 	return scat(out, outsz, value);
 }
 
-static bool
+static void
 subst_shell(const char *key, char **out, size_t *outsz)
 {
 	FILE *fp;
@@ -225,7 +223,7 @@
 
 	/* Accept silently. */
 	if (!(fp = popen(key, "r")))
-		return true;
+		return;
 
 	/*
 	 * Since we cannot determine the number of bytes that must be read, read until the end of
@@ -245,11 +243,9 @@
 	}
 
 	pclose(fp);
-
-	return true;
 }
 
-static bool
+static int
 subst_irc_attrs(const char *key, char **out, size_t *outsz)
 {
 	const char *value;
@@ -261,31 +257,31 @@
 	attributes_parse(key, &attrs);
 
 	if (attrs.fg[0] || attrs.attrs[0]) {
-		if (!ccat(out, outsz, '\x03'))
-			return false;
+		if (ccat(out, outsz, '\x03') < 0)
+			return -1;
 
 		/* Foreground. */
-		if ((value = find(irc_colors, attrs.fg)) && !scat(out, outsz, value))
-			return false;
+		if ((value = find(irc_colors, attrs.fg)) && scat(out, outsz, value) < 0)
+			return -1;
 
 		/* Background. */
 		if (attrs.bg[0]) {
-			if (!ccat(out, outsz, ','))
-				return false;
-			if ((value = find(irc_colors, attrs.bg)) && !scat(out, outsz, value))
-				return false;
+			if (ccat(out, outsz, ',') < 0)
+				return -1;
+			if ((value = find(irc_colors, attrs.bg)) && scat(out, outsz, value) < 0)
+				return -1;
 		}
 
 		/* Attributes. */
 		for (size_t i = 0; i < attrs.attrsz; ++i)
-			if ((value = find(irc_attrs, attrs.attrs[i])) && !scat(out, outsz, value))
-				return false;
+			if ((value = find(irc_attrs, attrs.attrs[i])) && scat(out, outsz, value) < 0)
+				return -1;
 	}
 
-	return true;
+	return 0;
 }
 
-static bool
+static int
 subst_shell_attrs(char *key, char **out, size_t *outsz)
 {
 	const char *value;
@@ -297,67 +293,63 @@
 
 	attributes_parse(key, &attrs);
 
-	if (!scat(out, outsz, "\033["))
-		return false;
+	if (scat(out, outsz, "\033[") < 0)
+		return -1;
 
 	/* Attributes first. */
 	for (size_t i = 0; i < attrs.attrsz; ++i) {
-		if ((value = find(shell_attrs, attrs.attrs[i])) && !scat(out, outsz, value))
-			return false;
+		if ((value = find(shell_attrs, attrs.attrs[i])) && scat(out, outsz, value) < 0)
+			return -1;
 
 		/* Need to append ; if we have still more attributes or colors next. */
-		if ((i < attrs.attrsz || attrs.fg[0] || attrs.bg[0]) && !ccat(out, outsz, ';'))
-			return false;
+		if ((i < attrs.attrsz || attrs.fg[0] || attrs.bg[0]) && ccat(out, outsz, ';') < 0)
+			return -1;
 	}
 
 	/* Foreground. */
 	if (attrs.fg[0]) {
-		if ((value = find(shell_fg, attrs.fg)) && !scat(out, outsz, value))
-			return false;
-		if (attrs.bg[0] && !ccat(out, outsz, ';'))
-			return false;
+		if ((value = find(shell_fg, attrs.fg)) && scat(out, outsz, value) < 0)
+			return -1;
+		if (attrs.bg[0] && ccat(out, outsz, ';') < 0)
+			return -1;
 	}
 
 	/* Background. */
 	if (attrs.bg[0]) {
-		if ((value = find(shell_bg, attrs.bg)) && !scat(out, outsz, value))
-			return false;
+		if ((value = find(shell_bg, attrs.bg)) && scat(out, outsz, value) < 0)
+			return -1;
 	}
 
 	return ccat(out, outsz, 'm');
 }
 
-static bool
+static int
 subst_default(const char **p, char **out, size_t *outsz, const char *key)
 {
-	return ccat(out, outsz, (*p)[-2]) &&
-	       ccat(out, outsz, '{') &&
-	       scat(out, outsz, key) &&
-	       ccat(out, outsz, '}');
+	return ccat(out, outsz, (*p)[-2]) == 0 &&
+	       ccat(out, outsz, '{') == 0 &&
+	       scat(out, outsz, key) == 0 &&
+	       ccat(out, outsz, '}') == 0;
 }
 
-static bool
+static int
 substitute(const char **p, char **out, size_t *outsz, const struct irc_subst *subst)
 {
 	char key[64] = {0};
 	size_t keysz;
 	char *end;
-	bool replaced = true;
+	int replaced = 1;
 
 	if (!**p)
-		return true;
+		return 0;
 
 	/* Find end of construction. */
-	if (!(end = strchr(*p, '}'))) {
-		errno = EINVAL;
-		return false;
-	}
+	if (!(end = strchr(*p, '}')))
+		return errno = EINVAL, -1;
 
 	/* Copy key. */
-	if ((keysz = end - *p) >= sizeof (key)) {
-		errno = ENOMEM;
-		return false;
-	}
+	if ((keysz = end - *p) >= sizeof (key))
+		return errno = ENOMEM, -1;
 
 	memcpy(key, *p, keysz);
 
@@ -365,50 +357,49 @@
 	case '@':
 		/* attributes */
 		if (subst->flags & IRC_SUBST_IRC_ATTRS) {
-			if (!subst_irc_attrs(key, out, outsz))
-				return false;
+			if (subst_irc_attrs(key, out, outsz) < 0)
+				return -1;
 		} else if (subst->flags & IRC_SUBST_SHELL_ATTRS) {
-			if (!subst_shell_attrs(key, out, outsz))
-				return false;
+			if (subst_shell_attrs(key, out, outsz) < 0)
+				return -1;
 		} else
-			replaced = false;
+			replaced = 0;
 		break;
 	case '#':
 		/* keyword */
 		if (subst->flags & IRC_SUBST_KEYWORDS) {
-			if (!subst_keyword(key, out, outsz, subst))
-				return false;
+			if (subst_keyword(key, out, outsz, subst) < 0)
+				return -1;
 		} else
-			replaced = false;
+			replaced = 0;
 		break;
 	case '$':
 		/* environment variable */
 		if (subst->flags & IRC_SUBST_ENV) {
-			if (!subst_env(key, out, outsz))
-				return false;
+			if (subst_env(key, out, outsz) < 0)
+				return -1;
 		} else
-			replaced = false;
+			replaced = 0;
 		break;
 	case '!':
 		/* shell */
-		if (subst->flags & IRC_SUBST_SHELL) {
-			if (!subst_shell(key, out, outsz))
-				return false;
-		} else
-			replaced = false;
+		if (subst->flags & IRC_SUBST_SHELL)
+			subst_shell(key, out, outsz);
+		else
+			replaced = 0;
 		break;
 	default:
 		break;
 	}
 
 	/* If substitution was disabled, put the token verbatim. */
-	if (!replaced && !subst_default(p, out, outsz, key))
-		return false;
+	if (!replaced && subst_default(p, out, outsz, key) < 0)
+		return -1;
 
 	/* Move after '}' */
 	*p = end + 1;
 
-	return true;
+	return 0;
 }
 
 ssize_t
@@ -420,10 +411,10 @@
 	char *o = out;
 
 	if (!outsz)
-		return true;
+		return 0;
 
 	/* Always start with the date first. */
-	if (!subst_date(out, outsz, input, subst))
+	if (subst_date(out, outsz, input, subst) < 0)
 		goto err;
 
 	for (const char *i = input; *i && outsz; ) {
@@ -436,7 +427,7 @@
 		 *   "abc #"  -> keyword sequence interrupted, kept as-is.
 		 */
 		if (!is_reserved(*i)) {
-			if (!ccat(&o, &outsz, *i++))
+			if (ccat(&o, &outsz, *i++) < 0)
 				goto err;
 			continue;
 		}
@@ -459,12 +450,12 @@
 			/* Skip '{'. */
 			++i;
 
-			if (!substitute(&i, &o, &outsz, subst))
+			if (substitute(&i, &o, &outsz, subst) < 0)
 				goto err;
 		} else {
 			if (*i == i[-1])
 				++i;
-			if (!ccat(&o, &outsz, i[-1]))
+			if (ccat(&o, &outsz, i[-1]) < 0)
 				goto err;
 		}
 	}
--- a/tests/test-channel.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/tests/test-channel.c	Wed Feb 03 15:03:12 2021 +0100
@@ -27,7 +27,7 @@
 	struct irc_channel *ch;
 	struct irc_channel_user *user;
 
-	ch = irc_channel_new("#test", NULL, true);
+	ch = irc_channel_new("#test", NULL, 1);
 	GREATEST_ASSERT_STR_EQ("#test", ch->name);
 	GREATEST_ASSERT_STR_EQ("", ch->password);
 	GREATEST_ASSERT(ch->joined);
@@ -79,7 +79,7 @@
 	struct irc_channel *ch;
 	struct irc_channel_user *user;
 
-	ch = irc_channel_new("#test", NULL, true);
+	ch = irc_channel_new("#test", NULL, 1);
 
 	irc_channel_add(ch, "markand", 'o', '@');
 	irc_channel_add(ch, "jean", 0, 0);
@@ -115,7 +115,7 @@
 	struct irc_channel *ch;
 	struct irc_channel_user *user;
 
-	ch = irc_channel_new("#test", NULL, true);
+	ch = irc_channel_new("#test", NULL, 1);
 
 	irc_channel_add(ch, "markand", 'o', '@');
 	irc_channel_add(ch, "jean", 0, 0);
--- a/tests/test-log.c	Wed Feb 03 20:05:00 2021 +0100
+++ b/tests/test-log.c	Wed Feb 03 15:03:12 2021 +0100
@@ -38,18 +38,17 @@
 GREATEST_TEST
 basics_info_verbose_off(void)
 {
-	FILE *fpout, *fperr;
+	FILE *fpout;
 	char out[128] = {0}, err[128] = {0};
 
 	/* Default is quiet, should not log. */
-	irc_log_to_files("stdout.txt", "stderr.txt");
+	irc_log_to_file("stdout.txt");
 	irc_log_info("hello world!");
 
-	if (!(fpout = fopen("stdout.txt", "r")) || !(fperr = fopen("stderr.txt", "r")))
+	if (!(fpout = fopen("stdout.txt", "r")))
 		GREATEST_FAIL();
 
 	fgets(out, sizeof (out), fpout);
-	fgets(err, sizeof (err), fperr);
 
 	GREATEST_ASSERT_STR_EQ("", out);
 	GREATEST_ASSERT_STR_EQ("", err);
@@ -60,15 +59,15 @@
 GREATEST_TEST
 basics_info_verbose_on(void)
 {
-	FILE *fpout, *fperr;
-	char out[128] = {0}, err[128] = {0};
+	FILE *fpout;
+	char out[128] = {0};
 
-	irc_log_set_verbose(true);
-	irc_log_to_files("stdout.txt", "stderr.txt");
+	irc_log_set_verbose(1);
+	irc_log_to_file("stdout.txt");
 	irc_log_info("hello world!");
 	irc_log_info("what's up?");
 
-	if (!(fpout = fopen("stdout.txt", "r")) || !(fperr = fopen("stderr.txt", "r")))
+	if (!(fpout = fopen("stdout.txt", "r")))
 		GREATEST_FAIL();
 
 	GREATEST_ASSERT(fgets(out, sizeof (out), fpout));
@@ -76,10 +75,6 @@
 	GREATEST_ASSERT(fgets(out, sizeof (out), fpout));
 	GREATEST_ASSERT_STR_EQ("what's up?\n", out);
 
-	GREATEST_ASSERT(!fgets(err, sizeof (err), fperr));
-	GREATEST_ASSERT_STR_EQ("", err);
-	GREATEST_ASSERT(!fgets(err, sizeof (err), fperr));
-	GREATEST_ASSERT_STR_EQ("", err);
 
 	GREATEST_PASS();
 }
@@ -87,27 +82,23 @@
 GREATEST_TEST
 basics_warn(void)
 {
-	FILE *fpout, *fperr;
-	char out[128] = {0}, err[128] = {0};
+	FILE *fpout;
+	char out[128] = {0};
 
 	/* Warning messages are printed even without verbosity. */
-	irc_log_set_verbose(false);
-	irc_log_to_files("stdout.txt", "stderr.txt");
+	irc_log_set_verbose(0);
+	irc_log_to_file("stdout.txt");
+	irc_log_info("this is not printed");
 	irc_log_warn("error line 1");
 	irc_log_warn("error line 2");
 
-	if (!(fpout = fopen("stdout.txt", "r")) || !(fperr = fopen("stderr.txt", "r")))
+	if (!(fpout = fopen("stdout.txt", "r")))
 		GREATEST_FAIL();
 
-	GREATEST_ASSERT(!fgets(out, sizeof (out), fpout));
-	GREATEST_ASSERT_STR_EQ("", out);
-	GREATEST_ASSERT(!fgets(out, sizeof (out), fpout));
-	GREATEST_ASSERT_STR_EQ("", out);
-
-	GREATEST_ASSERT(fgets(err, sizeof (err), fperr));
-	GREATEST_ASSERT_STR_EQ("error line 1\n", err);
-	GREATEST_ASSERT(fgets(err, sizeof (err), fperr));
-	GREATEST_ASSERT_STR_EQ("error line 2\n", err);
+	GREATEST_ASSERT(fgets(out, sizeof (out), fpout));
+	GREATEST_ASSERT_STR_EQ("error line 1\n", out);
+	GREATEST_ASSERT(fgets(out, sizeof (out), fpout));
+	GREATEST_ASSERT_STR_EQ("error line 2\n", out);
 
 	GREATEST_PASS();
 }
@@ -116,27 +107,22 @@
 basics_debug(void)
 {
 #if !defined(NDEBUG)
-	FILE *fpout, *fperr;
-	char out[128] = {0}, err[128] = {0};
+	FILE *fpout;
+	char out[128] = {0};
 
 	/* Debug messages are printed even without verbosity but requires to be built in debug. */
-	irc_log_set_verbose(false);
-	irc_log_to_files("stdout.txt", "stderr.txt");
+	irc_log_set_verbose(0);
+	irc_log_to_file("stdout.txt");
 	irc_log_debug("startup!");
 	irc_log_debug("shutdown!");
 
-	if (!(fpout = fopen("stdout.txt", "r")) || !(fperr = fopen("stderr.txt", "r")))
+	if (!(fpout = fopen("stdout.txt", "r")))
 		GREATEST_FAIL();
 
 	GREATEST_ASSERT(fgets(out, sizeof (out), fpout));
 	GREATEST_ASSERT_STR_EQ("startup!\n", out);
 	GREATEST_ASSERT(fgets(out, sizeof (out), fpout));
 	GREATEST_ASSERT_STR_EQ("shutdown!\n", out);
-
-	GREATEST_ASSERT(!fgets(err, sizeof (err), fperr));
-	GREATEST_ASSERT_STR_EQ("", err);
-	GREATEST_ASSERT(!fgets(err, sizeof (err), fperr));
-	GREATEST_ASSERT_STR_EQ("", err);
 #endif
 	GREATEST_PASS();
 }