patch pppd to be able to deal with time changes during a connection, fixes #31

SVN-Revision: 2432
This commit is contained in:
Felix Fietkau 2005-11-11 19:42:49 +00:00
parent d626a78938
commit 534ed31049

View File

@ -0,0 +1,82 @@
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;