summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-01-06 18:10:40 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-01-06 18:10:40 +0100
commit9317a446ada24a4b320477561d113cfaee3e4d34 (patch)
treef3b97d15bb36939f43292c97262bcc8151176445
parentcb0420bc25b0dab43d3c2cfab4e386f5d57f98cd (diff)
downloadrvnit-9317a446ada24a4b320477561d113cfaee3e4d34.tar.gz
rvnit-9317a446ada24a4b320477561d113cfaee3e4d34.tar.xz
rvnit-9317a446ada24a4b320477561d113cfaee3e4d34.zip
clean up command parsing, add signal sending commands
-rw-r--r--rvnit.c79
1 files changed, 57 insertions, 22 deletions
diff --git a/rvnit.c b/rvnit.c
index b1911e0..aa0db79 100644
--- a/rvnit.c
+++ b/rvnit.c
@@ -147,6 +147,25 @@ restart(int i)
 	}
 }
 
+int
+charsig(char c)
+{
+	switch(c) {
+	case 'p': return SIGSTOP;
+	case 'c': return SIGCONT;
+	case 'h': return SIGHUP;
+	case 'a': return SIGALRM;
+	case 'i': return SIGINT;
+	case 'q': return SIGQUIT;
+	case '1': return SIGUSR1;
+	case '2': return SIGUSR2;
+	case 't': return SIGTERM;
+	case 'k': return SIGKILL;
+	}
+
+	return 0;
+}
+
 void *
 socket_loop(void* ignored)
 {
@@ -180,10 +199,27 @@ socket_loop(void* ignored)
 		if (connfd < 0)
 			continue;
 
-		char cmd = 0;
-		read(connfd, &cmd, 1);
+		struct pollfd fds[1];
+		fds[0].fd = connfd;
+		fds[0].events = POLLIN;
+
+		int n = poll(fds, 1, 7000);
+		if (n != 1) {
+			close(connfd);
+			continue;
+		}
+
+		char buf[63];
+
+		int rd = read(connfd, buf, sizeof buf);
+		if (rd <= 0) {
+			close(connfd);
+			continue;
+		}
 		write(connfd, "ok\n", 3);
 
+		char cmd = buf[0];
+
 		if (cmd == 'l') {
 			dprintf(connfd, "level=%d\n", level);
 		}
@@ -199,29 +235,28 @@ socket_loop(void* ignored)
 			}
 		}
 
-		if (cmd == 'd' || cmd == 'u') {
-			char buf[63];
-			ssize_t rd = read(connfd, buf, sizeof buf);
-			if (rd > 0) {
-				buf[rd] = 0;
-				printf("got %c|%s|\n", cmd, buf);
-
-				for (int i = 0; i < MAX_SV; i++) {
-					if (strcmp(services[i].name, buf) == 0) {
-						if (cmd == 'd') {
-							printf("setting %s down\n",
-							    services[i].name);
-							services[i].state = DOWN;
-						} else if (cmd == 'u') {
-							printf("setting %s up\n",
-							    services[i].name);
-							services[i].state = UP;
-						}
+		if ((cmd == 'd' || cmd == 'u' || charsig(cmd)) && rd > 1) {
+			buf[rd] = 0;
+			printf("got %c|%s|\n", cmd, buf+1);
+
+			for (int i = 0; i < MAX_SV; i++) {
+				if (strcmp(services[i].name, buf+1) == 0) {
+					if (cmd == 'd') {
+						printf("setting %s down\n",
+						    services[i].name);
+						services[i].state = DOWN;
+						pthread_kill(main_thread, SIGUSR1);
+					} else if (cmd == 'u') {
+						printf("setting %s up\n",
+						    services[i].name);
+						services[i].state = UP;
+						pthread_kill(main_thread, SIGUSR1);
+					} else if (charsig(cmd) && services[i].pid > 0) {
+						printf("sending signal %d to %s\n", charsig(cmd), services[i].name);
+						kill(services[i].pid, charsig(cmd));
 					}
 				}
 			}
-
-			pthread_kill(main_thread, SIGUSR1);
 		}
 
 		if (cmd == 'X') {