Advertisement
Jack2

Untitled

Oct 10th, 2013
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.74 KB | None | 0 0
  1. 그럼 호출되는 것이 ueventd_main 함수이다.
  2.  
  3. int ueventd_main(int argc, char **argv)
  4. {
  5.     struct pollfd ufd;
  6.     int nr;
  7.     char tmp[32];
  8.  
  9.         /* Prevent fire-and-forget children from becoming zombies.
  10.          * If we should need to wait() for some children in the future
  11.          * (as opposed to none right now), double-forking here instead
  12.          * of ignoring SIGCHLD may be the better solution.
  13.          */
  14.     signal(SIGCHLD, SIG_IGN);
  15.  
  16.     open_devnull_stdio();
  17.     klog_init();
  18.  
  19.     INFO(“starting ueventd\n”);
  20.  
  21.     /* Respect hardware passed in through the kernel cmd line. Here we will look
  22.      * for androidboot.hardware param in kernel cmdline, and save its value in
  23.      * hardware[]. */
  24.     import_kernel_cmdline(0, import_kernel_nv);
  25.  
  26.     get_hardware_name(hardware, &revision);
  27.  
  28.     ueventd_parse_config_file(/ueventd.rc);
  29.  
  30.     snprintf(tmp, sizeof(tmp),/ueventd.%s.rc, hardware);
  31.     ueventd_parse_config_file(tmp);
  32.  
  33.     device_init();
  34.  
  35.     ufd.events = POLLIN;
  36.     ufd.fd = get_device_fd();
  37.  
  38.     while(1) {
  39.         ufd.revents = 0;
  40.         nr = poll(&ufd, 1, -1);
  41.         if (nr <= 0)
  42.             continue;
  43.         if (ufd.revents == POLLIN)
  44.                handle_device_fd();
  45.     }
  46. }
  47.  
  48. 여기서 중요한 함수는 ueventd_parse_config_file와  device_init함수이다.
  49.  
  50. ueventd_parse_config_file함수는 ueventd.rc파일과 ueventd.%hardware%.rc 파일을 읽어 디바이스 노드 파일을 만드는 정보를 얻는다
  51.  
  52. 여기에 저장되어 있는 정보는 device 이름, permission, gid, uid 이다.
  53.  
  54. 저장되어 있지 않는 device는 디폴트로 600, 0, 0이 세팅된다.
  55.  
  56.  
  57.  
  58. device_init함수는 uevent_socket을 열고 coldboot 함수를 실행한다.
  59.  
  60. 여기서 연 소켓은 uevent를 보낼때 쓰이는 것이 아니라 나중에 발생한 uevent를 받을때 쓰인다.
  61.  
  62. void device_init(void)
  63. {
  64.     suseconds_t t0, t1;
  65.     struct stat info;
  66.     int fd;
  67.  
  68.     /* is 64K enough? udev uses 16MB! */
  69.     device_fd = uevent_open_socket(64*1024, true);
  70.     if(device_fd < 0)
  71.         return;
  72.  
  73.     fcntl(device_fd, F_SETFD, FD_CLOEXEC);
  74.     fcntl(device_fd, F_SETFL, O_NONBLOCK);
  75.  
  76.     if (stat(coldboot_done, &info) < 0) {
  77.         t0 = get_usecs();
  78.         coldboot(/sys/class”);
  79.         coldboot(/sys/block”);
  80.         coldboot(/sys/devices”);
  81.         t1 = get_usecs();
  82.         fd = open(coldboot_done, O_WRONLY|O_CREAT, 0000);
  83.         close(fd);
  84.         log_event_print(“coldboot %ld uS\n”, ((long) (t1 – t0)));
  85.     } else {
  86.         log_event_print(“skipping coldboot, already done\n”);
  87.     }
  88. }
  89.  
  90.  
  91.  
  92. 호출 되는 coldboot는 내부적으로 do_coldboot를 호출한다.
  93.  
  94. static void do_coldboot(DIR *d)
  95. {
  96.     struct dirent *de;
  97.     int dfd, fd;
  98.  
  99.     dfd = dirfd(d);
  100.  
  101.     fd = openat(dfd, “uevent”, O_WRONLY);
  102.     if(fd >= 0) {
  103.         write(fd, “add\n”, 4);
  104.         close(fd);
  105.         handle_device_fd();
  106.     }
  107.  
  108.     while((de = readdir(d))) {
  109.         DIR *d2;
  110.  
  111.         if(de->d_type != DT_DIR || de->d_name[0] == ‘.’)
  112.             continue;
  113.  
  114.         fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY);
  115.         if(fd < 0)
  116.             continue;
  117.  
  118.         d2 = fdopendir(fd);
  119.         if(d2 == 0)
  120.             close(fd);
  121.         else {
  122.             do_coldboot(d2);
  123.             closedir(d2);
  124.         }
  125.     }
  126. }
  127.  
  128. 디바이스 노드를 생성하지 못한 디바이스가 저장한 /sys 밑의 각각의 해당 폴더를 들어가 uevent 파일에 “add” 메시지를 써넣어 강제로 uevent를 발생시킨다
  129.  
  130. 그후  handle_device_fd 함수를 통해 uevent 를 파싱해 디바이스 노드를 만든다. 이 과정에서 ueventd_parse_config_file에서 얻어온 정보를 사용한다.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement