chiark / gitweb /
[PATCH] add support for /devices-devices without any file to wait for
[elogind.git] / namedev.c
index d63e36e18a05b3e2c1ca9c5c689842d8c1779e89..69669709df9ef37211525a6bfd8d0527a2797e64 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -40,7 +40,7 @@
 #include "udev_version.h"
 #include "logging.h"
 #include "namedev.h"
-#include "udevdb.h"
+#include "udev_db.h"
 
 static struct sysfs_attribute *find_sysfs_attribute(struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device, char *attr);
 
@@ -194,7 +194,7 @@ static int find_free_number(struct udevice *udev, const char *name)
        while (1) {
                dbg("look for existing node '%s'", filename);
                memset(&db_udev, 0x00, sizeof(struct udevice));
-               if (udevdb_get_dev_byname(&db_udev, filename) != 0) {
+               if (udev_db_get_device_byname(&db_udev, filename) != 0) {
                        dbg("free num=%d", num);
                        return num;
                }
@@ -204,7 +204,7 @@ static int find_free_number(struct udevice *udev, const char *name)
                        info("find_free_number gone crazy (num=%d), aborted", num);
                        return -1;
                }
-               snprintf(filename, NAME_SIZE-1, "%s%d", name, num);
+               snprintf(filename, NAME_SIZE, "%s%d", name, num);
                filename[NAME_SIZE-1] = '\0';
        }
 }
@@ -358,7 +358,7 @@ static void fix_kernel_name(struct udevice *udev)
        }
 }
 
-static int execute_program(const char *path, char *value, int len)
+static int execute_program(struct udevice *udev, const char *path, char *value, int len)
 {
        int retval;
        int count;
@@ -391,7 +391,7 @@ static int execute_program(const char *path, char *value, int len)
                dbg("execute '%s' with parsed arguments", arg);
        } else {
                argv[0] = arg;
-               argv[1] = main_argv[1];
+               argv[1] = udev->subsystem;
                argv[2] = NULL;
                dbg("execute '%s' with subsystem '%s' argument", arg, argv[1]);
        }
@@ -604,7 +604,7 @@ static int match_rule(struct config_device *dev, struct sysfs_class_device *clas
                        }
                }
 
-               /* check for matching kernel name*/
+               /* check for matching kernel name */
                if (dev->kernel[0] != '\0') {
                        dbg("check for " FIELD_KERNEL " dev->kernel='%s' class_dev->name='%s'", dev->kernel, class_dev->name);
                        if (strcmp_pattern(dev->kernel, class_dev->name) != 0) {
@@ -615,6 +615,28 @@ static int match_rule(struct config_device *dev, struct sysfs_class_device *clas
                        }
                }
 
+               /* check for matching subsystem */
+               if (dev->subsystem[0] != '\0') {
+                       dbg("check for " FIELD_SUBSYSTEM " dev->subsystem='%s' class_dev->name='%s'", dev->subsystem, class_dev->name);
+                       if (strcmp_pattern(dev->subsystem, udev->subsystem) != 0) {
+                               dbg(FIELD_SUBSYSTEM " is not matching");
+                               goto try_parent;
+                       } else {
+                               dbg(FIELD_SUBSYSTEM " matches");
+                       }
+               }
+
+               /* check for matching driver */
+               if (dev->driver[0] != '\0') {
+                       dbg("check for " FIELD_DRIVER " dev->driver='%s' sysfs_device->driver_name='%s'", dev->driver, sysfs_device->driver_name);
+                       if (strcmp_pattern(dev->driver, sysfs_device->driver_name) != 0) {
+                               dbg(FIELD_DRIVER " is not matching");
+                               goto try_parent;
+                       } else {
+                               dbg(FIELD_DRIVER " matches");
+                       }
+               }
+
                /* check for matching bus id */
                if (dev->id[0] != '\0') {
                        dbg("check " FIELD_ID);
@@ -655,7 +677,7 @@ static int match_rule(struct config_device *dev, struct sysfs_class_device *clas
                        dbg("check " FIELD_PROGRAM);
                        strfieldcpy(program, dev->program);
                        apply_format(udev, program, sizeof(program), class_dev, sysfs_device);
-                       if (execute_program(program, udev->program_result, NAME_SIZE) != 0) {
+                       if (execute_program(udev, program, udev->program_result, NAME_SIZE) != 0) {
                                dbg(FIELD_PROGRAM " returned nonzero");
                                goto try_parent;
                        } else {
@@ -785,6 +807,7 @@ found:
                goto done;
 
        udev->partitions = dev->partitions;
+       udev->ignore_remove = dev->ignore_remove;
 
        /* get permissions given in rule */
        set_empty_perms(udev, dev->mode,