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

2020-01-06 13:38:30丽君
  •   // 接收客户端请求数据 
  • r = TEMP_FAILURE_RETRY(recv(s, &msg, sizeof(msg), 0));  if (r != sizeof(prop_msg)) { 
  • ERROR("sys_prop: mis-match msg size received: %d expected : %d errno: %dn", r, sizeof(prop_msg), errno);  close(s); 
  • return;  } 
  •   switch(msg.cmd) { 
  • case PROP_MSG_SETPROP:  msg.name[PROP_NAME_MAX - 1] = 0; 
  • msg.value[PROP_VALUE_MAX - 1] = 0;   
  • if (memcmp(msg.name, "ctl.", 4) == 0) {  close(s); 
  • if (check_control_perms(msg.value, cr.uid, cr.gid, source_ctx)) {  handle_control_message((char*) msg.name + 4, (char*) msg.value); 
  • } else {  ERROR("sys_prop: Unable to %s service ctl [%s] uid:%d gid:%d pid:%dn", msg.name + 4, msg.value, cr.uid, cr.gid, cr.pid); 
  • }  } else { 
  • if (check_perms(msg.name, cr.uid, cr.gid, source_ctx)) {  property_set((char *) msg.name, (char*) msg.value); 
  • }  close(s); 
  • }  break; 
  • default:  close(s); 
  • break;  } 
  • 当客户端的权限满足要求时,init就调用property_set进行相关处理。property_set源码实现如下:

     

     
    1. int property_set(const char *name, const char *value)  {