From 9317a446ada24a4b320477561d113cfaee3e4d34 Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Thu, 6 Jan 2022 18:10:40 +0100 Subject: clean up command parsing, add signal sending commands --- rvnit.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file 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') { -- cgit 1.4.1