chiark / gitweb /
replace "add|change" with "!remove"
[elogind.git] / extras / cdrom_id / cdrom_id.c
index 036ef284bf89a25b7783d837a48bba0d3dc6f0c1..894a8905749e90c203fcbe41d6a06e09a7a868dc 100644 (file)
@@ -30,6 +30,7 @@
 #include <fcntl.h>
 #include <errno.h>
 #include <getopt.h>
+#include <time.h>
 #include <scsi/sg.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -546,6 +547,7 @@ int main(int argc, char *argv[])
        const char *node = NULL;
        int export = 0;
        int fd = -1;
+       int cnt;
        int rc = 0;
 
        udev = udev_new();
@@ -591,7 +593,17 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       fd = open(node, O_RDONLY|O_NONBLOCK|(is_mounted(node) ? 0 : O_EXCL));
+       srand((unsigned int)getpid());
+       for (cnt = 20; cnt > 0; cnt--) {
+               struct timespec duration;
+
+               fd = open(node, O_RDONLY|O_NONBLOCK|(is_mounted(node) ? 0 : O_EXCL));
+               if (fd >= 0 || errno != EBUSY)
+                       break;
+               duration.tv_sec = 0;
+               duration.tv_nsec = (100 * 1000 * 1000) + (rand() % 100 * 1000 * 1000);
+               nanosleep(&duration, NULL);
+       }
        if (fd < 0) {
                info(udev, "unable to open '%s'\n", node);
                fprintf(stderr, "unable to open '%s'\n", node);