bionic: add compatibility mode for properties
Allow a new bionic to work with an old init property area by supporting
the old format.
(cherry picked from commit ad76c85b9ca587084089d086f954158bc0eae905)
Change-Id: Ib496e818a62a5834d40c71eb4745783d998be893
diff --git a/libc/bionic/system_properties.c b/libc/bionic/system_properties.c
index 0d42195..4c2e5a2 100644
--- a/libc/bionic/system_properties.c
+++ b/libc/bionic/system_properties.c
@@ -109,6 +109,7 @@
static const char property_service_socket[] = "/dev/socket/" PROP_SERVICE_NAME;
static char property_filename[PATH_MAX] = PROP_FILENAME;
+static bool compat_mode = false;
prop_area *__system_property_area__ = NULL;
@@ -156,6 +157,7 @@
pa_size = PA_SIZE;
pa_data_size = pa_size - sizeof(prop_area);
+ compat_mode = false;
pa = mmap(NULL, pa_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(pa == MAP_FAILED)
@@ -246,11 +248,16 @@
goto cleanup;
}
- if((pa->magic != PROP_AREA_MAGIC) || (pa->version != PROP_AREA_VERSION)) {
+ if((pa->magic != PROP_AREA_MAGIC) || (pa->version != PROP_AREA_VERSION &&
+ pa->version != PROP_AREA_VERSION_COMPAT)) {
munmap(pa, pa_size);
goto cleanup;
}
+ if (pa->version == PROP_AREA_VERSION_COMPAT) {
+ compat_mode = true;
+ }
+
result = 0;
__system_property_area__ = pa;
@@ -425,6 +432,9 @@
const prop_info *__system_property_find(const char *name)
{
+ if (__predict_false(compat_mode)) {
+ return __system_property_find_compat(name);
+ }
return find_property(root_node(), name, strlen(name), NULL, 0, false);
}
@@ -432,6 +442,10 @@
{
unsigned serial, len;
+ if (__predict_false(compat_mode)) {
+ return __system_property_read_compat(pi, name, value);
+ }
+
for(;;) {
serial = pi->serial;
while(SERIAL_DIRTY(serial)) {
@@ -688,5 +702,8 @@
int __system_property_foreach(void (*propfn)(const prop_info *pi, void *cookie),
void *cookie)
{
+ if (__predict_false(compat_mode)) {
+ return __system_property_foreach_compat(propfn, cookie);
+ }
return foreach_property(0, propfn, cookie);
}