| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | diff -urN ppp.old/pppd/main.c ppp.dev/pppd/main.c--- ppp.old/pppd/main.c	2005-11-11 19:19:28.177790000 +0100+++ ppp.dev/pppd/main.c	2005-11-11 20:18:05.957363000 +0100@@ -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 @@  /* 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));@@ -531,6 +533,7 @@ 	    info("Starting link"); 	} +	check_time(); 	gettimeofday(&start_time, NULL); 	script_unsetenv("CONNECT_TIME"); 	script_unsetenv("BYTES_SENT");@@ -1195,6 +1198,36 @@  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.@@ -1265,6 +1298,8 @@ {     struct callout *p; +	check_time();+	     while (callout != NULL) { 	p = callout; @@ -1292,6 +1327,8 @@ {     if (callout == NULL) 	return NULL;+	+	check_time();      gettimeofday(&timenow, NULL);     tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;
 |