about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--handle.c25
-rw-r--r--ircd.h1
-rw-r--r--writef.c22
3 files changed, 26 insertions, 22 deletions
diff --git a/handle.c b/handle.c
index 0515ac2..038a300 100644
--- a/handle.c
+++ b/handle.c
@@ -210,39 +210,20 @@ privmsg(struct Message *msg, struct Peer *peer)
 static int
 quit(struct Message *msg, struct Peer *peer)
 {
-	size_t i, j;
+	size_t i;
 
 	ensure(peer->type, (void)0, 1)
 
-	writef(
-		peer->fd,
+	announce(
+		peer,
 		":%s!%s@%s QUIT :%s",
 		getnick(peer),
 		peer->user,
 		peer->host,
 		msg->params[0] ? msg->params[0] : "Client Quit"
 	);
-
 	for (i = 0; i < peer->channels_c; ++i)
-	{
 		channel_exit(peer->channels[i], peer);
-		for (j = 0; j < peer->channels[i]->users_c; ++j)
-			peer->channels[i]->users[j]->flags |= ANNOUNCE;
-	}
-
-	for (i = 0; i < peers_c; ++i)
-		if (peers[i].flags & ANNOUNCE)
-		{
-			writef(
-				peers[i].fd,
-				":%s!%s@%s QUIT :%s",
-				getnick(peer),
-				peer->user,
-				peer->host,
-				msg->params[0] ? msg->params[0] : "Client Quit"
-			);
-			peers[i].flags &= ~ANNOUNCE;
-		}
 
 	return 1;
 }
diff --git a/ircd.h b/ircd.h
index 8def73a..0cb20dc 100644
--- a/ircd.h
+++ b/ircd.h
@@ -98,6 +98,7 @@ int parse_message(char *buf, struct Message *msg);
 int handle(struct Peer *peer);
 int reply(const struct Peer *peer, int number, ...);
 Handler *find(const char *command);
+void announce(struct Peer *peer, const char *fmt, ...);
 int writef(int fd, const char *fmt, ...);
 int writechanf(const struct Peer *except, const struct Channel *channel, const char *fmt, ...);
 void ircd(void);
diff --git a/writef.c b/writef.c
index e010ca4..c7baa0a 100644
--- a/writef.c
+++ b/writef.c
@@ -65,3 +65,25 @@ writechanf(const struct Peer *except, const struct Channel *channel, const char
 
 	return count;
 }
+
+void
+announce(struct Peer *peer, const char *fmt, ...)
+{
+	va_list args;
+	size_t i, j;
+
+	va_start(args, fmt);
+	vstoref(fmt, args);
+	va_end(args);
+
+	for (i = 0; i < peer->channels_c; ++i)
+		for (j = 0; j < peer->channels[i]->users_c; ++j)
+			peer->channels[i]->users[j]->flags |= ANNOUNCE;
+
+	for (i = 0; i < peers_c; ++i)
+		if (peers[i].flags & ANNOUNCE)
+		{
+			write(peers[i].fd, buf, written);
+			peers[i].flags &= ~ANNOUNCE;
+		}
+}