URI:
       Use PING command to detect stale connection to server - ii - FIFO and filesystem based IRC client
  HTML git clone git://git.codemadness.org/ii
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 6da90751305682b48f4412f2e132d2e930029e4c
   DIR parent 09eef156ab48f475c4b38caca96d36a519f8984b
  HTML Author: kai@dings.kai <unknown>
       Date:   Thu, 16 Mar 2006 16:54:00 +0200
       
       Use PING command to detect stale connection to server
       
       This is a very simple PING/PONG implementation for detecting stale
       server connections.
       
       PINGS will be send 120 seconds after the last user/server traffic
       arrived.
       
       As PONG counts everything that comes back from the server.
       
       
       Diffstat:
         M ii.c                                |      33 ++++++++++++++++++++++---------
       
       1 file changed, 24 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/ii.c b/ii.c
       @@ -38,6 +38,8 @@ struct Channel {
        };
        
        static int irc;
       +#define PING_TIMEOUT 300
       +static time_t last_response;
        static Channel *channels = nil;
        static char *host = "irc.freenode.net";
        static char nick[32];                        /* might change while running */
       @@ -423,7 +425,10 @@ static void run()
                Channel *c;
                int r, maxfd;
                fd_set rd;
       +        struct timeval tv;
       +        char ping_msg[512];
        
       +        snprintf(ping_msg, sizeof(ping_msg), "PING %s\r\n", host);
                for(;;) {
                        FD_ZERO(&rd);
                        maxfd = irc;
       @@ -434,19 +439,29 @@ static void run()
                                FD_SET(c->fd, &rd);
                        }
        
       -                r = select(maxfd + 1, &rd, 0, 0, 0);
       -                if(r == -1 && errno == EINTR)
       -                        continue;
       +                tv.tv_sec = 120;
       +                tv.tv_usec = 0;
       +                r = select(maxfd + 1, &rd, 0, 0, &tv);
                        if(r < 0) {
       +                        if(errno == EINTR)
       +                                continue;
                                perror("ii: error on select()");
                                exit(EXIT_FAILURE);
       -                } else if(r > 0) {
       -                        if(FD_ISSET(irc, &rd))
       -                                handle_server_output();
       -                        for(c = channels; c; c = c->next)
       -                                if(FD_ISSET(c->fd, &rd))
       -                                        handle_channels_input(c);
       +                } else if(r == 0) {
       +                        if(time(NULL) - last_response >= PING_TIMEOUT) {
       +                                    print_out(NULL, "-!- ii shutting down: ping timeout");
       +                                    exit(EXIT_FAILURE);
       +                        }
       +                        write(irc, ping_msg, strlen(ping_msg));
       +                        continue;
       +                }
       +                if(FD_ISSET(irc, &rd)) {
       +                        handle_server_output();
       +                        last_response = time(NULL);
                        }
       +                for(c = channels; c; c = c->next)
       +                        if(FD_ISSET(c->fd, &rd))
       +                                handle_channels_input(c);
                }
        }