chiark / gitweb /
[PATCH] D-BUS patch for udev-008
[elogind.git] / udev-remove.c
index d42ed4be78033198adfb598268fb1fb065af58a3..307b907c8897be44a99122adbeca131c8e05e1b8 100644 (file)
@@ -100,6 +100,42 @@ static int delete_node(struct udevice *dev)
        return retval;
 }
 
+#ifdef USE_DBUS
+/** Send out a signal that a device node is deleted
+ *
+ *  @param  name                Name of the device node, e.g. /udev/sda1
+ *  @param  path                Sysfs path of device
+ */
+static void sysbus_send_remove(const char* name, const char *path)
+{
+        char filename[255];
+        DBusMessage* message;
+        DBusMessageIter iter;
+
+        if (sysbus_connection == NULL)
+                return;
+
+        strncpy(filename, udev_root, sizeof(filename));
+        strncat(filename, name, sizeof(filename));
+
+        /* object, interface, member */
+        message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", 
+                                          "org.kernel.udev.NodeMonitor",
+                                          "NodeDeleted");
+        
+        dbus_message_iter_init(message, &iter);
+        dbus_message_iter_append_string(&iter, filename);
+        dbus_message_iter_append_string(&iter, path);
+        
+        if ( !dbus_connection_send(sysbus_connection, message, NULL) )
+                dbg("error sending d-bus signal");
+        
+        dbus_message_unref(message);
+
+        dbus_connection_flush(sysbus_connection);
+}
+#endif /* USE_DBUS */
+
 /*
  * Look up the sysfs path in the database to see if we have named this device
  * something different from the kernel name.  If we have, us it.  If not, use
@@ -122,5 +158,10 @@ int udev_remove_device(char *path, char *subsystem)
 
        dbg("name is '%s'", dev->name);
        udevdb_delete_dev(path);
+
+#ifdef USE_DBUS
+       sysbus_send_remove(name, device);
+#endif /* USE_DBUS */
+  
        return delete_node(dev);
 }