prop_info *pi;
int ret;
size_t namelen = strlen(name);
size_t valuelen = strlen(value);
if (! is_legal_property_name(name, namelen)) return -1;
if (valuelen >= PROP_VALUE_MAX) return -1;
// 从属性空间中寻找是否已经存在该属性值
pi = (prop_info*) __system_property_find(name);
if (pi != 0) {
// ro开头的属性被设置后,不允许再被修改
if (! strncmp(name, "ro.", 3)) return -1;
__system_property_update(pi, value, valuelen);
} else {
ret = __system_property_add(name, namelen, value, valuelen);
}
// 有一些特殊的属性需要特殊处理,例如net.和persist.开头的属性
if (strncmp("net.", name, strlen("net.")) == 0) {
if (strcmp("net.change", name) == 0) {
return 0;
}
property_set("net.change", name);
} else if (persistent_properties_loaded && strncmp("persist.", name, strlen("persist.")) == 0) {
write_persistent_property(name, value);
}
property_changed(name, value);
return 0;
}
属性服务器端的工作基本到这里就完成了。最后,我们来看一下客户端是如何发送设置属性的socket请求。