commit 2af87e91520a333f79519f597b0d454c6c981aab from: Alexander Barton date: Tue May 09 14:49:08 2006 UTC Handle time shifts backwards gracefully. commit - d0045afb09948ba3dc50951e770b059a2edb5665 commit + 2af87e91520a333f79519f597b0d454c6c981aab blob - 2bd537c4c5e58b3a70ab7523a282921280832055 blob + 13c8085524bf36aba2061202663fc1f32a6654ca --- src/ngircd/conn.c +++ src/ngircd/conn.c @@ -17,7 +17,7 @@ #include "portab.h" #include "io.h" -static char UNUSED id[] = "$Id: conn.c,v 1.193 2006/04/29 16:19:46 fw Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.194 2006/05/09 14:49:08 alex Exp $"; #include "imp.h" #include @@ -1083,12 +1083,15 @@ Read_Request( CONN_ID Idx ) /* Update timestamp of last data received if this connection is * registered as a user, server or service connection. Don't update * otherwise, so users have at least Conf_PongTimeout seconds time to - * register with the IRC server -- see Check_Connections(). */ + * register with the IRC server -- see Check_Connections(). + * Set "lastping", too, so we can handle time shifts backwards ... */ c = Conn_GetClient(Idx); if (c && (Client_Type(c) == CLIENT_USER || Client_Type(c) == CLIENT_SERVER - || Client_Type(c) == CLIENT_SERVICE)) + || Client_Type(c) == CLIENT_SERVICE)) { My_Connections[Idx].lastdata = time(NULL); + My_Connections[Idx].lastping = My_Connections[Idx].lastdata; + } /* Look at the data in the (read-) buffer of this connection */ Handle_Buffer(Idx); @@ -1206,39 +1209,43 @@ Handle_Buffer( CONN_ID Idx ) static void -Check_Connections( void ) +Check_Connections(void) { /* check if connections are alive. if not, play PING-PONG first. * if this doesn't help either, disconnect client. */ CLIENT *c; CONN_ID i; - for( i = 0; i < Pool_Size; i++ ) { + for (i = 0; i < Pool_Size; i++) { if (My_Connections[i].sock < 0) continue; - c = Conn_GetClient( i ); - if( c && (( Client_Type( c ) == CLIENT_USER ) || ( Client_Type( c ) == CLIENT_SERVER ) || ( Client_Type( c ) == CLIENT_SERVICE ))) - { + c = Conn_GetClient(i); + if (c && ((Client_Type(c) == CLIENT_USER) + || (Client_Type(c) == CLIENT_SERVER) + || (Client_Type(c) == CLIENT_SERVICE))) { /* connected User, Server or Service */ - if( My_Connections[i].lastping > My_Connections[i].lastdata ) { - /* we already sent a ping */ - if( My_Connections[i].lastping < time( NULL ) - Conf_PongTimeout ) { + if (My_Connections[i].lastping > + My_Connections[i].lastdata) { + /* We already sent a ping */ + if (My_Connections[i].lastping < + time(NULL) - Conf_PongTimeout) { /* Timeout */ - LogDebug("Connection %d: Ping timeout: %d seconds.", - i, Conf_PongTimeout ); - Conn_Close( i, NULL, "Ping timeout", true ); + LogDebug + ("Connection %d: Ping timeout: %d seconds.", + i, Conf_PongTimeout); + Conn_Close(i, NULL, "Ping timeout", + true); } - } - else if( My_Connections[i].lastdata < time( NULL ) - Conf_PingTimeout ) { - /* we need to sent a PING */ - LogDebug("Connection %d: sending PING ...", i ); - My_Connections[i].lastping = time( NULL ); - Conn_WriteStr( i, "PING :%s", Client_ID( Client_ThisServer( ))); + } else if (My_Connections[i].lastdata < + time(NULL) - Conf_PingTimeout) { + /* We need to send a PING ... */ + LogDebug("Connection %d: sending PING ...", i); + My_Connections[i].lastping = time(NULL); + Conn_WriteStr(i, "PING :%s", + Client_ID(Client_ThisServer())); } - } - else - { + } else { /* The connection is not fully established yet, so * we don't do the PING-PONG game here but instead * disconnect the client after "a short time" if it's @@ -1246,7 +1253,9 @@ Check_Connections( void ) if (My_Connections[i].lastdata < time(NULL) - Conf_PongTimeout) { - LogDebug("Unregistered connection %d timed out ...", i); + LogDebug + ("Unregistered connection %d timed out ...", + i); Conn_Close(i, NULL, "Timeout", false); } }