diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2010-04-07 11:32:22 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2010-04-07 11:32:22 +0200 |
commit | d45c8c8b01c99180f15e24b22f7cf81eaf3cdd1b (patch) | |
tree | 53317001fa4630d627521cb0d16578df1148cf74 /extras | |
parent | cccfffbe04c01be12fb42cb12f3f7aa5e2a22dd4 (diff) |
cdrom_id: check mount state in retry loop
Based on a patch from Harald Hoyer.
Diffstat (limited to 'extras')
-rw-r--r-- | extras/cdrom_id/cdrom_id.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/extras/cdrom_id/cdrom_id.c b/extras/cdrom_id/cdrom_id.c index 7c9f8cc73e..894a890574 100644 --- a/extras/cdrom_id/cdrom_id.c +++ b/extras/cdrom_id/cdrom_id.c @@ -547,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(); @@ -592,21 +593,16 @@ int main(int argc, char *argv[]) goto exit; } - if (is_mounted(node)) { - fd = open(node, O_RDONLY|O_NONBLOCK); - } else { - int cnt; + srand((unsigned int)getpid()); + for (cnt = 20; cnt > 0; cnt--) { struct timespec duration; - srand((unsigned int)getpid()); - for (cnt = 40; cnt > 0; cnt--) { - fd = open(node, O_RDONLY|O_NONBLOCK|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); - } + 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); |