Andorid 4.1.2
system/core/libcutils/properties.c
int property_set(const char *key, const char *value)
{
return __system_property_set(key, value);
}
int property_get(const char *key, char *value, const char *default_value)
{
int len;
len = __system_property_get(key, value);
if(len > 0) {
return len;
}
if(default_value) { // default value 为NULL, 刚不会对value 做任何改变
len = strlen(default_value);
memcpy(value, default_value, len + 1);
}
return len;
}
bionic/libc/bionic/system_properties.c
int __system_property_read(const prop_info *pi, char *name, char *value)
{
unsigned serial, len;
for(;;) {
serial = pi->serial;
while(SERIAL_DIRTY(serial)) {
__futex_wait((volatile void *)&pi->serial, serial, 0);
serial = pi->serial;
}
len = SERIAL_VALUE_LEN(serial);
memcpy(value, pi->value, len + 1);
if(serial == pi->serial) {
if(name != 0) {
strcpy(name, pi->name);
}
return len;
}
}
}
int __system_property_get(const char *name, char *value)
{
const prop_info *pi = __system_property_find(name);
if(pi != 0) {
return __system_property_read(pi, 0, value);
} else {
value[0] = 0;
return 0;
}
}
int __system_property_set(const char *key, const char *value)
{
int err;
int tries = 0;
int update_seen = 0;
prop_msg msg;
if(key == 0) {
__libc_android_log_print(ANDROID_LOG_ERROR, "libc", "__system_property_set error : key = 0 \n");
return -1;
}
if(value == 0) value = "";
if(strlen(key) >= PROP_NAME_MAX) {
__libc_android_log_print(ANDROID_LOG_ERROR, "libc", "__system_property_set error : strlen(key) >= %d, key = %s\n", PROP_NAME_MAX, key);
return -2;
}
if(strlen(value) >= PROP_VALUE_MAX) {
__libc_android_log_print(ANDROID_LOG_ERROR, "libc", "__system_property_set error : strlen(value) >= %d, value = %s \n", PROP_VALUE_MAX, value);
return -3;
}
memset(&msg, 0, sizeof msg);
msg.cmd = PROP_MSG_SETPROP;
strlcpy(msg.name, key, sizeof msg.name);
strlcpy(msg.value, value, sizeof msg.value);
err = send_prop_msg(&msg);
if(err < 0) {
return err;
}
return 0;
}