]> git.ozlabs.org Git - petitboot/blobdiff - devices/udev-helper.c
Don't block udev if udev-helper sleeps
[petitboot] / devices / udev-helper.c
index 1db8a26d6beb9025903e768356742fc9b9fdf0d5..d70a1d716718e1ea4d6e3e88eb13140a6ddb5389 100644 (file)
@@ -372,6 +372,8 @@ enum generic_icon_type guess_device_type(void)
        const char *bus = getenv("ID_BUS");
        if (type && streq(type, "cd"))
                return ICON_TYPE_OPTICAL;
+       if (!bus)
+               return ICON_TYPE_UNKNOWN;
        if (streq(bus, "usb"))
                return ICON_TYPE_USB;
        if (streq(bus, "ata") || streq(bus, "scsi"))
@@ -415,6 +417,31 @@ static int found_new_device(const char *dev_path)
        return EXIT_SUCCESS;
 }
 
+static void detach_and_sleep(int sec)
+{
+       static int forked = 0;
+       int rc = 0;
+
+       if (sec <= 0)
+               return;
+
+       if (!forked) {
+               log("running in background...");
+               rc = fork();
+               forked = 1;
+       }
+
+       if (rc == 0) {
+               sleep(sec);
+
+       } else if (rc == -1) {
+               perror("fork()");
+               exit(EXIT_FAILURE);
+       } else {
+               exit(EXIT_SUCCESS);
+       }
+}
+
 static int poll_device_plug(const char *dev_path,
                            int *optical)
 {
@@ -437,7 +464,7 @@ static int poll_device_plug(const char *dev_path,
                        return EXIT_SUCCESS;
 
                printf("no... waiting\n");
-               sleep(REMOVABLE_SLEEP_DELAY);
+               detach_and_sleep(REMOVABLE_SLEEP_DELAY);
        }
 
        /* Fall back to bare open() */
@@ -451,7 +478,7 @@ static int poll_device_plug(const char *dev_path,
                if (fd >= 0)
                        return EXIT_SUCCESS;
                printf("no... waiting\n");
-               sleep(REMOVABLE_SLEEP_DELAY);
+               detach_and_sleep(REMOVABLE_SLEEP_DELAY);
        }
 }
 
@@ -469,7 +496,7 @@ static int poll_device_unplug(const char *dev_path, int optical)
                if (rc != CDS_DISC_OK)
                        return EXIT_SUCCESS;
                printf("no... waiting\n");
-               sleep(REMOVABLE_SLEEP_DELAY);
+               detach_and_sleep(REMOVABLE_SLEEP_DELAY);
        }
 
        /* Fall back to bare open() */
@@ -482,7 +509,7 @@ static int poll_device_unplug(const char *dev_path, int optical)
                if (fd < 0)
                        return EXIT_SUCCESS;
                printf("no... waiting\n");
-               sleep(REMOVABLE_SLEEP_DELAY);
+               detach_and_sleep(REMOVABLE_SLEEP_DELAY);
        }
 }
 
@@ -505,7 +532,7 @@ static int poll_removable_device(const char *sysfs_path,
                /* Unmount it repeatedly, if needs be */
                while (mounted && !unmount_device(dev_path))
                        ;
-               sleep(1);
+               detach_and_sleep(1);
        }
 }
 
@@ -514,9 +541,6 @@ int main(int argc, char **argv)
        char *dev_path, *action;
        int rc;
 
-       /*if (fork())
-               return EXIT_SUCCESS;
-               */
        action = getenv("ACTION");
 
        logf = stdout;