|
Lines 225-230
LOCAL long sg_raisedma __PR((SCSI *scgp,
|
Link Here
|
|---|
|
#endif | #endif |
LOCAL void sg_settimeout __PR((int f, int timeout)); | LOCAL void sg_settimeout __PR((int f, int timeout)); |
| |
|
int sg_open_excl __PR((char *device, int mode)); |
|
|
|
int |
|
sg_open_excl(device, mode) |
|
char *device; |
|
int mode; |
|
{ |
|
int f; |
|
int i; |
|
f = open(device, mode|O_EXCL); |
|
for (i = 0; (i < 10) && (f == -1 && (errno == EACCES || errno == EBUSY)); i++) { |
|
fprintf(stderr, "Error trying to open %s exclusively (%s)... retrying in 1 second.\n", device, strerror(errno)); |
|
usleep(1000000 + 100000.0 * rand()/(RAND_MAX+1.0)); |
|
f = open(device, mode|O_EXCL); |
|
} |
|
if (f == -1 && errno != EACCES && errno != EBUSY) { |
|
f = open(device, mode); |
|
} |
|
return f; |
|
} |
|
|
/* | /* |
* Return version information for the low level SCSI transport code. | * Return version information for the low level SCSI transport code. |
* This has been introduced to make it easier to trace down problems | * This has been introduced to make it easier to trace down problems |
|
|
| |
for (i = 0; globbuf.gl_pathv && globbuf.gl_pathv[i] != NULL ; i++) { | for (i = 0; globbuf.gl_pathv && globbuf.gl_pathv[i] != NULL ; i++) { |
devname = globbuf.gl_pathv[i]; | devname = globbuf.gl_pathv[i]; |
f = open(devname, O_RDWR | O_NONBLOCK); |
f = sg_open_excl(devname, O_RDWR | O_NONBLOCK); |
if (f < 0) { | if (f < 0) { |
/* | /* |
* Set up error string but let us clear it later | * Set up error string but let us clear it later |
|
|
for (i = 0; globbuf.gl_pathv && globbuf.gl_pathv[i] != NULL ; i++) { | for (i = 0; globbuf.gl_pathv && globbuf.gl_pathv[i] != NULL ; i++) { |
devname = globbuf.gl_pathv[i]; | devname = globbuf.gl_pathv[i]; |
| |
f = open(devname, O_RDWR | O_NONBLOCK); |
f = sg_open_excl(devname, O_RDWR | O_NONBLOCK); |
if (f < 0) { | if (f < 0) { |
/* | /* |
* Set up error string but let us clear it later | * Set up error string but let us clear it later |
|
|
"Warning: Open by 'devname' is unintentional and not supported.\n"); | "Warning: Open by 'devname' is unintentional and not supported.\n"); |
} | } |
/* O_NONBLOCK is dangerous */ | /* O_NONBLOCK is dangerous */ |
f = open(device, O_RDWR | O_NONBLOCK); |
f = sg_open_excl(device, O_RDWR | O_NONBLOCK); |
/* if (f < 0 && errno == ENOENT)*/ | /* if (f < 0 && errno == ENOENT)*/ |
/* goto openpg;*/ | /* goto openpg;*/ |
| |