--- ppp-2.4.5.orig/pppd/main.c 2009-11-16 23:26:07.000000000 +0100 +++ ppp-2.4.5/pppd/main.c 2011-01-16 15:51:05.000000000 +0100 @@ -90,6 +90,7 @@ #include #include #include +#include #include "pppd.h" #include "magic.h" @@ -228,6 +229,7 @@ static struct subprocess *children; /* Prototypes for procedures local to this file. */ +static void check_time(void); static void setup_signals __P((void)); static void create_pidfile __P((int pid)); static void create_linkpidfile __P((int pid)); @@ -530,6 +532,7 @@ main(argc, argv) info("Starting link"); } + check_time(); gettimeofday(&start_time, NULL); script_unsetenv("CONNECT_TIME"); script_unsetenv("BYTES_SENT"); @@ -1263,6 +1266,36 @@ struct callout { static struct callout *callout = NULL; /* Callout list */ static struct timeval timenow; /* Current time */ +static long uptime_diff = 0; +static int uptime_diff_set = 0; + +static void check_time(void) +{ + long new_diff; + struct timeval t; + struct sysinfo i; + struct callout *p; + + gettimeofday(&t, NULL); + sysinfo(&i); + new_diff = t.tv_sec - i.uptime; + + if (!uptime_diff_set) { + uptime_diff = new_diff; + uptime_diff_set = 1; + return; + } + + if ((new_diff - 5 > uptime_diff) || (new_diff + 5 < uptime_diff)) { + /* system time has changed, update counters and timeouts */ + info("System time change detected."); + start_time.tv_sec += new_diff - uptime_diff; + + for (p = callout; p != NULL; p = p->c_next) + p->c_time.tv_sec += new_diff - uptime_diff; + } + uptime_diff = new_diff; +} /* * timeout - Schedule a timeout. @@ -1333,6 +1366,8 @@ calltimeout() { struct callout *p; + check_time(); + while (callout != NULL) { p = callout; @@ -1360,6 +1395,8 @@ timeleft(tvp) { if (callout == NULL) return NULL; + + check_time(); gettimeofday(&timenow, NULL); tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;