about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-10-26 02:25:04 -0400
committerJune McEnroe <june@causal.agency>2019-10-26 02:25:04 -0400
commit3beb01f99ac5ea9a22c55edbf0e7b095e1cb5b0d (patch)
tree48235b1b4ea985e0dde72b83bad208f6fc3f6e5a
parentAdd flags to request TOPIC and NAMES on client connect (diff)
downloadpounce-3beb01f99ac5ea9a22c55edbf0e7b095e1cb5b0d.tar.gz
pounce-3beb01f99ac5ea9a22c55edbf0e7b095e1cb5b0d.zip
Set AWAY when no clients are connected
-rw-r--r--bounce.c8
-rw-r--r--pounce.16
2 files changed, 12 insertions, 2 deletions
diff --git a/bounce.c b/bounce.c
index 712b9c3..648a17b 100644
--- a/bounce.c
+++ b/bounce.c
@@ -91,10 +91,12 @@ int main(int argc, char *argv[]) {
 	const char *user = NULL;
 	const char *real = NULL;
 	const char *join = NULL;
+	const char *away = "pounced :3";
 
 	int opt;
-	while (0 < (opt = getopt(argc, argv, "C:H:K:NTP:W:a:h:j:n:p:r:u:vw:"))) {
+	while (0 < (opt = getopt(argc, argv, "A:C:H:K:NTP:W:a:h:j:n:p:r:u:vw:"))) {
 		switch (opt) {
+			break; case 'A': away = optarg;
 			break; case 'C': strlcpy(certPath, optarg, sizeof(certPath));
 			break; case 'H': localHost = optarg;
 			break; case 'K': strlcpy(privPath, optarg, sizeof(privPath));
@@ -147,6 +149,7 @@ int main(int argc, char *argv[]) {
 	}
 	eventAdd(server, NULL);
 
+	size_t clients = 0;
 	while (0 < poll(event.fds, event.len, -1)) {
 		for (size_t i = 0; i < event.len; ++i) {
 			short revents = event.fds[i].revents;
@@ -156,6 +159,7 @@ int main(int argc, char *argv[]) {
 				int fd;
 				struct tls *tls = listenAccept(&fd, event.fds[i].fd);
 				eventAdd(fd, clientAlloc(tls));
+				if (!clients++) serverFormat("AWAY\r\n");
 				continue;
 			}
 
@@ -172,10 +176,10 @@ int main(int argc, char *argv[]) {
 			if (revents & POLLIN) clientRecv(client);
 			if (revents & POLLOUT) clientConsume(client);
 			if (clientError(client) || revents & (POLLHUP | POLLERR)) {
-				// TODO: Set AWAY if no more clients remain.
 				clientFree(client);
 				close(event.fds[i].fd);
 				eventRemove(i);
+				if (!--clients) serverFormat("AWAY :%s\r\n", away);
 				break;
 			}
 		}
diff --git a/pounce.1 b/pounce.1
index 8c76f02..95e554b 100644
--- a/pounce.1
+++ b/pounce.1
@@ -9,6 +9,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl NTv
+.Op Fl A Ar away
 .Op Fl C Ar cert
 .Op Fl H Ar host
 .Op Fl K Ar priv
@@ -39,6 +40,11 @@ and uniquely identify themselves by username.
 The arguments are as follows:
 .
 .Bl -tag -width "-W @file"
+.It Fl A Ar away
+Set away status to
+.Ar away
+when no clients are connected.
+.
 .It Fl C Ar cert
 Load TLS certificate from
 .Ar cert .