chiark / gitweb /
[PATCH] first cut at standalone udev_dbus program.
[elogind.git] / udev_dbus.c
index 947a5c1b5da171ce9226ab8bea319a10d98127df..a031a41101d4c198b3fdcc75f3bd2b32b24d083f 100644 (file)
 #include "udev.h"
 #include "udev_version.h"
 #include "udev_dbus.h"
+#include "logging.h"
 
+#ifdef LOG
+unsigned char logname[LOGNAME_SIZE];
+void log_message(int level, const char *format, ...)
+{
+       va_list args;
+
+       if (!udev_log)
+               return;
+
+       va_start(args, format);
+       vsyslog(level, format, args);
+       va_end(args);
+}
+#endif
 
 /** variable for the connection the to system message bus or #NULL
  *  if we cannot connect or acquire the org.kernel.udev service
@@ -20,7 +35,7 @@
 static DBusConnection* sysbus_connection;
 
 /** Disconnect from the system message bus */
-void sysbus_disconnect(void)
+static void sysbus_disconnect(void)
 {
        if (sysbus_connection == NULL)
                return;
@@ -30,7 +45,7 @@ void sysbus_disconnect(void)
 }
 
 /** Connect to the system message bus */
-void sysbus_connect(void)
+static void sysbus_connect(void)
 {
        DBusError error;
 
@@ -67,28 +82,21 @@ void sysbus_connect(void)
 
 /** Send out a signal that a device node is created
  *
- *  @param  dev                 udevice object
+ *  @param  devnode             name of the device node, e.g. /dev/sda1
  *  @param  path                Sysfs path of device
  */
-void sysbus_send_create(struct udevice *dev, const char *path)
+static void sysbus_send_create(const char *devnode, const char *path)
 {
-       char filename[255];
        DBusMessage* message;
        DBusMessageIter iter;
 
-       if (sysbus_connection == NULL)
-               return;
-
-       strncpy(filename, udev_root, sizeof(filename));
-       strncat(filename, dev->name, sizeof(filename));
-
        /* object, interface, member */
        message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", 
                                          "org.kernel.udev.NodeMonitor",
                                          "NodeCreated");
 
        dbus_message_iter_init(message, &iter);
-       dbus_message_iter_append_string(&iter, filename);
+       dbus_message_iter_append_string(&iter, devnode);
        dbus_message_iter_append_string(&iter, path);
 
        if ( !dbus_connection_send(sysbus_connection, message, NULL) )
@@ -101,28 +109,21 @@ void sysbus_send_create(struct udevice *dev, const char *path)
 
 /** Send out a signal that a device node is deleted
  *
- *  @param  name                Name of the device node, e.g. /udev/sda1
+ *  @param  devnode             Name of the device node, e.g. /udev/sda1
  *  @param  path                Sysfs path of device
  */
-void sysbus_send_remove(const char* name, const char *path)
+static void sysbus_send_remove(const char *devnode, 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, devnode);
        dbus_message_iter_append_string(&iter, path);
 
        if ( !dbus_connection_send(sysbus_connection, message, NULL) )
@@ -132,3 +133,48 @@ void sysbus_send_remove(const char* name, const char *path)
 
        dbus_connection_flush(sysbus_connection);
 }
+
+int main(int argc, char *argv[], char *envp[])
+{
+       char *action;
+       char *devpath;
+       char *devnode;
+       int retval = 0;
+
+       init_logging("udev_dbus");
+
+       sysbus_connect();
+       if (sysbus_connection == NULL)
+               return;
+
+       action = get_action();
+       if (!action) {
+               dbg("no action?");
+               goto exit;
+       }
+       devpath = get_devpath();
+       if (!devpath) {
+               dbg("no devpath?");
+               goto exit;
+       }
+       devnode = get_devnode();
+       if (!devnode) {
+               dbg("no devnode?");
+               goto exit;
+       }
+
+       if (strcmp(action, "add") == 0) {
+               sysbus_send_create(devnode, devpath);
+       } else {
+               if (strcmp(action, "remove") == 0) {
+                       sysbus_send_remove(devnode, devpath);
+               } else {
+                       dbg("unknown action '%s'", action);
+                       retval = -EINVAL;
+               }
+       }
+
+exit:
+       sysbus_disconnect();
+       return retval;
+}