summaryrefslogtreecommitdiffstats
path: root/init/property_service.c
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2013-06-17 18:24:39 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-06-17 18:24:39 -0700
commit44d1f3c703015b065f009604907033aac8bedf32 (patch)
tree5d6364d0c3cec229ab99f78e6ef61b22883ad66d /init/property_service.c
parent88411498b3341dbf8f2976991524b1e21dedc6f6 (diff)
parent99c1a4168ba792437f298d31cd4631ff01661476 (diff)
downloadsystem_core-44d1f3c703015b065f009604907033aac8bedf32.zip
system_core-44d1f3c703015b065f009604907033aac8bedf32.tar.gz
system_core-44d1f3c703015b065f009604907033aac8bedf32.tar.bz2
am 99c1a416: resolved conflicts for merge of 95a41f6b to stage-aosp-master
* commit '99c1a4168ba792437f298d31cd4631ff01661476': init: fix copying boot properties toolbox: hide property implementation from watchprops init: verify size of property buffers passed to property_get init: move the system property writer implementation init: switch property_get to use __system_property_get
Diffstat (limited to 'init/property_service.c')
-rwxr-xr-xinit/property_service.c80
1 files changed, 15 insertions, 65 deletions
diff --git a/init/property_service.c b/init/property_service.c
index d7740c3..88348bd 100755
--- a/init/property_service.c
+++ b/init/property_service.c
@@ -151,23 +151,11 @@ out:
return -1;
}
-/* (8 header words + 247 toc words) = 1020 bytes */
-/* 1024 bytes header and toc + 247 prop_infos @ 128 bytes = 32640 bytes */
-
-#define PA_COUNT_MAX 247
-#define PA_INFO_START 1024
-#define PA_SIZE 32768
-
static workspace pa_workspace;
-static prop_info *pa_info_array;
-
-extern prop_area *__system_property_area__;
static int init_property_area(void)
{
- prop_area *pa;
-
- if(pa_info_array)
+ if (property_area_inited)
return -1;
if(init_workspace(&pa_workspace, PA_SIZE))
@@ -175,27 +163,12 @@ static int init_property_area(void)
fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);
- pa_info_array = (void*) (((char*) pa_workspace.data) + PA_INFO_START);
-
- pa = pa_workspace.data;
- memset(pa, 0, PA_SIZE);
- pa->magic = PROP_AREA_MAGIC;
- pa->version = PROP_AREA_VERSION;
+ __system_property_area_init(pa_workspace.data);
- /* plug into the lib property services */
- __system_property_area__ = pa;
property_area_inited = 1;
return 0;
}
-static void update_prop_info(prop_info *pi, const char *value, unsigned len)
-{
- pi->serial = pi->serial | 1;
- memcpy(pi->value, value, len + 1);
- pi->serial = (len << 24) | ((pi->serial + 1) & 0xffffff);
- __futex_wake(&pi->serial, INT32_MAX);
-}
-
static int check_mac_perms(const char *name, char *sctx)
{
if (is_selinux_enabled() <= 0)
@@ -298,19 +271,9 @@ static int check_perms(const char *name, unsigned int uid, unsigned int gid, cha
return 0;
}
-const char* property_get(const char *name)
+int __property_get(const char *name, char *value)
{
- prop_info *pi;
-
- if(strlen(name) >= PROP_NAME_MAX) return 0;
-
- pi = (prop_info*) __system_property_find(name);
-
- if(pi != 0) {
- return pi->value;
- } else {
- return 0;
- }
+ return __system_property_get(name, value);
}
static void write_persistent_property(const char *name, const char *value)
@@ -337,8 +300,8 @@ static void write_persistent_property(const char *name, const char *value)
int property_set(const char *name, const char *value)
{
- prop_area *pa;
prop_info *pi;
+ int ret;
size_t namelen = strlen(name);
size_t valuelen = strlen(value);
@@ -353,29 +316,13 @@ int property_set(const char *name, const char *value)
/* ro.* properties may NEVER be modified once set */
if(!strncmp(name, "ro.", 3)) return -1;
- pa = __system_property_area__;
- update_prop_info(pi, value, valuelen);
- pa->serial++;
- __futex_wake(&pa->serial, INT32_MAX);
+ __system_property_update(pi, value, valuelen);
} else {
- pa = __system_property_area__;
- if(pa->count == PA_COUNT_MAX) {
- ERROR("Failed to set '%s'='%s', property pool is exhausted at %d entries",
- name, value, PA_COUNT_MAX);
- return -1;
+ ret = __system_property_add(name, namelen, value, valuelen);
+ if (ret < 0) {
+ ERROR("Failed to set '%s'='%s'", name, value);
+ return ret;
}
-
- pi = pa_info_array + pa->count;
- pi->serial = (valuelen << 24);
- memcpy(pi->name, name, namelen + 1);
- memcpy(pi->value, value, valuelen + 1);
-
- pa->toc[pa->count] =
- (namelen << 24) | (((unsigned) pi) - ((unsigned) pa));
-
- pa->count++;
- pa->serial++;
- __futex_wake(&pa->serial, INT32_MAX);
}
/* If name starts with "net." treat as a DNS property. */
if (strncmp("net.", name, strlen("net.")) == 0) {
@@ -597,8 +544,11 @@ int properties_inited(void)
static void load_override_properties() {
#ifdef ALLOW_LOCAL_PROP_OVERRIDE
- const char *debuggable = property_get("ro.debuggable");
- if (debuggable && (strcmp(debuggable, "1") == 0)) {
+ char debuggable[PROP_VALUE_MAX];
+ int ret;
+
+ ret = property_get("ro.debuggable", debuggable);
+ if (ret && (strcmp(debuggable, "1") == 0)) {
load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);
}
#endif /* ALLOW_LOCAL_PROP_OVERRIDE */