Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68fbe132 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Don't overwrite persistent property files" into main

parents 3ef4da2f c7230a1e
Loading
Loading
Loading
Loading
+18 −18
Original line number Original line Diff line number Diff line
@@ -115,24 +115,6 @@ void RemoveLegacyPersistentPropertyFiles() {
    }
    }
}
}


PersistentProperties LoadPersistentPropertiesFromMemory() {
    PersistentProperties persistent_properties;
    __system_property_foreach(
        [](const prop_info* pi, void* cookie) {
            __system_property_read_callback(
                pi,
                [](void* cookie, const char* name, const char* value, unsigned serial) {
                    if (StartsWith(name, "persist.")) {
                        auto properties = reinterpret_cast<PersistentProperties*>(cookie);
                        AddPersistentProperty(name, value, properties);
                    }
                },
                cookie);
        },
        &persistent_properties);
    return persistent_properties;
}

Result<std::string> ReadPersistentPropertyFile() {
Result<std::string> ReadPersistentPropertyFile() {
    const std::string temp_filename = persistent_property_filename + ".tmp";
    const std::string temp_filename = persistent_property_filename + ".tmp";
    if (access(temp_filename.c_str(), F_OK) == 0) {
    if (access(temp_filename.c_str(), F_OK) == 0) {
@@ -221,6 +203,24 @@ Result<void> WritePersistentPropertyFile(const PersistentProperties& persistent_
    return {};
    return {};
}
}


PersistentProperties LoadPersistentPropertiesFromMemory() {
    PersistentProperties persistent_properties;
    __system_property_foreach(
            [](const prop_info* pi, void* cookie) {
                __system_property_read_callback(
                        pi,
                        [](void* cookie, const char* name, const char* value, unsigned serial) {
                            if (StartsWith(name, "persist.")) {
                                auto properties = reinterpret_cast<PersistentProperties*>(cookie);
                                AddPersistentProperty(name, value, properties);
                            }
                        },
                        cookie);
            },
            &persistent_properties);
    return persistent_properties;
}

// Persistent properties are not written often, so we rather not keep any data in memory and read
// Persistent properties are not written often, so we rather not keep any data in memory and read
// then rewrite the persistent property file for each update.
// then rewrite the persistent property file for each update.
void WritePersistentProperty(const std::string& name, const std::string& value) {
void WritePersistentProperty(const std::string& name, const std::string& value) {
+1 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ void AddPersistentProperty(const std::string& name, const std::string& value,
                           PersistentProperties* persistent_properties);
                           PersistentProperties* persistent_properties);
PersistentProperties LoadPersistentProperties();
PersistentProperties LoadPersistentProperties();
void WritePersistentProperty(const std::string& name, const std::string& value);
void WritePersistentProperty(const std::string& name, const std::string& value);
PersistentProperties LoadPersistentPropertiesFromMemory();


// Exposed only for testing
// Exposed only for testing
Result<PersistentProperties> LoadPersistentPropertyFile();
Result<PersistentProperties> LoadPersistentPropertyFile();
+3 −12
Original line number Original line Diff line number Diff line
@@ -1400,8 +1400,6 @@ static void HandleInitSocket() {
            // Apply staged and persistent properties
            // Apply staged and persistent properties
            bool has_staged_prop = false;
            bool has_staged_prop = false;
            auto const staged_prefix = std::string_view("next_boot.");
            auto const staged_prefix = std::string_view("next_boot.");
            auto const staged_persist_prefix = std::string_view("next_boot.persist.");
            auto persist_props_map = std::unordered_map<std::string, std::string>();


            auto persistent_properties = LoadPersistentProperties();
            auto persistent_properties = LoadPersistentProperties();
            for (const auto& property_record : persistent_properties.properties()) {
            for (const auto& property_record : persistent_properties.properties()) {
@@ -1412,23 +1410,16 @@ static void HandleInitSocket() {
                  has_staged_prop = true;
                  has_staged_prop = true;
                  auto actual_prop_name = prop_name.substr(staged_prefix.size());
                  auto actual_prop_name = prop_name.substr(staged_prefix.size());
                  InitPropertySet(actual_prop_name, prop_value);
                  InitPropertySet(actual_prop_name, prop_value);
                  if (StartsWith(prop_name, staged_persist_prefix)) {
                } else {
                    persist_props_map[actual_prop_name] = prop_value;
                  }
                } else if (!persist_props_map.count(prop_name)) {
                  InitPropertySet(prop_name, prop_value);
                  InitPropertySet(prop_name, prop_value);
                }
                }
            }
            }


            // Update persist prop file if there are staged props
            // Update persist prop file if there are staged props
            if (has_staged_prop) {
            if (has_staged_prop) {
                PersistentProperties updated_persist_props;
                PersistentProperties props = LoadPersistentPropertiesFromMemory();
                for (auto const& [prop_name, prop_value] : persist_props_map) {
                    AddPersistentProperty(prop_name, prop_value, &updated_persist_props);
                }

                // write current updated persist prop file
                // write current updated persist prop file
                auto result = WritePersistentPropertyFile(updated_persist_props);
                auto result = WritePersistentPropertyFile(props);
                if (!result.ok()) {
                if (!result.ok()) {
                    LOG(ERROR) << "Could not store persistent property: " << result.error();
                    LOG(ERROR) << "Could not store persistent property: " << result.error();
                }
                }