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);
 }