int mb__system_properties_init() { if (initialized) { list_foreach(contexts, [](context_node* l) { l->reset_access(); }); return 0; } if (is_dir(property_filename)) { if (!initialize_properties()) { return -1; } if (!map_system_property_area(false, nullptr)) { free_and_unmap_contexts(); return -1; } } else { mb__system_property_area__ = map_prop_area(property_filename, true); if (!mb__system_property_area__) { return -1; } list_add(&contexts, "legacy_system_prop_area", mb__system_property_area__); list_add_after_len(&prefixes, "*", contexts); } initialized = true; return 0; }
bool context_node::open(bool access_rw, bool* fsetxattr_failed) { lock_.lock(); if (pa_) { lock_.unlock(); return true; } char filename[PROP_FILENAME_MAX]; int len = snprintf(filename, sizeof(filename), "%s/%s", property_filename, context_); if (len < 0 || len > PROP_FILENAME_MAX) { lock_.unlock(); return false; } if (access_rw) { pa_ = map_prop_area_rw(filename, context_, fsetxattr_failed); } else { pa_ = map_prop_area(filename #if MB_ENABLE_COMPAT_PROPERTIES , false #endif ); } lock_.unlock(); return pa_; }
static bool map_system_property_area(bool access_rw, bool* fsetxattr_failed) { char filename[PROP_FILENAME_MAX]; int len = snprintf(filename, sizeof(filename), "%s/properties_serial", property_filename); if (len < 0 || len > PROP_FILENAME_MAX) { mb__system_property_area__ = nullptr; return false; } if (access_rw) { mb__system_property_area__ = map_prop_area_rw(filename, "u:object_r:properties_serial:s0", fsetxattr_failed); } else { mb__system_property_area__ = map_prop_area(filename, false); } return mb__system_property_area__; }
int __system_properties_init() { return map_prop_area(); }