cvsdist edd851
--- cdparanoia-III-alpha9.8/interface/scan_devices.c.O_EXCL	2001-03-26 00:44:01.000000000 -0500
cvsdist edd851
+++ cdparanoia-III-alpha9.8/interface/scan_devices.c	2003-05-20 14:33:16.000000000 -0400
cvsdist edd851
@@ -148,7 +148,7 @@
cvsdist edd851
 
cvsdist edd851
   cdrom_drive *d=NULL;
cvsdist edd851
   struct stat st;
cvsdist edd851
-  int fd=-1;
cvsdist edd851
+  int fd=-1, i;
cvsdist edd851
   int type;
cvsdist edd851
   char *description=NULL;
cvsdist edd851
   char *device;
cvsdist edd851
@@ -180,7 +180,12 @@
cvsdist edd851
     /* Yay, ATAPI... */
cvsdist edd851
     /* Ping for CDROM-ness */
cvsdist edd851
     
cvsdist edd851
-    fd=open(device,O_RDONLY|O_NONBLOCK);
cvsdist edd851
+    fd=open(device,O_RDONLY|O_NONBLOCK|O_EXCL);
cvsdist edd851
+    for (i = 0; (i<10) && (fd == -1); i++) {
cvsdist edd851
+      fprintf(stderr, "Error trying to open %s exclusively (%s). retrying in 1 second.\n", device, strerror(errno));
cvsdist edd851
+      usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0));
cvsdist edd851
+      fd = open(device,O_RDONLY|O_NONBLOCK|O_EXCL);
cvsdist edd851
+    }
cvsdist edd851
     if(fd==-1){
cvsdist edd851
       idperror(messagedest,messages,"\t\tUnable to open %s",device);
cvsdist edd851
       free(device);
cvsdist edd851
@@ -250,14 +255,6 @@
cvsdist edd851
     return(NULL);
cvsdist edd851
   }
cvsdist edd851
 
cvsdist edd851
-  if(fd==-1)fd=open(device,O_RDONLY|O_NONBLOCK);
cvsdist edd851
-  if(fd==-1){
cvsdist edd851
-    idperror(messagedest,messages,"\t\tUnable to open %s",device);
cvsdist edd851
-    free(device);
cvsdist edd851
-    if(description)free(description);
cvsdist edd851
-    return(NULL);
cvsdist edd851
-  }
cvsdist edd851
-  
cvsdist edd851
   /* Minimum init */
cvsdist edd851
   
cvsdist edd851
   d=calloc(1,sizeof(cdrom_drive));
cvsdist edd851
@@ -311,12 +308,19 @@
cvsdist edd851
 			char *devfs_test,
cvsdist edd851
 			char *devfs_other,
cvsdist edd851
 			char *prompt,int messagedest,char **messages){
cvsdist edd851
-  int dev=open(device,O_RDONLY|O_NONBLOCK);
cvsdist edd851
+  int dev=-1;
cvsdist edd851
   scsiid a,b;
cvsdist edd851
 
cvsdist edd851
   int i,j;
cvsdist edd851
   char buffer[200];
cvsdist edd851
 
cvsdist edd851
+  dev=open(device,O_RDONLY|O_NONBLOCK|O_EXCL);
cvsdist edd851
+  for (i = 0; (i<10) && (dev == -1); i++) {
cvsdist edd851
+    fprintf(stderr, "Error trying to open %s exclusively (%s). retrying in 1 second.\n", device, strerror(errno));
cvsdist edd851
+    usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0));
cvsdist edd851
+    dev = open(device,O_RDONLY|O_NONBLOCK|O_EXCL);
cvsdist edd851
+  }
cvsdist edd851
+
cvsdist edd851
   /* if we're running under /devfs, build the device name from the
cvsdist edd851
      device we already have */
