#include "unencrypted_properties.h" #include <sys/stat.h> #include <dirent.h> namespace properties { const char* key = "key"; const char* ref = "ref"; const char* props = "props"; const char* is_default = "is_default"; } namespace { const char* unencrypted_folder = "unencrypted"; } std::string UnencryptedProperties::GetPath(const char* device) { return std::string() + device + "/" + unencrypted_folder; } UnencryptedProperties::UnencryptedProperties(const char* device) : folder_(GetPath(device)) { DIR* dir = opendir(folder_.c_str()); if (dir) { closedir(dir); } else { folder_.clear(); } } UnencryptedProperties::UnencryptedProperties() { } template<> std::string UnencryptedProperties::Get(const char* name, std::string default_value) const { if (!OK()) return default_value; std::ifstream i(folder_ + "/" + name, std::ios::binary); if (!i) { return default_value; } i.seekg(0, std::ios::end); int length = i.tellg(); i.seekg(0, std::ios::beg); if (length == -1) { return default_value; } std::string s(length, 0); i.read(&s[0], length); if (!i) { return default_value; } return s; } template<> bool UnencryptedProperties::Set(const char* name, std::string const& value) { if (!OK()) return false; std::ofstream o(folder_ + "/" + name, std::ios::binary); o << value; return !o.fail(); } UnencryptedProperties UnencryptedProperties::GetChild(const char* name) const { UnencryptedProperties up; if (!OK()) return up; std::string directory(folder_ + "/" + name); if (mkdir(directory.c_str(), 700) == -1 && errno != EEXIST) { return up; } up.folder_ = directory; return up; } bool UnencryptedProperties::Remove(const char* name) { if (!OK()) return false; if (remove((folder_ + "/" + name).c_str()) && errno != ENOENT) { return false; } return true; } bool UnencryptedProperties::OK() const { return !folder_.empty(); }