diff options
| author | C. McEnroe | 2021-06-15 16:59:24 -0400 | 
|---|---|---|
| committer | C. McEnroe | 2021-06-15 16:59:24 -0400 | 
| commit | d2bec49931decfd893c03c28382816cac28ed59e (patch) | |
| tree | 40c51628950735269b81bb3181284cce0ea57414 | |
| parent | b690bd0b83ffb6d29a1cd373635864bd1b086ac7 (diff) | |
Send PINGs when server is quiet and die if no response
Every time we receive from the server, reset a timer. The first
time the timer triggers, send a PING. The second time the timer
triggers, die from ping timeout.
I'm not sure about these two intervals: 2 minutes of idle before a
PING, 30s for the server to respond to the PING.
| -rw-r--r-- | chat.c | 22 | 
1 files changed, 22 insertions, 0 deletions
| @@ -39,6 +39,7 @@  #include <stdlib.h>  #include <string.h>  #include <sys/stat.h> +#include <sys/time.h>  #include <sys/wait.h>  #include <sysexits.h>  #include <time.h> @@ -329,6 +330,7 @@ int main(int argc, char *argv[]) {  	uiInitLate();  	signal(SIGHUP, signalHandler);  	signal(SIGINT, signalHandler); +	signal(SIGALRM, signalHandler);  	signal(SIGTERM, signalHandler);  	signal(SIGCHLD, signalHandler);  	sig_t cursesWinch = signal(SIGWINCH, signalHandler); @@ -348,6 +350,7 @@ int main(int argc, char *argv[]) {  		fcntl(execPipe[1], F_SETFD, FD_CLOEXEC);  	} +	bool ping = false;  	struct pollfd fds[] = {  		{ .events = POLLIN, .fd = STDIN_FILENO },  		{ .events = POLLIN, .fd = irc }, @@ -367,6 +370,25 @@ int main(int argc, char *argv[]) {  		if (signals[SIGHUP]) self.quit = "zzz";  		if (signals[SIGINT] || signals[SIGTERM]) break; +		if (nfds > 0 && fds[1].revents) { +			ping = false; +			struct itimerval timer = { +				.it_value.tv_sec = 2 * 60, +				.it_interval.tv_sec = 30, +			}; +			int error = setitimer(ITIMER_REAL, &timer, NULL); +			if (error) err(EX_OSERR, "setitimer"); +		} +		if (signals[SIGALRM]) { +			signals[SIGALRM] = 0; +			if (ping) { +				errx(EX_UNAVAILABLE, "ping timeout"); +			} else { +				ircFormat("PING nyaa\r\n"); +				ping = true; +			} +		} +  		if (signals[SIGCHLD]) {  			signals[SIGCHLD] = 0;  			for (int status; 0 < waitpid(-1, &status, WNOHANG);) { | 
