#include #include #include #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ #include void property_override(char const prop[], char const value[], bool add = false) { auto pi = (prop_info *) __system_property_find(prop); if (pi != nullptr) { __system_property_update(pi, value, strlen(value)); } else if (add) { __system_property_add(prop, strlen(prop), value, strlen(value)); } } void property_override(const std::vector &props, char const value[], bool add = false) { for (const auto &prop : props) { property_override(prop.c_str(), value, add); } } std::map load_config() { std::map config; if (std::ifstream file("/system/etc/ih8sn.conf"); file.good()) { std::string line; while (std::getline(file, line)) { if (line[0] == '#') { continue; } if (const auto separator = line.find('='); separator != std::string::npos) { config[line.substr(0, separator)] = line.substr(separator + 1); } } } return config; } std::vector property_list(const std::string &prefix, const std::string &suffix) { std::vector props; for (const std::string &part : { "", "bootimage.", "odm_dlkm.", "odm.", "oem.", "product.", "system_dlkm.", "system_ext.", "system.", "vendor_dlkm.", "vendor.", }) { props.emplace_back(prefix + part + suffix); } return props; } int main(int argc, char *argv[]) { if (__system_properties_init()) { return -1; } if (argc != 2) { return -1; } const auto is_init_stage = strcmp(argv[1], "init") == 0; const auto is_boot_completed_stage = strcmp(argv[1], "boot_completed") == 0; const auto config = load_config(); const auto build_fingerprint = config.find("BUILD_FINGERPRINT"); const auto build_description = config.find("BUILD_DESCRIPTION"); const auto build_security_patch_date = config.find("BUILD_SECURITY_PATCH_DATE"); const auto build_tags = config.find("BUILD_TAGS"); const auto build_type = config.find("BUILD_TYPE"); const auto build_version_release = config.find("BUILD_VERSION_RELEASE"); const auto build_version_release_or_codename = config.find("BUILD_VERSION_RELEASE_OR_CODENAME"); const auto debuggable = config.find("DEBUGGABLE"); const auto manufacturer_name = config.find("MANUFACTURER_NAME"); const auto product_brand = config.find("PRODUCT_BRAND"); const auto product_device = config.find("PRODUCT_DEVICE"); const auto product_model = config.find("PRODUCT_MODEL"); const auto product_name = config.find("PRODUCT_NAME"); const auto first_api_level = config.find("FIRST_API_LEVEL"); if (is_init_stage && build_fingerprint != config.end()) { property_override(property_list("ro.", "build.fingerprint"), build_fingerprint->second.c_str()); } if (is_init_stage && build_tags != config.end()) { property_override(property_list("ro.", "build.tags"), build_tags->second.c_str()); } if (is_init_stage && build_type != config.end()) { property_override(property_list("ro.", "build.type"), build_type->second.c_str()); } if (is_boot_completed_stage && build_version_release != config.end()) { property_override(property_list("ro.", "build.version.release"), build_version_release->second.c_str()); } if (is_boot_completed_stage && build_version_release_or_codename != config.end()) { property_override(property_list("ro.", "build.version.release_or_codename"), build_version_release_or_codename->second.c_str()); } if (is_init_stage && build_description != config.end()) { property_override("ro.build.description", build_description->second.c_str()); } if (is_boot_completed_stage && build_security_patch_date != config.end()) { property_override("ro.build.version.security_patch", build_security_patch_date->second.c_str()); } if (is_init_stage && debuggable != config.end()) { property_override("ro.debuggable", debuggable->second.c_str()); } if (is_init_stage && manufacturer_name != config.end()) { property_override(property_list("ro.product.", "manufacturer"), manufacturer_name->second.c_str()); } if (is_init_stage && product_brand != config.end()) { property_override(property_list("ro.product.", "brand"), product_brand->second.c_str()); } if (is_init_stage && product_device != config.end()) { property_override(property_list("ro.product.", "device"), product_device->second.c_str()); } if (is_init_stage && product_model != config.end()) { property_override(property_list("ro.product.", "model"), product_model->second.c_str()); } if (is_init_stage && product_name != config.end()) { property_override(property_list("ro.product.", "name"), product_name->second.c_str()); } if (is_boot_completed_stage && first_api_level != config.end()) { property_override(property_list("ro.product.", "first_api_level"), first_api_level->second.c_str()); } if (is_boot_completed_stage) { property_override("ro.boot.flash.locked", "1"); property_override("ro.boot.vbmeta.device_state", "locked"); property_override("ro.boot.verifiedbootstate", "green"); property_override("ro.boot.veritymode", "enforcing"); property_override("ro.boot.warranty_bit", "0"); property_override("ro.warranty_bit", "0"); } return 0; }