summaryrefslogtreecommitdiff
path: root/controller/FileDB.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2018-07-03 12:51:41 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2018-07-03 12:51:41 -0700
commit73e4286fbfce8ce017304f693a1190521ad4a8f9 (patch)
treed1323abad493995dae88db5cb5658ad451d7754e /controller/FileDB.cpp
parent4e6151ebd97cbc145d6997f377b3db28d51c6bfc (diff)
downloadinfinitytier-73e4286fbfce8ce017304f693a1190521ad4a8f9.tar.gz
infinitytier-73e4286fbfce8ce017304f693a1190521ad4a8f9.zip
Fix two controller bugs: filesystem bug and another possible infinite recursion bug.
Diffstat (limited to 'controller/FileDB.cpp')
-rw-r--r--controller/FileDB.cpp38
1 files changed, 22 insertions, 16 deletions
diff --git a/controller/FileDB.cpp b/controller/FileDB.cpp
index a7b59cbf..e78a64c9 100644
--- a/controller/FileDB.cpp
+++ b/controller/FileDB.cpp
@@ -91,13 +91,15 @@ void FileDB::save(nlohmann::json *orig,nlohmann::json &record)
nlohmann::json old;
get(nwid,old);
- OSUtils::ztsnprintf(p1,sizeof(p1),"%s" ZT_PATH_SEPARATOR_S "%.16llx.json.new",_networksPath.c_str(),nwid);
- OSUtils::ztsnprintf(p2,sizeof(p2),"%s" ZT_PATH_SEPARATOR_S "%.16llx.json",_networksPath.c_str(),nwid);
- if (!OSUtils::writeFile(p1,OSUtils::jsonDump(record,-1)))
- fprintf(stderr,"WARNING: controller unable to write to path: %s" ZT_EOL_S,p1);
- OSUtils::rename(p1,p2);
+ if ((!old.is_object())||(old != record)) {
+ OSUtils::ztsnprintf(p1,sizeof(p1),"%s" ZT_PATH_SEPARATOR_S "%.16llx.json.new",_networksPath.c_str(),nwid);
+ OSUtils::ztsnprintf(p2,sizeof(p2),"%s" ZT_PATH_SEPARATOR_S "%.16llx.json",_networksPath.c_str(),nwid);
+ if (!OSUtils::writeFile(p1,OSUtils::jsonDump(record,-1)))
+ fprintf(stderr,"WARNING: controller unable to write to path: %s" ZT_EOL_S,p1);
+ OSUtils::rename(p1,p2);
- _networkChanged(old,record,true);
+ _networkChanged(old,record,true);
+ }
}
} else if (objtype == "member") {
const uint64_t id = OSUtils::jsonIntHex(record["id"],0ULL);
@@ -106,17 +108,21 @@ void FileDB::save(nlohmann::json *orig,nlohmann::json &record)
nlohmann::json network,old;
get(nwid,network,id,old);
- OSUtils::ztsnprintf(pb,sizeof(pb),"%s" ZT_PATH_SEPARATOR_S "%.16llx" ZT_PATH_SEPARATOR_S "member",_networksPath.c_str(),(unsigned long long)nwid);
- OSUtils::ztsnprintf(p1,sizeof(p1),"%s" ZT_PATH_SEPARATOR_S "%.10llx.json.new",pb,(unsigned long long)id);
- OSUtils::ztsnprintf(p2,sizeof(p2),"%s" ZT_PATH_SEPARATOR_S "%.10llx.json",pb,(unsigned long long)id);
- if (!OSUtils::writeFile(p1,OSUtils::jsonDump(record,-1))) {
- OSUtils::mkdir(pb);
- if (!OSUtils::writeFile(p1,OSUtils::jsonDump(record,-1)))
- fprintf(stderr,"WARNING: controller unable to write to path: %s" ZT_EOL_S,p1);
- }
- OSUtils::rename(p1,p2);
+ if ((!old.is_object())||(old != record)) {
+ OSUtils::ztsnprintf(pb,sizeof(pb),"%s" ZT_PATH_SEPARATOR_S "%.16llx" ZT_PATH_SEPARATOR_S "member",_networksPath.c_str(),(unsigned long long)nwid);
+ OSUtils::ztsnprintf(p1,sizeof(p1),"%s" ZT_PATH_SEPARATOR_S "%.10llx.json.new",pb,(unsigned long long)id);
+ if (!OSUtils::writeFile(p1,OSUtils::jsonDump(record,-1))) {
+ OSUtils::ztsnprintf(p2,sizeof(p2),"%s" ZT_PATH_SEPARATOR_S "%.16llx",_networksPath.c_str(),(unsigned long long)nwid);
+ OSUtils::mkdir(p2);
+ OSUtils::mkdir(pb);
+ if (!OSUtils::writeFile(p1,OSUtils::jsonDump(record,-1)))
+ fprintf(stderr,"WARNING: controller unable to write to path: %s" ZT_EOL_S,p1);
+ }
+ OSUtils::ztsnprintf(p2,sizeof(p2),"%s" ZT_PATH_SEPARATOR_S "%.10llx.json",pb,(unsigned long long)id);
+ OSUtils::rename(p1,p2);
- _memberChanged(old,record,true);
+ _memberChanged(old,record,true);
+ }
}
} else if (objtype == "trace") {
const std::string id = record["id"];