深入剖析Android中init进程实现的C语言源码

2020-01-06 13:38:30丽君
  • 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请求。