Use a temporary file for modified-attributes.conf updates

fixes #10238
This commit is contained in:
Michael Friedrich 2015-09-29 18:40:04 +02:00
parent dfa2ac450c
commit 00712f1902
2 changed files with 23 additions and 1 deletions

View File

@ -169,9 +169,17 @@ static void PersistModAttrHelper(std::ofstream& fp, ConfigObject::Ptr& previousO
void IcingaApplication::DumpProgramState(void)
{
ConfigObject::DumpObjects(GetStatePath());
DumpModifiedAttributes();
}
void IcingaApplication::DumpModifiedAttributes(void)
{
String path = GetModAttrPath();
std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc);
String pathtmp = path + ".tmp";
std::ofstream fp;
fp.open(pathtmp.CStr(), std::ofstream::out | std::ofstream::trunc);
ConfigObject::Ptr previousObject;
ConfigObject::DumpModifiedAttributes(boost::bind(&PersistModAttrHelper, boost::ref(fp), boost::ref(previousObject), _1, _2, _3));
@ -180,6 +188,19 @@ void IcingaApplication::DumpProgramState(void)
ConfigWriter::EmitValue(fp, 0, previousObject->GetVersion());
ConfigWriter::EmitRaw(fp, "\n}\n");
}
fp.close();
#ifdef _WIN32
_unlink(path.CStr());
#endif /* _WIN32 */
if (rename(pathtmp.CStr(), path.CStr()) < 0) {
BOOST_THROW_EXCEPTION(posix_error()
<< boost::errinfo_api_function("rename")
<< boost::errinfo_errno(errno)
<< boost::errinfo_file_name(pathtmp));
}
}
IcingaApplication::Ptr IcingaApplication::GetInstance(void)

View File

@ -56,6 +56,7 @@ public:
private:
void DumpProgramState(void);
void DumpModifiedAttributes(void);
virtual void OnShutdown(void) override;
};