From 833c53b1ad3338677056445c32c490cac0a08875 Mon Sep 17 00:00:00 2001 From: Nakidai Date: Tue, 6 Jan 2026 04:01:24 +0300 Subject: Add basic channels Though they don't have modes, and JOIN/PART must be able to parse comma separated list of channels --- writef.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) (limited to 'writef.c') diff --git a/writef.c b/writef.c index 7d57e3b..e010ca4 100644 --- a/writef.c +++ b/writef.c @@ -23,18 +23,45 @@ #include +static char buf[MESSAGE_MAX + 1]; +static int written; + +static void +vstoref(const char *fmt, va_list ap) +{ + written = vsnprintf(buf, sizeof(buf) - 2, fmt, ap); + written = written < sizeof(buf) - 2 ? written : sizeof(buf) - 2; + memcpy(buf + written, "\r\n", 2); + written += 2; +} + int writef(int fd, const char *fmt, ...) { - static char buf[MESSAGE_MAX + 1]; va_list args; - int written; va_start(args, fmt); - written = vsnprintf(buf, sizeof(buf) - 2, fmt, args); + vstoref(fmt, args); va_end(args); - written = written < sizeof(buf) - 2 ? written : sizeof(buf) - 2; - memcpy(buf + written, "\r\n", 3); - return write(fd, buf, written + 3); + return write(fd, buf, written); +} + +int +writechanf(const struct Peer *except, const struct Channel *channel, const char *fmt, ...) +{ + va_list args; + int count; + size_t i; + + va_start(args, fmt); + vstoref(fmt, args); + va_end(args); + + count = 0; + for (i = 0; i < channel->users_c; ++i) + if (!except || channel->users[i]->fd != except->fd) + count += write(channel->users[i]->fd, buf, written) == written; + + return count; } -- cgit 1.4.1