bool Config::save(const char* fname) { E_ASSERT(fname != NULL); TempFile t; if(!t.create(".etmp.XXXXXX")) { errcode = CONF_ERR_FILE; return false; } /* so we could explicitly handle our options */ t.set_no_close(true); t.set_auto_delete(false); FILE *f = t.fstream(); SectionListIter sit = section_list.begin(), sit_end = section_list.end(); unsigned int sz = section_list.size(); EntryListIter eit; for (; sit != sit_end; ++sit, --sz) { fprintf(f, "[%s]\n", (*sit)->sname); for (eit = (*sit)->entry_list.begin(); eit != (*sit)->entry_list.end(); ++eit) fprintf(f, "%s=%s\n", (*eit)->key, (*eit)->value); /* prevent unneeded newline at the end of file */ if(sz != 1) fprintf(f, "\n"); } /* explicitly flush */ fflush(f); t.close(); E_ASSERT(t.name() && "Temporary name NULL. Report this as bug"); if(rename(t.name(), fname) != 0) { E_WARNING("Unable to save to '%s'\n", fname); return false; } chmod(fname, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); return true; }
#include <edelib/TempFile.h> #include <edelib/FileTest.h> #include "UnitTest.h" EDELIB_NS_USE UT_FUNC(TempFileTest, "Test TempFile") { TempFile t, t2, t3; UT_VERIFY(t.create("foo-temp.XXXXXX") == true); UT_VERIFY(t == true); UT_VERIFY(file_test(t.name(), FILE_TEST_IS_REGULAR | FILE_TEST_IS_WRITEABLE)); t.unlink(); UT_VERIFY(file_test(t.name(), FILE_TEST_IS_REGULAR) == false); UT_VERIFY(t2.create("baz-tmp") == true); UT_VERIFY(t2 == true); UT_VERIFY(file_test(t2.name(), FILE_TEST_IS_REGULAR | FILE_TEST_IS_WRITEABLE)); UT_VERIFY(t2.fstream() != 0); t2.set_auto_delete(true); UT_VERIFY(t3.create("/this/file/should/not/exists") == false); UT_VERIFY(t3 == false); }