chiark / gitweb /
udev_event_run() -> udev_event_execute_rules()
[elogind.git] / udev / udevd.c
index 5388961c42d468646bab1b4050eecedf1a8ca2e9..111f1200062de5d05f3a191323654edd5b2025d7 100644 (file)
@@ -58,7 +58,7 @@ static void log_fn(struct udev *udev, int priority,
 }
 
 static int debug_trace;
-static struct udev_rules rules;
+static struct udev_rules *rules;
 static struct udev_ctrl *udev_ctrl;
 static struct udev_monitor *kernel_monitor;
 static int inotify_fd = -1;
@@ -108,8 +108,8 @@ static void export_event_state(struct udev_event *event, enum event_state state)
 
        switch (state) {
        case EVENT_QUEUED:
-               unlink(filename_failed);
-               delete_path(event->udev, filename_failed);
+               if(unlink(filename_failed) == 0)
+                       delete_path(event->udev, filename_failed);
                create_path(event->udev, filename);
                udev_selinux_setfscreatecon(event->udev, filename, S_IFLNK);
                symlink(udev_device_get_devpath(event->dev), filename);
@@ -130,12 +130,15 @@ static void export_event_state(struct udev_event *event, enum event_state state)
                                info(event->udev, "renamed devpath, moved failed state of '%s' to %s'\n",
                                     udev_device_get_devpath_old(event->dev), udev_device_get_devpath(event->dev));
                } else {
-                       unlink(filename_failed);
-                       delete_path(event->udev, filename_failed);
+                       if (unlink(filename_failed) == 0)
+                               delete_path(event->udev, filename_failed);
                }
 
                unlink(filename);
-               delete_path(event->udev, filename);
+
+               /* clean up possibly empty queue directory */
+               if (udev_list_is_empty(&exec_list) && udev_list_is_empty(&running_list))
+                       delete_path(event->udev, filename);
                break;
        case EVENT_FAILED:
                /* move failed event to the failed directory */
@@ -143,7 +146,8 @@ static void export_event_state(struct udev_event *event, enum event_state state)
                rename(filename, filename_failed);
 
                /* clean up possibly empty queue directory */
-               delete_path(event->udev, filename);
+               if (udev_list_is_empty(&exec_list) && udev_list_is_empty(&running_list))
+                       delete_path(event->udev, filename);
                break;
        }
 
@@ -208,7 +212,7 @@ static void event_fork(struct udev_event *event)
                alarm(UDEV_EVENT_TIMEOUT);
 
                /* apply rules, create node, symlinks */
-               err = udev_event_run(event, &rules);
+               err = udev_event_execute_rules(event, rules);
 
                /* rules may change/disable the timeout */
                if (udev_device_get_event_timeout(event->dev) >= 0)
@@ -748,9 +752,13 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
+       rules = udev_rules_new(udev, 1);
+       if (rules == NULL) {
+               err(udev, "error reading rules\n");
+               goto exit;
+       }
        udev_list_init(&running_list);
        udev_list_init(&exec_list);
-       udev_rules_init(udev, &rules, 1);
        export_initial_seqnum(udev);
 
        if (daemonize) {
@@ -934,9 +942,14 @@ int main(int argc, char *argv[])
 
                /* rules changed, set by inotify or a HUP signal */
                if (reload_config) {
+                       struct udev_rules *rules_new;
+
                        reload_config = 0;
-                       udev_rules_cleanup(&rules);
-                       udev_rules_init(udev, &rules, 1);
+                       rules_new = udev_rules_new(udev, 1);
+                       if (rules_new != NULL) {
+                               udev_rules_unref(rules);
+                               rules = rules_new;
+                       }
                }
 
                if (sigchilds_waiting) {
@@ -953,7 +966,7 @@ int main(int argc, char *argv[])
        rc = 0;
 
 exit:
-       udev_rules_cleanup(&rules);
+       udev_rules_unref(rules);
 
        if (signal_pipe[READ_END] >= 0)
                close(signal_pipe[READ_END]);