cvsdist edd851
   if(!strncmp(device,devfs_test,strlen(devfs_test))){
cvsdist edd851
@@ -327,6 +331,11 @@
cvsdist edd851
       int matchf;
cvsdist edd851
       sprintf(pos,"/%s",devfs_other);
cvsdist edd851
       matchf=open(buffer,O_RDONLY|O_NONBLOCK);
cvsdist edd851
+      for (i = 0; (i<10) && (matchf==-1); i++) {
cvsdist edd851
+        fprintf(stderr, "Error trying to open %s exclusively (%s). retrying in 1 seconds.\n", buffer, strerror(errno));
cvsdist edd851
+        usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0));
cvsdist edd851
+        matchf = open(buffer,O_RDONLY|O_NONBLOCK);
cvsdist edd851
+      }
cvsdist edd851
       if(matchf!=-1){
cvsdist edd851
 	close(matchf);
cvsdist edd851
 	close(dev);
cvsdist edd851
@@ -353,7 +362,7 @@
cvsdist edd851
   for(i=0;i<25;i++){
cvsdist edd851
     for(j=0;j<2;j++){
cvsdist edd851
       int pattern=0;
cvsdist edd851
-      int matchf;
cvsdist edd851
+      int matchf, k;
cvsdist edd851
       
cvsdist edd851
       while(prefixes[pattern]!=NULL){
cvsdist edd851
 	switch(j){
cvsdist edd851
@@ -368,6 +377,12 @@
cvsdist edd851
 	}
cvsdist edd851
 	
cvsdist edd851
 	matchf=open(buffer,O_RDONLY|O_NONBLOCK);
cvsdist edd851
+	for (k = 0; (k<10) && (matchf==-1); k++) {
cvsdist edd851
+	  fprintf(stderr, "Error trying to open %s exclusively (%s). retrying in 1 second.\n", buffer, strerror(errno));
cvsdist edd851
+	  usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0));
cvsdist edd851
+	  matchf=open(buffer,O_RDONLY|O_NONBLOCK);
cvsdist edd851
+	}
cvsdist edd851
+
cvsdist edd851
 	if(matchf!=-1){
cvsdist edd851
 	  if(get_scsi_id(matchf,&b)==0){
cvsdist edd851
 	    if(a.bus==b.bus && a.id==b.id && a.lun==b.lun){
cvsdist edd851
@@ -438,7 +453,7 @@
cvsdist edd851
   cdrom_drive *d=NULL;
cvsdist edd851
   struct stat i_st;
cvsdist edd851
   struct stat g_st;
cvsdist edd851
-  int i_fd=-1;
cvsdist edd851
+  int i_fd=-1, i;
cvsdist edd851
   int g_fd=-1;
cvsdist edd851
   int version;
cvsdist edd851
   int type;
cvsdist edd851
@@ -534,8 +549,20 @@
cvsdist edd851
     goto cdda_identify_scsi_fail;
cvsdist edd851
   }
cvsdist edd851
 
cvsdist edd851
-  if(ioctl_device)i_fd=open(ioctl_device,O_RDONLY|O_NONBLOCK);
cvsdist edd851
-  g_fd=open(generic_device,O_RDWR);
cvsdist edd851
+  if(ioctl_device) {
cvsdist edd851
+    i_fd=open(ioctl_device,O_RDONLY|O_NONBLOCK|O_EXCL);
cvsdist edd851
+    for(i=0; (i<10) && (i_fd==-1); i++) {
cvsdist edd851
+      fprintf(stderr, "Error trying to open %s exclusively (%s). retrying in 1 second.\n", ioctl_device, strerror(errno));
cvsdist edd851
+      usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0));
cvsdist edd851
+      i_fd=open(ioctl_device,O_RDONLY|O_NONBLOCK|O_EXCL);
cvsdist edd851
+    }
cvsdist edd851
+  }
cvsdist edd851
+  g_fd=open(generic_device,O_RDWR|O_EXCL);
cvsdist edd851
+  for(i=0; (i<10) && (g_fd==-1); i++) {
cvsdist edd851
+    fprintf(stderr, "Error trying to open %s exclusively (%s). retrying in 1 second.\n", generic_device, strerror(errno));
cvsdist edd851
+    usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0));
cvsdist edd851
+    g_fd=open(generic_device,O_RDWR|O_EXCL);
cvsdist edd851
+  }
cvsdist edd851
   
cvsdist edd851
   if(ioctl_device && i_fd==-1)
cvsdist edd851
     idperror(messagedest,messages,"\t\tCould not open SCSI cdrom device "
cvsdist edd851
@@ -661,7 +688,7 @@
cvsdist edd851
   
cvsdist edd851
   cdrom_drive *d=NULL;
cvsdist edd851
   struct stat st;
cvsdist edd851
-  int fd=-1;
cvsdist edd851
+  int fd=-1,i;
cvsdist edd851
 
cvsdist edd851
   idmessage(messagedest,messages,"\tTesting %s for file/test interface",
cvsdist edd851
 	    filename);
cvsdist edd851
@@ -678,7 +705,17 @@
cvsdist edd851
     return(NULL);
cvsdist edd851
   }
cvsdist edd851
 
cvsdist edd851
-  fd=open(filename,O_RDONLY);
cvsdist edd851
+  /* I'm not certain this one nees O_EXCL, but it can't hurt */
cvsdist edd851
+  fd=open(filename,O_RDONLY|O_EXCL);
cvsdist edd851
+  for(i=0; (i<10) && (fd==-1); i++) {
cvsdist edd851
+    fprintf(stderr, "Error trying to open %s exclusively (%s). retrying in 1 second.\n", filename, strerror(errno));
cvsdist edd851
+    usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0));
cvsdist edd851
+    fd=open(filename,O_RDONLY|O_EXCL);
cvsdist edd851
+  }
cvsdist edd851
+  
cvsdist edd851
+  if(ioctl_device && i_fd==-1)
cvsdist edd851
+    idperror(messagedest,messages,"\t\tCould not open SCSI cdrom device "
cvsdist edd851
+	     "%s (continuing)",ioctl_device);
cvsdist edd851
   
cvsdist edd851
   if(fd==-1){
cvsdist edd851
     idperror(messagedest,messages,"\t\tCould not open file %s",filename);