OSDN Git Service

5086c64b669421f4e3d513eceb5a9bb046e32f3e
[android-x86/system-extras.git] / ext4_utils / unencrypted_properties.cpp
1 #include "unencrypted_properties.h"
2
3 #include <sys/stat.h>
4 #include <dirent.h>
5
6 namespace properties {
7     const char* key = "key";
8     const char* ref = "ref";
9     const char* is_default = "is_default";
10 }
11
12 namespace
13 {
14     const char* unencrypted_folder = "unencrypted";
15 }
16
17 std::string UnencryptedProperties::GetPath(const char* device)
18 {
19     return std::string() + device + "/" + unencrypted_folder;
20 }
21
22 UnencryptedProperties::UnencryptedProperties(const char* device)
23   : folder_(GetPath(device))
24 {
25     DIR* dir = opendir(folder_.c_str());
26     if (dir) {
27         closedir(dir);
28     } else {
29         folder_.clear();
30     }
31 }
32
33 UnencryptedProperties::UnencryptedProperties()
34 {
35 }
36
37 template<> std::string UnencryptedProperties::Get(const char* name,
38                                       std::string default_value) const
39 {
40     if (!OK()) return default_value;
41     std::ifstream i(folder_ + "/" + name, std::ios::binary);
42     if (!i) {
43         return default_value;
44     }
45
46     i.seekg(0, std::ios::end);
47     int length = i.tellg();
48     i.seekg(0, std::ios::beg);
49     if (length == -1) {
50         return default_value;
51     }
52
53     std::string s(length, 0);
54     i.read(&s[0], length);
55     if (!i) {
56         return default_value;
57     }
58
59     return s;
60 }
61
62 template<> bool UnencryptedProperties::Set(const char* name, std::string const& value)
63 {
64     if (!OK()) return false;
65     std::ofstream o(folder_ + "/" + name, std::ios::binary);
66     o << value;
67     return !o.fail();
68 }
69
70 UnencryptedProperties UnencryptedProperties::GetChild(const char* name) const
71 {
72     UnencryptedProperties up;
73     if (!OK()) return up;
74
75     std::string directory(folder_ + "/" + name);
76     if (mkdir(directory.c_str(), 700) == -1 && errno != EEXIST) {
77         return up;
78     }
79
80     up.folder_ = directory;
81     return up;
82 }
83
84 bool UnencryptedProperties::Remove(const char* name)
85 {
86     if (remove((folder_ + "/" + name).c_str())
87         && errno != ENOENT) {
88         return false;
89     }
90
91     return true;
92 }
93
94 bool UnencryptedProperties::OK() const
95 {
96     return !folder_.empty();
97 }