chiark / gitweb /
send monitor events back to netlink socket
[elogind.git] / udev / udevd.c
index ee3d6f50338600db3608ce4d49a8408bc62b3c19..d9de26ea6cc705e8912bebc897ae3451f8d021fc 100644 (file)
@@ -1,6 +1,8 @@
 /*
  * Copyright (C) 2004-2008 Kay Sievers <kay.sievers@vrfy.org>
  * Copyright (C) 2004 Chris Friesen <chris_friesen@sympatico.ca>
+ * Copyright (C) 2009 Canonical Ltd.
+ * Copyright (C) 2009 Scott James Remnant <scott@netsplit.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,6 +71,7 @@ static volatile int sigchilds_waiting;
 static volatile int udev_exit;
 static volatile int reload_config;
 static volatile int signal_received;
+static volatile pid_t settle_pid;
 static int run_exec_q;
 static int stop_exec_q;
 static int max_childs;
@@ -192,7 +195,6 @@ static void event_fork(struct udev_event *event)
        switch (pid) {
        case 0:
                /* child */
-               udev_monitor_unref(kernel_monitor);
                udev_ctrl_unref(udev_ctrl);
                logging_close();
                logging_init("udevd-event");
@@ -232,6 +234,9 @@ static void event_fork(struct udev_event *event)
                        udev_device_update_db(event->dev);
                }
 
+               /* send processed event back to the kernel netlink socket */
+               udev_monitor_send_device(kernel_monitor, event->dev);
+
                info(event->udev, "seq %llu exit with %i\n", udev_device_get_seqnum(event->dev), err);
                logging_close();
                if (err != 0)
@@ -513,6 +518,11 @@ static void handle_ctrl_msg(struct udev_ctrl *uctrl)
                info(udev, "udevd message (SET_MAX_CHILDS) received, max_childs=%i\n", i);
                max_childs = i;
        }
+
+       settle_pid = udev_ctrl_get_settle(ctrl_msg);
+       if (settle_pid > 0) {
+               info(udev, "udevd message (SETTLE) received\n");
+       }
        udev_ctrl_msg_unref(ctrl_msg);
 }
 
@@ -803,7 +813,7 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       kernel_monitor = udev_monitor_new_from_netlink(udev);
+       kernel_monitor = udev_monitor_new_from_netlink(udev, UDEV_MONITOR_KERNEL);
        if (kernel_monitor == NULL || udev_monitor_enable_receiving(kernel_monitor) < 0) {
                fprintf(stderr, "error initializing netlink socket\n");
                err(udev, "error initializing netlink socket\n");
@@ -1023,6 +1033,11 @@ handle_signals:
                        if (!stop_exec_q)
                                event_queue_manager(udev);
                }
+
+               if (settle_pid > 0) {
+                       kill(settle_pid, SIGUSR1);
+                       settle_pid = 0;
+               }
        }
        cleanup_queue_dir(udev);
        rc = 0;