| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | --- ppp-2.4.4.orig/pppd/main.c	2006-06-04 05:52:50.000000000 +0200+++ ppp-2.4.4/pppd/main.c	2009-06-05 19:12:00.000000000 +0200@@ -90,6 +90,7 @@ #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>+#include <sys/sysinfo.h>  #include "pppd.h" #include "magic.h"@@ -227,6 +228,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));@@ -529,6 +531,7 @@ main(argc, argv) 	    info("Starting link"); 	} +	check_time(); 	gettimeofday(&start_time, NULL); 	script_unsetenv("CONNECT_TIME"); 	script_unsetenv("BYTES_SENT");@@ -1262,6 +1265,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.@@ -1332,6 +1365,8 @@ calltimeout() {     struct callout *p; +	check_time();+	     while (callout != NULL) { 	p = callout; @@ -1359,6 +1394,8 @@ timeleft(tvp) {     if (callout == NULL) 	return NULL;+	+	check_time();      gettimeofday(&timenow, NULL);     tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;
 |