From b2792c86215c358571b256d3997eca35130b969c Mon Sep 17 00:00:00 2001
From: mirv <unknown>
Date: Fri, 4 Jan 2008 18:30:38 +0100
Subject: [PATCH] check if file has been modified before saving

---
 data.c | 16 ++++++++++++++--
 data.h |  1 +
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/data.c b/data.c
index b38809d..86c6c15 100644
--- a/data.c
+++ b/data.c
@@ -261,6 +261,16 @@ void cStructLoader::CheckAccess(void)
     }
 }
 
+bool cStructLoader::CheckUnmodified(void)
+{
+  time_t curr_mtime=MTime();
+  if(mtime && mtime<curr_mtime && SL_TSTFLAG(SL_WATCH)) {
+     PRINTF(L_CORE_LOAD,"abort save as file %s has been changed externaly",path);
+     return false;
+     }
+  return true;
+}
+
 void cStructLoader::Load(bool reload)
 {
   if(SL_TSTFLAG(SL_DISABLED) || (reload && !SL_TSTFLAG(SL_WATCH))) return;
@@ -361,7 +371,8 @@ void cStructLoader::Purge(void)
 
 void cStructLoader::Save(void)
 {
-  if(!SL_TSTFLAG(SL_DISABLED) && SL_TSTFLAG(SL_READWRITE) && SL_TSTFLAG(SL_LOADED) && IsModified()) {
+  if(!SL_TSTFLAG(SL_DISABLED) && SL_TSTFLAG(SL_READWRITE) && SL_TSTFLAG(SL_LOADED)
+      && IsModified() && CheckUnmodified()) {
     cSafeFile f(path);
     if(f.Open()) {
       ListLock(false);
@@ -429,7 +440,8 @@ void cStructLoaderPlain::Load(bool reload)
 
 void cStructLoaderPlain::Save(void)
 {
-  if(!SL_TSTFLAG(SL_DISABLED) && SL_TSTFLAG(SL_READWRITE) && SL_TSTFLAG(SL_LOADED) && IsModified()) {
+  if(!SL_TSTFLAG(SL_DISABLED) && SL_TSTFLAG(SL_READWRITE) && SL_TSTFLAG(SL_LOADED)
+      && IsModified() && CheckUnmodified()) {
     cSafeFile f(path);
     if(f.Open()) {
       ListLock(false);
diff --git a/data.h b/data.h
index 6a40ff8..26ba4b6 100644
--- a/data.h
+++ b/data.h
@@ -118,6 +118,7 @@ protected:
   time_t mtime;
   //
   void CheckAccess(void);
+  bool CheckUnmodified(void);
   time_t MTime(void);
   //
   virtual cStructItem *ParseLine(char *line)=0;
-- 
2.39.5