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.
weechat-hashes
C. McEnroe 2021-06-15 16:59:24 -04:00
parent b690bd0b83
commit d2bec49931
1 changed files with 22 additions and 0 deletions

22
chat.c
View File

@ -39,6 +39,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sysexits.h> #include <sysexits.h>
#include <time.h> #include <time.h>
@ -329,6 +330,7 @@ int main(int argc, char *argv[]) {
uiInitLate(); uiInitLate();
signal(SIGHUP, signalHandler); signal(SIGHUP, signalHandler);
signal(SIGINT, signalHandler); signal(SIGINT, signalHandler);
signal(SIGALRM, signalHandler);
signal(SIGTERM, signalHandler); signal(SIGTERM, signalHandler);
signal(SIGCHLD, signalHandler); signal(SIGCHLD, signalHandler);
sig_t cursesWinch = signal(SIGWINCH, signalHandler); sig_t cursesWinch = signal(SIGWINCH, signalHandler);
@ -348,6 +350,7 @@ int main(int argc, char *argv[]) {
fcntl(execPipe[1], F_SETFD, FD_CLOEXEC); fcntl(execPipe[1], F_SETFD, FD_CLOEXEC);
} }
bool ping = false;
struct pollfd fds[] = { struct pollfd fds[] = {
{ .events = POLLIN, .fd = STDIN_FILENO }, { .events = POLLIN, .fd = STDIN_FILENO },
{ .events = POLLIN, .fd = irc }, { .events = POLLIN, .fd = irc },
@ -367,6 +370,25 @@ int main(int argc, char *argv[]) {
if (signals[SIGHUP]) self.quit = "zzz"; if (signals[SIGHUP]) self.quit = "zzz";
if (signals[SIGINT] || signals[SIGTERM]) break; 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]) { if (signals[SIGCHLD]) {
signals[SIGCHLD] = 0; signals[SIGCHLD] = 0;
for (int status; 0 < waitpid(-1, &status, WNOHANG);) { for (int status; 0 < waitpid(-1, &status, WNOHANG);) {