+ udev_monitor_set_receive_buffer_size(monitor, 128*1024*1024);
+ pfd[FD_NETLINK].fd = udev_monitor_get_fd(monitor);
+
+ pfd[FD_INOTIFY].fd = udev_watch_init(udev);
+ if (pfd[FD_INOTIFY].fd < 0) {
+ fprintf(stderr, "error initializing inotify\n");
+ err(udev, "error initializing inotify\n");
+ rc = 4;
+ goto exit;
+ }
+
+ if (udev_get_rules_path(udev) != NULL) {
+ inotify_add_watch(pfd[FD_INOTIFY].fd, udev_get_rules_path(udev),
+ IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+ } else {
+ char filename[UTIL_PATH_SIZE];
+
+ inotify_add_watch(pfd[FD_INOTIFY].fd, UDEV_PREFIX "/lib/udev/rules.d",
+ IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+ inotify_add_watch(pfd[FD_INOTIFY].fd, SYSCONFDIR "/udev/rules.d",
+ IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+
+ /* watch dynamic rules directory */
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/rules.d", NULL);
+ inotify_add_watch(pfd[FD_INOTIFY].fd, filename,
+ IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+ }
+ udev_watch_restore(udev);
+
+ /* block and listen to all signals on signalfd */
+ sigfillset(&mask);
+ sigprocmask(SIG_SETMASK, &mask, NULL);
+ pfd[FD_SIGNAL].fd = signalfd(-1, &mask, 0);
+ if (pfd[FD_SIGNAL].fd < 0) {
+ fprintf(stderr, "error getting signalfd\n");
+ err(udev, "error getting signalfd\n");
+ rc = 5;
+ goto exit;
+ }
+
+ /* unnamed socket from workers to the main daemon */
+ if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, worker_watch) < 0) {
+ fprintf(stderr, "error getting socketpair\n");
+ err(udev, "error getting socketpair\n");
+ rc = 6;
+ goto exit;
+ }
+ pfd[FD_WORKER].fd = worker_watch[READ_END];
+ util_set_fd_cloexec(worker_watch[WRITE_END]);