Bug fix: modifying to overwriteable target yielded unmountable results
This commit is contained in:
parent
50a0258a78
commit
1b6e8b94b3
@ -299,28 +299,40 @@ int isoburn_find_by_drive(struct isoburn **pt, struct burn_drive *d, int flag)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc,
|
int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||||
|
struct burn_disc **disc,
|
||||||
struct isoburn_imgen_opts *opts, int new_img)
|
struct isoburn_imgen_opts *opts, int new_img)
|
||||||
{
|
{
|
||||||
struct burn_source *wsrc;
|
struct burn_source *wsrc;
|
||||||
struct burn_session *session;
|
struct burn_session *session;
|
||||||
struct burn_track *track;
|
struct burn_track *track;
|
||||||
struct isoburn *o;
|
struct isoburn *in_o, *out_o;
|
||||||
IsoWriteOpts *wopts= NULL;
|
IsoWriteOpts *wopts= NULL;
|
||||||
enum burn_disc_status state;
|
enum burn_disc_status state;
|
||||||
int ret, fifo_chunks;
|
int ret, fifo_chunks, lba, nwa;
|
||||||
|
|
||||||
ret= isoburn_find_emulator(&o, d, 0);
|
ret= isoburn_find_emulator(&in_o, in_d, 0);
|
||||||
if(ret<0 || o==NULL)
|
if(ret<0 || in_o==NULL)
|
||||||
{ret= -1; goto ex;}
|
{ret= -1; goto ex;}
|
||||||
o->wrote_well= 0; /* early end will be registered as failure */
|
ret= isoburn_find_emulator(&out_o, out_d, 0);
|
||||||
|
if(ret<0 || out_o==NULL)
|
||||||
|
{ret= -1; goto ex;}
|
||||||
|
/* early end will be registered as failure */
|
||||||
|
in_o->wrote_well= out_o->wrote_well= 0;
|
||||||
|
|
||||||
state = isoburn_disc_get_status(d);
|
state = isoburn_disc_get_status(in_d);
|
||||||
if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE
|
if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE &&
|
||||||
&& (state != BURN_DISC_FULL || ! new_img)) {
|
state != BURN_DISC_FULL) {
|
||||||
/* unsuitable status */
|
burn_msgs_submit(0x00060000, "Unsuitable source media state",
|
||||||
burn_msgs_submit(0x00060000, "Unsuitable media state", 0, "FAILURE", NULL);
|
0, "FAILURE", NULL);
|
||||||
|
{ret= -2; goto ex;}
|
||||||
|
}
|
||||||
|
state = isoburn_disc_get_status(out_d);
|
||||||
|
if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE) {
|
||||||
|
burn_msgs_submit(0x00060000, "Unsuitable target media state",
|
||||||
|
0, "FAILURE", NULL);
|
||||||
{ret= -2; goto ex;}
|
{ret= -2; goto ex;}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -359,33 +371,26 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc,
|
|||||||
iso_write_opts_set_output_charset(wopts, opts->output_charset);
|
iso_write_opts_set_output_charset(wopts, opts->output_charset);
|
||||||
iso_write_opts_set_fifo_size(wopts, fifo_chunks);
|
iso_write_opts_set_fifo_size(wopts, fifo_chunks);
|
||||||
|
|
||||||
if (new_img) {
|
|
||||||
iso_write_opts_set_ms_block(wopts, 0);
|
|
||||||
opts->effective_lba= 0;
|
|
||||||
iso_write_opts_set_appendable(wopts, 0);
|
|
||||||
iso_write_opts_set_overwrite_buf(wopts, NULL);
|
|
||||||
} else {
|
|
||||||
int lba, nwa;
|
|
||||||
ret = isoburn_disc_track_lba_nwa(d, NULL, 0, &lba, &nwa);
|
|
||||||
if (ret != 1) {
|
|
||||||
burn_msgs_submit(0x00060000, "Cannot determine next writeable address", 0,
|
|
||||||
"FAILURE", NULL);
|
|
||||||
{ret= -3; goto ex;}
|
|
||||||
}
|
|
||||||
if (nwa == 0 && state == BURN_DISC_APPENDABLE) {
|
|
||||||
/* invalid nwa */
|
|
||||||
burn_msgs_submit(0x00060000,
|
|
||||||
"Encountered 0 as next writeable address of appendable",
|
|
||||||
0, "FAILURE", NULL);
|
|
||||||
{ret= -4; goto ex;}
|
|
||||||
}
|
|
||||||
iso_write_opts_set_ms_block(wopts, nwa);
|
|
||||||
opts->effective_lba= nwa;
|
|
||||||
iso_write_opts_set_appendable(wopts, 1);
|
|
||||||
iso_write_opts_set_overwrite_buf(wopts, o->target_iso_head);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = iso_image_create_burn_source(o->image, wopts, &wsrc);
|
ret = isoburn_disc_track_lba_nwa(out_d, NULL, 0, &lba, &nwa);
|
||||||
|
if (ret != 1) {
|
||||||
|
burn_msgs_submit(0x00060000, "Cannot determine next writeable address", 0,
|
||||||
|
"FAILURE", NULL);
|
||||||
|
{ret= -3; goto ex;}
|
||||||
|
}
|
||||||
|
if (nwa == 0 && state == BURN_DISC_APPENDABLE) {
|
||||||
|
burn_msgs_submit(0x00060000,
|
||||||
|
"Encountered 0 as next writeable address of appendable",
|
||||||
|
0, "FAILURE", NULL);
|
||||||
|
{ret= -4; goto ex;}
|
||||||
|
}
|
||||||
|
iso_write_opts_set_ms_block(wopts, nwa);
|
||||||
|
opts->effective_lba= nwa;
|
||||||
|
iso_write_opts_set_appendable(wopts, !new_img);
|
||||||
|
iso_write_opts_set_overwrite_buf(wopts,
|
||||||
|
nwa>0 ? out_o->target_iso_head : NULL);
|
||||||
|
|
||||||
|
ret = iso_image_create_burn_source(in_o->image, wopts, &wsrc);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
isoburn_report_iso_error(ret, "Cannot create burn source", 0, "FAILURE", 0);
|
isoburn_report_iso_error(ret, "Cannot create burn source", 0, "FAILURE", 0);
|
||||||
{ret= -1; goto ex;}
|
{ret= -1; goto ex;}
|
||||||
@ -393,20 +398,20 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc,
|
|||||||
|
|
||||||
/* TODO check return values for failure. propertly clean-up on error */
|
/* TODO check return values for failure. propertly clean-up on error */
|
||||||
|
|
||||||
o->iso_source= wsrc;
|
out_o->iso_source= wsrc;
|
||||||
|
|
||||||
*disc = burn_disc_create();
|
*disc = burn_disc_create();
|
||||||
session = burn_session_create();
|
session = burn_session_create();
|
||||||
burn_disc_add_session(*disc, session, BURN_POS_END);
|
burn_disc_add_session(*disc, session, BURN_POS_END);
|
||||||
track = burn_track_create();
|
track = burn_track_create();
|
||||||
burn_track_set_source(track, o->iso_source);
|
burn_track_set_source(track, out_o->iso_source);
|
||||||
burn_session_add_track(session, track, BURN_POS_END);
|
burn_session_add_track(session, track, BURN_POS_END);
|
||||||
|
|
||||||
/* give up local references */
|
/* give up local references */
|
||||||
burn_track_free(track);
|
burn_track_free(track);
|
||||||
burn_session_free(session);
|
burn_session_free(session);
|
||||||
|
|
||||||
o->wrote_well= -1; /* neutral */
|
in_o->wrote_well= out_o->wrote_well= -1; /* neutral */
|
||||||
ret= 1;
|
ret= 1;
|
||||||
ex:
|
ex:
|
||||||
if(wopts!=NULL)
|
if(wopts!=NULL)
|
||||||
@ -414,22 +419,27 @@ ex:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc,
|
int isoburn_prepare_disc(struct burn_drive *d, struct burn_disc **disc,
|
||||||
struct isoburn_imgen_opts *opts)
|
struct isoburn_imgen_opts *opts)
|
||||||
{
|
{
|
||||||
return isoburn_prepare_disc_aux(d, disc, opts, 0);
|
return isoburn_prepare_disc_aux(d, d, disc, opts, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc,
|
int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc,
|
||||||
struct isoburn_imgen_opts *opts,
|
struct isoburn_imgen_opts *opts,
|
||||||
struct burn_drive *out_drive)
|
struct burn_drive *out_drive)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct isoburn *in_o, *out_o;
|
|
||||||
|
|
||||||
ret= isoburn_prepare_disc_aux(d, disc, opts, 1);
|
ret= isoburn_prepare_disc_aux(d, out_drive, disc, opts, 1);
|
||||||
if (ret<=0)
|
if (ret<=0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
#ifdef NIX
|
||||||
|
struct isoburn *in_o, *out_o;
|
||||||
|
|
||||||
/* Hand over source reference for optional fifo status inquiry */
|
/* Hand over source reference for optional fifo status inquiry */
|
||||||
if(out_drive==NULL)
|
if(out_drive==NULL)
|
||||||
return 1;
|
return 1;
|
||||||
@ -443,6 +453,8 @@ int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc,
|
|||||||
burn_source_free(out_o->iso_source);
|
burn_source_free(out_o->iso_source);
|
||||||
out_o->iso_source= in_o->iso_source;
|
out_o->iso_source= in_o->iso_source;
|
||||||
in_o->iso_source= NULL;
|
in_o->iso_source= NULL;
|
||||||
|
#endif /* NIX */
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2008.05.24.092546"
|
#define Xorriso_timestamP "2008.05.24.092853"
|
||||||
|
Loading…
Reference in New Issue
Block a user