chiark / gitweb /
reset process priority before executing RUN+=
[elogind.git] / udev / udevd.c
index 170225d00c85457f2fbdb735fb08e405c847190d..77a14df7b07afba30589801bfc068ae8db9283f8 100644 (file)
@@ -168,7 +168,7 @@ static void event_queue_delete(struct event *event)
        udev_list_node_remove(&event->node);
 
        /* mark as failed, if "add" event returns non-zero */
-       if (event->exitcode != 0 && strcmp(udev_device_get_action(event->dev), "add") == 0)
+       if (event->exitcode != 0 && strcmp(udev_device_get_action(event->dev), "remove") != 0)
                udev_queue_export_device_failed(udev_queue_export, event->dev);
        else
                udev_queue_export_device_finished(udev_queue_export, event->dev);
@@ -360,7 +360,7 @@ static void worker_new(struct event *event)
        }
 }
 
-static void event_run(struct event *event)
+static void event_run(struct event *event, bool force)
 {
        struct udev_list_node *loop;
 
@@ -385,7 +385,7 @@ static void event_run(struct event *event)
                return;
        }
 
-       if (childs >= max_childs) {
+       if (!force && childs >= max_childs) {
                info(event->udev, "maximum number (%i) of childs reached\n", childs);
                return;
        }
@@ -420,7 +420,7 @@ static void event_queue_insert(struct udev_device *dev)
 
        /* run all events with a timeout set immediately */
        if (udev_device_get_timeout(dev) > 0) {
-               worker_new(event);
+               event_run(event, true);
                return;
        }
 }
@@ -552,7 +552,7 @@ static void events_start(struct udev *udev)
                        continue;
                }
 
-               event_run(event);
+               event_run(event, false);
        }
 }
 
@@ -685,14 +685,21 @@ static int handle_inotify(struct udev *udev)
 
                ev = (struct inotify_event *)(buf + pos);
                if (ev->len) {
-                       dbg(udev, "inotify event: %x for %s\n", ev->mask, ev->name);
+                       const char *s;
+
+                       info(udev, "inotify event: %x for %s\n", ev->mask, ev->name);
+                       s = strstr(ev->name, ".rules");
+                       if (s == NULL)
+                               continue;
+                       if (strlen(s) != strlen(".rules"))
+                               continue;
                        reload_config = true;
                        continue;
                }
 
                dev = udev_watch_lookup(udev, ev->wd);
                if (dev != NULL) {
-                       dbg(udev, "inotify event: %x for %s\n", ev->mask, udev_device_get_devnode(dev));
+                       info(udev, "inotify event: %x for %s\n", ev->mask, udev_device_get_devnode(dev));
                        if (ev->mask & IN_CLOSE_WRITE) {
                                char filename[UTIL_PATH_SIZE];
                                int fd;
@@ -887,15 +894,15 @@ int main(int argc, char *argv[])
 
        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);
+                                 IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
        } else {
                char filename[UTIL_PATH_SIZE];
                struct stat statbuf;
 
                inotify_add_watch(pfd[FD_INOTIFY].fd, LIBEXECDIR "/rules.d",
-                                 IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+                                 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);
+                                 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);
@@ -906,7 +913,7 @@ int main(int argc, char *argv[])
                        udev_selinux_resetfscreatecon(udev);
                }
                inotify_add_watch(pfd[FD_INOTIFY].fd, filename,
-                                 IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+                                 IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
        }
        udev_watch_restore(udev);