chiark / gitweb /
fix default-name handling and NAME="" rules
[elogind.git] / udev.c
diff --git a/udev.c b/udev.c
index 3eb788f4c12ecfa08e32694e75dcec395c71f03c..d44f73081d2f7606a4a9220be0d782f601b17ce1 100644 (file)
--- a/udev.c
+++ b/udev.c
@@ -68,6 +68,7 @@ static void asmlinkage sig_handler(int signum)
 int main(int argc, char *argv[], char *envp[])
 {
        struct udevice udev;
+       struct udev_rules rules;
        char path[PATH_SIZE];
        const char *error;
        const char *action;
@@ -95,7 +96,7 @@ int main(int argc, char *argv[], char *envp[])
        sigaction(SIGTERM, &act, NULL);
 
        /* trigger timeout to prevent hanging processes */
-       alarm(ALARM_TIMEOUT);
+       alarm(UDEV_ALARM_TIMEOUT);
 
        action = getenv("ACTION");
        devpath = getenv("DEVPATH");
@@ -109,7 +110,7 @@ int main(int argc, char *argv[], char *envp[])
                goto exit;
        }
 
-       /* export log_level , as called programs may want to do the same as udev */
+       /* export log_priority , as called programs may want to do the same as udev */
        if (udev_log_priority) {
                char priority[32];
 
@@ -118,7 +119,7 @@ int main(int argc, char *argv[], char *envp[])
        }
 
        udev_init_device(&udev, devpath, subsystem, action);
-       udev_rules_init();
+       udev_rules_init(&rules, 0);
 
        if (udev.type == DEV_BLOCK || udev.type == DEV_CLASS || udev.type == DEV_NET) {
                /* handle device node */
@@ -143,7 +144,7 @@ int main(int argc, char *argv[], char *envp[])
 
                        if (udev.type == DEV_NET || udev.devt) {
                                /* name device */
-                               udev_rules_get_name(&udev, class_dev);
+                               udev_rules_get_name(&rules, &udev, class_dev);
                                if (udev.ignore_device) {
                                        info("device event will be ignored");
                                        goto cleanup;
@@ -157,7 +158,7 @@ int main(int argc, char *argv[], char *envp[])
                                retval = udev_add_device(&udev, class_dev);
                        } else {
                                dbg("no dev-file found");
-                               udev_rules_get_run(&udev, NULL);
+                               udev_rules_get_run(&rules, &udev, NULL);
                                if (udev.ignore_device) {
                                        info("device event will be ignored");
                                        goto cleanup;
@@ -166,7 +167,7 @@ int main(int argc, char *argv[], char *envp[])
                        sysfs_close_class_device(class_dev);
                } else if (strcmp(action, "remove") == 0) {
                        dbg("node remove");
-                       udev_rules_get_run(&udev, NULL);
+                       udev_rules_get_run(&rules, &udev, NULL);
                        if (udev.ignore_device) {
                                dbg("device event will be ignored");
                                goto cleanup;
@@ -179,34 +180,32 @@ int main(int argc, char *argv[], char *envp[])
                /* export name of device node or netif */
                if (udev.devname[0] != '\0')
                        setenv("DEVNAME", udev.devname, 1);
-       } else if (udev.type == DEV_DEVICE) {
-               if (strcmp(action, "add") == 0) {
-                       struct sysfs_device *devices_dev;
-
-                       /* wait for sysfs of /sys/devices/ */
-                       dbg("devices add");
-                       snprintf(path, sizeof(path), "%s%s", sysfs_path, devpath);
-                       path[sizeof(path)-1] = '\0';
-                       devices_dev = wait_devices_device_open(path);
-                       if (!devices_dev) {
-                               dbg("devices device unavailable (probably remove has beaten us)");
-                               goto run;
-                       }
-                       dbg("devices device opened '%s'", path);
-                       wait_for_devices_device(devices_dev, &error);
-                       udev_rules_get_run(&udev, devices_dev);
-                       sysfs_close_device(devices_dev);
-                       if (udev.ignore_device) {
-                               info("device event will be ignored");
-                               goto cleanup;
-                       }
-               } else if (strcmp(action, "remove") == 0) {
-                       dbg("devices remove");
-                       udev_rules_get_run(&udev, NULL);
-                       if (udev.ignore_device) {
-                               info("device event will be ignored");
-                               goto cleanup;
-                       }
+       } else if (udev.type == DEV_DEVICE && strcmp(action, "add") == 0) {
+               struct sysfs_device *devices_dev;
+
+               /* wait for sysfs of /sys/devices/ */
+               dbg("devices add");
+               snprintf(path, sizeof(path), "%s%s", sysfs_path, devpath);
+               path[sizeof(path)-1] = '\0';
+               devices_dev = wait_devices_device_open(path);
+               if (!devices_dev) {
+                       dbg("devices device unavailable (probably remove has beaten us)");
+                       goto run;
+               }
+               dbg("devices device opened '%s'", path);
+               wait_for_devices_device(devices_dev, &error);
+               udev_rules_get_run(&rules, &udev, devices_dev);
+               sysfs_close_device(devices_dev);
+               if (udev.ignore_device) {
+                       info("device event will be ignored");
+                       goto cleanup;
+               }
+       } else {
+               dbg("default handling");
+               udev_rules_get_run(&rules, &udev, NULL);
+               if (udev.ignore_device) {
+                       info("device event will be ignored");
+                       goto cleanup;
                }
        }
 
@@ -216,7 +215,7 @@ run:
 
                dbg("executing run list");
                list_for_each_entry(name_loop, &udev.run_list, node)
-                       execute_command(name_loop->name, udev.subsystem);
+                       execute_program(name_loop->name, udev.subsystem, NULL, 0, NULL);
        }
 
 cleanup: