summary refs log tree commit diff
path: root/chat.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2018-09-06 00:41:06 -0400
committerJune McEnroe <june@causal.agency>2018-09-06 00:41:06 -0400
commitbd48cb5e7df0820a72de27e156426f20e7233e78 (patch)
tree117147d40a4385052abd498591ac6a07f3f98cc2 /chat.c
parentPreserve scroll position when new lines appear (diff)
downloadcatgirl-bd48cb5e7df0820a72de27e156426f20e7233e78.tar.gz
catgirl-bd48cb5e7df0820a72de27e156426f20e7233e78.zip
Move event loop to event.c
Diffstat (limited to '')
-rw-r--r--chat.c102
1 files changed, 2 insertions, 100 deletions
diff --git a/chat.c b/chat.c
index fb9e68f..c7a3229 100644
--- a/chat.c
+++ b/chat.c
@@ -17,15 +17,11 @@
 #define _WITH_GETLINE
 
 #include <err.h>
-#include <errno.h>
-#include <poll.h>
-#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sysexits.h>
 #include <unistd.h>
-#include <sys/wait.h>
 
 #include "chat.h"
 
@@ -45,98 +41,6 @@ void selfJoin(const char *join) {
 	if (!self.join) err(EX_OSERR, "strdup");
 }
 
-static union {
-	struct {
-		struct pollfd ui;
-		struct pollfd irc;
-		struct pollfd pipe;
-	};
-	struct pollfd fds[3];
-} fds = {
-	.ui   = { .events = POLLIN, .fd = STDIN_FILENO },
-	.irc  = { .events = POLLIN },
-	.pipe = { .events = 0 },
-};
-
-void spawn(char *const argv[]) {
-	if (fds.pipe.events) {
-		uiLog(TagStatus, UIWarm, L"spawn: existing pipe");
-		return;
-	}
-
-	int rw[2];
-	int error = pipe(rw);
-	if (error) err(EX_OSERR, "pipe");
-
-	pid_t pid = fork();
-	if (pid < 0) err(EX_OSERR, "fork");
-	if (!pid) {
-		close(rw[0]);
-		close(STDIN_FILENO);
-		dup2(rw[1], STDOUT_FILENO);
-		dup2(rw[1], STDERR_FILENO);
-		close(rw[1]);
-		execvp(argv[0], argv);
-		perror(argv[0]);
-		exit(EX_CONFIG);
-	}
-
-	close(rw[1]);
-	fds.pipe.fd = rw[0];
-	fds.pipe.events = POLLIN;
-}
-
-static void pipeRead(void) {
-	char buf[256];
-	ssize_t len = read(fds.pipe.fd, buf, sizeof(buf) - 1);
-	if (len < 0) err(EX_IOERR, "read");
-	if (len) {
-		buf[len] = '\0';
-		len = strcspn(buf, "\n");
-		uiFmt(TagStatus, UIWarm, "spawn: %.*s", (int)len, buf);
-	} else {
-		close(fds.pipe.fd);
-		fds.pipe.events = 0;
-		fds.pipe.revents = 0;
-	}
-}
-
-static void eventLoop(void) {
-	for (;;) {
-		uiDraw();
-
-		int n = poll(fds.fds, (fds.pipe.events ? 3 : 2), -1);
-		if (n < 0) {
-			if (errno != EINTR) err(EX_IOERR, "poll");
-			uiRead();
-			continue;
-		}
-
-		if (fds.ui.revents) uiRead();
-		if (fds.irc.revents) ircRead();
-		if (fds.pipe.revents) pipeRead();
-	}
-}
-
-static void sigchld(int sig) {
-	(void)sig;
-	int status;
-	pid_t pid = wait(&status);
-	if (pid < 0) err(EX_OSERR, "wait");
-	if (WIFEXITED(status) && WEXITSTATUS(status)) {
-		uiFmt(TagStatus, UIWarm, "spawn: exit %d", WEXITSTATUS(status));
-	} else if (WIFSIGNALED(status)) {
-		uiFmt(TagStatus, UIWarm, "spawn: signal %d", WTERMSIG(status));
-	}
-}
-
-static void sigint(int sig) {
-	(void)sig;
-	input(TagStatus, "/quit");
-	uiExit();
-	exit(EX_OK);
-}
-
 static char *prompt(const char *prompt) {
 	char *line = NULL;
 	size_t cap;
@@ -186,10 +90,8 @@ int main(int argc, char *argv[]) {
 	uiLog(TagStatus, UIWarm, L"Traveling...");
 	uiDraw();
 
-	fds.irc.fd = ircConnect(host, port, pass, webirc);
+	int irc = ircConnect(host, port, pass, webirc);
 	free(host);
 
-	signal(SIGINT, sigint);
-	signal(SIGCHLD, sigchld);
-	eventLoop();
+	eventLoop(STDIN_FILENO, irc);
 }
='nohover-highlight'> 2019-02-18Don't match nested parentheses in Tag for CJune McEnroe Fixes mistaken highlight of: pngWrite(file, (uint8_t []) { 0, 0, 0 }, 3); 2019-02-18Match whitespace between * [] {}June McEnroe 2019-02-18Fix function-like #define regexJune McEnroe A define like #define FOO (1) is not function-like. 2019-02-18Match Tag in RustJune McEnroe 2019-02-18Match sh functions as TagJune McEnroe 2019-02-18Match Sh and Ss as Tag in mdocJune McEnroe 2019-02-18Match statics and typedefs as TagJune McEnroe 2019-02-18Clean up htmlHeaderJune McEnroe 2019-02-18Remove hi line numberingJune McEnroe Tags are much better for referring to specific parts of a file and line numbering is better done by a post-processing tool such as cat -n or producing a two-column HTML <table>. 2019-02-18Add Tag class to hiJune McEnroe 2019-02-17Generate HTML with hi -n -f html -o anchorJune McEnroe Running hi twice to insert stuff between the head and the content is a bit of a hack but oh well. 2019-02-17Add hi -f html -o anchor for line number linksJune McEnroe 2019-02-17Simplify temp trap in upJune McEnroe 2019-02-17Add line numbers to hiJune McEnroe Renames previous -n option to -m to stay consistent with cat -n. Prefixing lines with line numbers affects where the first tab indent ends up relative to the text above it. Not sure if it's worth fixing somehow. 2019-02-17Always split spans after newlinesJune McEnroe Simplifies ANSI and IRC output code, and prepares for line numbered output. 2019-02-15Color format specifiers light cyan in vimJune McEnroe 2019-02-15Highlight Interp as yellowJune McEnroe 2019-02-15Highlight strings in sh command substitutionsJune McEnroe 2019-02-15Add nmap gpJune McEnroe 2019-02-14Avoid newline when copying URL to pasteboardJune McEnroe 2019-02-13Add forgotten "sixth" book of H2G2June McEnroe