summaryrefslogtreecommitdiffstats
path: root/init
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2014-03-19 20:45:37 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-03-19 20:45:37 +0000
commit299b2eecc58d8b3a50cb52e61a61b28aa7f1c038 (patch)
tree8543785995d9352c93d3fe9034061effc0e12caa /init
parentcf4ddc77117c9ca30180c6f76e29945df4708399 (diff)
parent12e3639a6e1cdd77af0964e10081311430fd065c (diff)
downloadsystem_core-299b2eecc58d8b3a50cb52e61a61b28aa7f1c038.zip
system_core-299b2eecc58d8b3a50cb52e61a61b28aa7f1c038.tar.gz
system_core-299b2eecc58d8b3a50cb52e61a61b28aa7f1c038.tar.bz2
am 12e3639a: am c383c6d1: Merge "Add "import" support to system property files."
* commit '12e3639a6e1cdd77af0964e10081311430fd065c': Add "import" support to system property files.
Diffstat (limited to 'init')
-rw-r--r--init/property_service.c79
1 files changed, 57 insertions, 22 deletions
diff --git a/init/property_service.c b/init/property_service.c
index db5a45b..56ae56f 100644
--- a/init/property_service.c
+++ b/init/property_service.c
@@ -457,40 +457,73 @@ void get_property_workspace(int *fd, int *sz)
*sz = pa_workspace.size;
}
-static void load_properties(char *data, char *prefix)
+static void load_properties_from_file(const char *, const char *);
+
+/*
+ * Filter is used to decide which properties to load: NULL loads all keys,
+ * "ro.foo.*" is a prefix match, and "ro.foo.bar" is an exact match.
+ */
+static void load_properties(char *data, const char *filter)
{
- char *key, *value, *eol, *sol, *tmp;
- size_t plen;
+ char *key, *value, *eol, *sol, *tmp, *fn;
+ size_t flen = 0;
+
+ if (filter) {
+ flen = strlen(filter);
+ }
- if (prefix)
- plen = strlen(prefix);
sol = data;
- while((eol = strchr(sol, '\n'))) {
+ while ((eol = strchr(sol, '\n'))) {
key = sol;
*eol++ = 0;
sol = eol;
- value = strchr(key, '=');
- if(value == 0) continue;
- *value++ = 0;
+ while (isspace(*key)) key++;
+ if (*key == '#') continue;
- while(isspace(*key)) key++;
- if(*key == '#') continue;
- tmp = value - 2;
- while((tmp > key) && isspace(*tmp)) *tmp-- = 0;
+ tmp = eol - 2;
+ while ((tmp > key) && isspace(*tmp)) *tmp-- = 0;
- if (prefix && strncmp(key, prefix, plen))
- continue;
+ if (!strncmp(key, "import ", 7) && flen == 0) {
+ fn = key + 7;
+ while (isspace(*fn)) fn++;
- while(isspace(*value)) value++;
- tmp = eol - 2;
- while((tmp > value) && isspace(*tmp)) *tmp-- = 0;
+ key = strchr(fn, ' ');
+ if (key) {
+ *key++ = 0;
+ while (isspace(*key)) key++;
+ }
- property_set(key, value);
+ load_properties_from_file(fn, key);
+
+ } else {
+ value = strchr(key, '=');
+ if (!value) continue;
+ *value++ = 0;
+
+ tmp = value - 2;
+ while ((tmp > key) && isspace(*tmp)) *tmp-- = 0;
+
+ while (isspace(*value)) value++;
+
+ if (flen > 0) {
+ if (filter[flen - 1] == '*') {
+ if (strncmp(key, filter, flen - 1)) continue;
+ } else {
+ if (strcmp(key, filter)) continue;
+ }
+ }
+
+ property_set(key, value);
+ }
}
}
-static void load_properties_from_file(const char *fn, char *prefix)
+/*
+ * Filter is used to decide which properties to load: NULL loads all keys,
+ * "ro.foo.*" is a prefix match, and "ro.foo.bar" is an exact match.
+ */
+static void load_properties_from_file(const char *fn, const char *filter)
{
char *data;
unsigned sz;
@@ -498,7 +531,7 @@ static void load_properties_from_file(const char *fn, char *prefix)
data = read_file(fn, &sz);
if(data != 0) {
- load_properties(data, prefix);
+ load_properties(data, filter);
free(data);
}
}
@@ -611,8 +644,10 @@ void start_property_service(void)
load_properties_from_file(PROP_PATH_SYSTEM_BUILD, NULL);
load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT, NULL);
- load_properties_from_file(PROP_PATH_FACTORY, "ro.");
+ load_properties_from_file(PROP_PATH_FACTORY, "ro.*");
+
load_override_properties();
+
/* Read persistent properties after all default values have been loaded. */
load_persistent_properties();