Avoiding open-close cycles on MMC drives after blanking or burning
This commit is contained in:
parent
c105b5486b
commit
4f16e31e19
@ -160,6 +160,9 @@ ex:;
|
||||
the write start address
|
||||
bit5= do not print toc
|
||||
bit6= do not calm down drive after aquiring it
|
||||
bit7= re-assess rather than aquire:
|
||||
Do not give up drives,
|
||||
use isoburn_drive_aquire() with re-assessment bit
|
||||
@return <=0 failure , 1= ok
|
||||
2=success, but not writeable with bit1
|
||||
3=success, but not blank and not ISO with bit0
|
||||
@ -170,8 +173,8 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr,
|
||||
int ret, hret, not_writeable= 0, has_what, aquire_flag, load_lba, ext;
|
||||
int lba, track, session, params_flag, adr_mode, read_ret;
|
||||
uint32_t size, offst;
|
||||
struct burn_drive_info *dinfo= NULL, *out_dinfo, *in_dinfo;
|
||||
struct burn_drive *drive= NULL, *out_drive, *in_drive;
|
||||
struct burn_drive_info *dinfo= NULL, *out_dinfo= NULL, *in_dinfo= NULL;
|
||||
struct burn_drive *drive= NULL, *out_drive= NULL, *in_drive= NULL;
|
||||
enum burn_disc_status state;
|
||||
IsoImage *volset = NULL;
|
||||
IsoNode *root_node;
|
||||
@ -199,9 +202,11 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr,
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
ret= Xorriso_give_up_drive(xorriso, (flag&3)|8);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
if(!(flag & 128)) {
|
||||
ret= Xorriso_give_up_drive(xorriso, (flag&3)|8);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
if(flag & 1)
|
||||
xorriso->isofs_st_out= time(0) - 1;
|
||||
|
||||
@ -219,7 +224,30 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr,
|
||||
}
|
||||
}
|
||||
|
||||
if((flag&3)==1 && xorriso->out_drive_handle!=NULL) {
|
||||
if(flag & 128) {
|
||||
if(flag & 1)
|
||||
Xorriso_get_drive_handles(xorriso, &in_dinfo, &in_drive, "", 16);
|
||||
if(flag & 2)
|
||||
Xorriso_get_drive_handles(xorriso, &out_dinfo, &out_drive, "", 2 | 16);
|
||||
if(in_dinfo != NULL && (out_dinfo == NULL || out_dinfo == in_dinfo)) {
|
||||
dinfo= in_dinfo;
|
||||
if(flag & 2)
|
||||
xorriso->outdev_is_exclusive= xorriso->indev_is_exclusive;
|
||||
} else if(out_dinfo != NULL && in_dinfo == NULL) {
|
||||
dinfo= out_dinfo;
|
||||
if(flag & 1)
|
||||
xorriso->indev_is_exclusive= xorriso->outdev_is_exclusive;
|
||||
} else if(out_dinfo != NULL || in_dinfo != NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Two different drives shall be re-assed in one call");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= 0; goto ex;}
|
||||
} else {
|
||||
sprintf(xorriso->info_text, "No drive aquired on re-assessment");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
} else if((flag&3)==1 && xorriso->out_drive_handle!=NULL) {
|
||||
ret= Xorriso_get_drive_handles(xorriso, &out_dinfo, &out_drive,
|
||||
"on attempt to compare new indev with outdev", 2);
|
||||
if(ret<=0)
|
||||
@ -241,7 +269,7 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr,
|
||||
}
|
||||
}
|
||||
|
||||
if(dinfo==NULL) {
|
||||
if(dinfo == NULL || (flag & 128)) {
|
||||
aquire_flag= 1 | ((flag&(8|4))>>1) | ((xorriso->toc_emulation_flag & 3)<<3);
|
||||
if(xorriso->toc_emulation_flag & 4)
|
||||
aquire_flag|= 128;
|
||||
@ -249,17 +277,21 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr,
|
||||
aquire_flag|= 32;
|
||||
if((xorriso->ino_behavior & (1 | 2)) && !(xorriso->do_aaip & (4 | 32)))
|
||||
aquire_flag|= 64;
|
||||
if(flag & 128)
|
||||
aquire_flag|= 256;
|
||||
burn_preset_device_open(xorriso->drives_exclusive, 0, 0);
|
||||
burn_allow_drive_role_4(1 | (xorriso->early_stdio_test & 14));
|
||||
ret= isoburn_drive_aquire(&dinfo, libburn_adr, aquire_flag);
|
||||
burn_preset_device_open(1, 0, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text,"Cannot aquire drive '%s'", adr);
|
||||
if(flag & 128)
|
||||
sprintf(xorriso->info_text,"Cannot re-assess drive '%s'", adr);
|
||||
else
|
||||
sprintf(xorriso->info_text,"Cannot aquire drive '%s'", adr);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
state= isoburn_disc_get_status(dinfo[0].drive);
|
||||
ret= isoburn_get_img_partition_offset(dinfo[0].drive, &offst);
|
||||
if((state == BURN_DISC_APPENDABLE || state == BURN_DISC_FULL) && ret == 1) {
|
||||
@ -709,8 +741,11 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0+1= what to give up and re-aquire by the address of outdev
|
||||
0=none, 1=indev, 2=outdev, 3=both
|
||||
/* @param flag bit0+1= what to give up and/or re-assess in what role
|
||||
0=give up outdev
|
||||
1=give up indev if not outdev, re-assess outdev as indev
|
||||
2=re-assess outdev as outdev
|
||||
3=give up indev if not outdev, re-assess outdev as dev
|
||||
*/
|
||||
int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
@ -725,14 +760,20 @@ int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag)
|
||||
strcpy(off_name, xorriso->outdev_off_adr);
|
||||
else
|
||||
strcpy(off_name, drive_name);
|
||||
Xorriso_give_up_drive(xorriso, aq_flag);
|
||||
if(aq_flag==0) {
|
||||
|
||||
if(aq_flag == 0) {
|
||||
Xorriso_give_up_drive(xorriso, 2);
|
||||
sprintf(xorriso->info_text,"Gave up -outdev ");
|
||||
Text_shellsafe(xorriso->outdev, xorriso->info_text, 1);
|
||||
Text_shellsafe(xorriso->indev, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
sprintf(xorriso->info_text,"Re-aquiring -outdev ");
|
||||
|
||||
/* Only give up indev, and only if it is not outdev */;
|
||||
if(xorriso->in_drive_handle != xorriso->out_drive_handle &&
|
||||
xorriso->in_drive_handle != NULL && (aq_flag & 1))
|
||||
Xorriso_give_up_drive(xorriso, 1 | 8);
|
||||
sprintf(xorriso->info_text,"Re-assessing -outdev ");
|
||||
Text_shellsafe(drive_name, xorriso->info_text, 1);
|
||||
if(strcmp(drive_name, off_name) != 0) {
|
||||
strcat(xorriso->info_text, " (");
|
||||
@ -740,16 +781,16 @@ int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag)
|
||||
strcat(xorriso->info_text, ")");
|
||||
}
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
ret= Xorriso_aquire_drive(xorriso, off_name, drive_name, aq_flag);
|
||||
|
||||
/* Re-assess outdev */
|
||||
ret= Xorriso_aquire_drive(xorriso, off_name, drive_name, aq_flag | 128);
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text,"Could not re-aquire -outdev ");
|
||||
sprintf(xorriso->info_text,"Could not re-assess -outdev ");
|
||||
Text_shellsafe(drive_name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
goto ex;
|
||||
}
|
||||
strcpy(xorriso->outdev, drive_name);
|
||||
if(strcmp(xorriso->outdev, xorriso->indev) == 0)
|
||||
strcpy(xorriso->indev, drive_name);
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
Xorriso_free_meM(drive_name);
|
||||
|
@ -1 +1 @@
|
||||
#define Xorriso_timestamP "2011.10.05.085704"
|
||||
#define Xorriso_timestamP "2011.10.05.172142"
|
||||
|
Loading…
Reference in New Issue
Block a user