about summary refs log tree commit diff
path: root/writef.c
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2026-01-06 04:01:24 +0300
committerNakidai <nakidai@disroot.org>2026-01-06 04:01:24 +0300
commit833c53b1ad3338677056445c32c490cac0a08875 (patch)
tree24e60715c46ff89c26c5efc254e036b84aebcb13 /writef.c
parent78426afe18d9ce730a4d92033ca261f9b2f173a0 (diff)
downloadlibreircd-833c53b1ad3338677056445c32c490cac0a08875.tar.gz
libreircd-833c53b1ad3338677056445c32c490cac0a08875.zip
Add basic channels
Though they don't have modes, and JOIN/PART must be able to parse
comma separated list of channels
Diffstat (limited to 'writef.c')
-rw-r--r--writef.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/writef.c b/writef.c
index 7d57e3b..e010ca4 100644
--- a/writef.c
+++ b/writef.c
@@ -23,18 +23,45 @@
 #include <unistd.h>
 
 
+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;
 }