X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Fudevd.c;h=27e64dae3acbb9a8a6d6f3388ac2842686b4e01e;hp=d93781f411dfe07d73be21a629934078a810eaa2;hb=03e0170db3ef69c70db7cd74e6689c7b78c91c3d;hpb=bd284db142c1d3fb6e2a709678c8828c12c52466 diff --git a/udev/udevd.c b/udev/udevd.c index d93781f41..27e64dae3 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -215,6 +215,9 @@ static void event_fork(struct udev_event *event) /* set timeout to prevent hanging processes */ alarm(UDEV_EVENT_TIMEOUT); + /* clear any existing udev watch on the node */ + udev_watch_clear(event->udev, event->dev); + /* apply rules, create node, symlinks */ err = udev_event_execute_rules(event, rules); @@ -226,6 +229,12 @@ static void event_fork(struct udev_event *event) if (err == 0 && !event->ignore_device && udev_get_run(event->udev)) udev_event_execute_run(event); + /* apply/restore inotify watch */ + if (err == 0 && event->inotify_watch && + strcmp(udev_device_get_action(event->dev), "remove") != 0) + info(event->udev, "device will be watched for changes\n"); + udev_watch_begin(event->udev, event->dev); + info(event->udev, "seq %llu exit with %i\n", udev_device_get_seqnum(event->dev), err); logging_close(); if (err != 0) @@ -516,7 +525,6 @@ static int handle_inotify(struct udev *udev) int nbytes, pos; char *buf; struct inotify_event *ev; - int reload_config = 0; if ((ioctl(inotify_fd, FIONREAD, &nbytes) < 0) || (nbytes <= 0)) return 0; @@ -543,7 +551,7 @@ static int handle_inotify(struct udev *udev) char filename[UTIL_PATH_SIZE]; int fd; - info(udev, "device %s closed, synthesising write\n", syspath); + info(udev, "device %s closed, synthesising 'change'\n", syspath); util_strlcpy(filename, syspath, sizeof(filename)); util_strlcat(filename, "/uevent", sizeof(filename)); fd = open(filename, O_WRONLY); @@ -559,7 +567,7 @@ static int handle_inotify(struct udev *udev) } free (buf); - return reload_config; + return 0; } static void asmlinkage sig_handler(int signum) @@ -985,7 +993,7 @@ int main(int argc, char *argv[]) /* rules directory inotify watch */ if (inotify_poll && (inotify_poll->revents & POLLIN)) - reload_config = handle_inotify(udev); + handle_inotify(udev); handle_signals: signal_received = 0;