sgw: egress file: use full time resolution on Linux
authorFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 7 Apr 2015 07:42:45 +0000 (09:42 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 7 Apr 2015 07:43:43 +0000 (09:43 +0200)
When checking the file modification time. The file might change
again in the same second that it was last read.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/egressFile.c

index 8ac84d9..796142d 100644 (file)
@@ -66,11 +66,16 @@ static bool started = false;
 
 /** type to hold the cached stat result */
 typedef struct _CachedStat {
+#ifdef __linux__
+  struct timespec timeStamp; /* Time of last modification (full resolution) */
+#else
   time_t timeStamp; /* Time of last modification (second resolution) */
+#endif
 } CachedStat;
 
 /** the cached stat result */
 static CachedStat cachedStat;
+static CachedStat cachedStatClear;
 
 /** the malloc-ed buffer in which to store a line read from the file */
 static char * line = NULL;
@@ -425,7 +430,8 @@ bool startEgressFile(void) {
     return false;
   }
 
-  cachedStat.timeStamp = 0;
+  memset(&cachedStat.timeStamp, 0, sizeof(cachedStat.timeStamp));
+  memset(&cachedStatClear.timeStamp, 0, sizeof(cachedStatClear.timeStamp));
 
   readEgressFile(olsr_cnf->smart_gw_egress_file);
 
@@ -488,18 +494,24 @@ static bool readEgressFile(const char * fileName) {
   ssize_t length = -1;
   bool reportedErrorsLocal = false;
   const char * filepath = !fileName ? DEF_GW_EGRESS_FILE : fileName;
+  void * mtim;
 
-  if (cachedStat.timeStamp != 0) {
+  if (memcmp(&cachedStat.timeStamp, &cachedStatClear.timeStamp, sizeof(cachedStat.timeStamp))) {
     /* read the file before */
 
     if (stat(filepath, &statBuf)) {
       /* could not stat the file */
-      cachedStat.timeStamp = 0;
+      memset(&cachedStat.timeStamp, 0, sizeof(cachedStat.timeStamp));
       readEgressFileClear();
       goto outerror;
     }
 
-    if (!memcmp(&cachedStat.timeStamp, &statBuf.st_mtime, sizeof(cachedStat.timeStamp))) {
+#ifdef __linux__
+    mtim = &statBuf.st_mtim;
+#else
+    mtim = &statBuf.st_mtime;
+#endif
+    if (!memcmp(&cachedStat.timeStamp, mtim, sizeof(cachedStat.timeStamp))) {
       /* file did not change since last read */
       return false;
     }
@@ -508,7 +520,7 @@ static bool readEgressFile(const char * fileName) {
   fp = fopen(filepath, "r");
   if (!fp) {
     /* could not open the file */
-    cachedStat.timeStamp = 0;
+    memset(&cachedStat.timeStamp, 0, sizeof(cachedStat.timeStamp));
     readEgressFileClear();
     goto outerror;
   }
@@ -705,7 +717,12 @@ static bool readEgressFile(const char * fileName) {
   fclose(fp);
   fp = NULL;
 
-  memcpy(&cachedStat.timeStamp, &statBuf.st_mtime, sizeof(cachedStat.timeStamp));
+#ifdef __linux__
+    mtim = &statBuf.st_mtim;
+#else
+    mtim = &statBuf.st_mtime;
+#endif
+  memcpy(&cachedStat.timeStamp, mtim, sizeof(cachedStat.timeStamp));
 
   reportedErrors = reportedErrorsLocal;