about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--chat.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/chat.c b/chat.c
index 3402621..3aa4ad2 100644
--- a/chat.c
+++ b/chat.c
@@ -18,6 +18,7 @@
 #include <errno.h>
 #include <locale.h>
 #include <poll.h>
+#include <signal.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -34,7 +35,7 @@ char *idNames[IDCap] = {
 
 enum Color idColors[IDCap] = {
 	[None] = Black,
-	[Debug] = Red,
+	[Debug] = Green,
 	[Network] = Gray,
 };
 
@@ -42,6 +43,11 @@ size_t idNext = Network + 1;
 
 struct Self self;
 
+static volatile sig_atomic_t signals[NSIG];
+static void signalHandler(int signal) {
+	signals[signal] = 1;
+}
+
 int main(int argc, char *argv[]) {
 	setlocale(LC_CTYPE, "");
 
@@ -100,6 +106,11 @@ int main(int argc, char *argv[]) {
 	ircFormat("NICK :%s\r\n", nick);
 	ircFormat("USER %s 0 * :%s\r\n", user, real);
 
+	signal(SIGHUP, signalHandler);
+	signal(SIGINT, signalHandler);
+	signal(SIGTERM, signalHandler);
+	sig_t cursesWinch = signal(SIGWINCH, signalHandler);
+
 	struct pollfd fds[2] = {
 		{ .events = POLLIN, .fd = STDIN_FILENO },
 		{ .events = POLLIN, .fd = irc },
@@ -108,8 +119,20 @@ int main(int argc, char *argv[]) {
 		int nfds = poll(fds, 2, -1);
 		if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll");
 
+		if (signals[SIGHUP] || signals[SIGINT] || signals[SIGTERM]) {
+			break;
+		}
+		if (signals[SIGWINCH]) {
+			signals[SIGWINCH] = 0;
+			cursesWinch(SIGWINCH);
+			fds[0].revents = POLLIN;
+		}
+
 		if (fds[0].revents) uiRead();
 		if (fds[1].revents) ircRecv();
 		uiDraw();
 	}
+
+	ircFormat("QUIT\r\n");
+	uiHide();
 }