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

2020-01-06 13:38:30丽君
  • if (fd < 0) {  ERROR("Failed to open socket '%s': %sn", name, strerror(errno)); 
  • return -1;  } 
  •   memset(&addr, 0, sizeof(addr)); 
  • addr.sun_family = AF_UNIX;  snprintf(addr.sun_path, sizeof(addr.sun_path), ANDROID_SOCKET_DIR"/%s", name); 
  •   ret = unlink(addr.sun_path); 
  • if (ret != 0 && errno != ENOENT) {  goto out_close; 
  • }   
  • ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));  if (ret) { 
  • goto out_unlink;  } 
  • chown(addr.sun_path, uid, gid);  chmod(addr.sun_path, perm); 
  •   return fd; 
  •   out_unlink: 
  • unlink(addr.sun_path);  out_close: 
  • close(fd);  return -1; 
  • }   
  • #define PROP_PATH_SYSTEM_BUILD "/system/build.prop"  #define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop" 
  • #define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop"  #define PROP_PATH_FACTORY "/factory/factory.prop" 
  •   void start_property_service(void) 
  • {  int fd; 
  •   load_properties_from_file(PROP_PATH_SYSTEM_BUILD); 
  • load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);  load_override_properties(); 
  • /*Read persistent properties after all default values have been loaded.*/  load_persistent_properties(); 
  •   fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0); 
  • if (fd < 0) return;  fcntl(fd, F_SETFD, FD_CLOEXEC); 
  • fcntl(fd, F_SETFL, O_NONBLOCK);   
  • listen(fd, 8);  property_set_fd = fd;