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
parent
b690bd0b83
commit
d2bec49931
22
chat.c
22
chat.c
|
@ -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);) {
|
||||||
|
|
Loading…
Reference in New Issue