From a904ef7abf8358548650f31e5a257592ceebe710 Mon Sep 17 00:00:00 2001 From: Vreixo Formoso Lopes Date: Fri, 21 Sep 2007 15:37:04 +0000 Subject: [PATCH] Little code changes to improve isoburn_start_emulation(). --- src/isofs_wrap.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/isofs_wrap.c b/src/isofs_wrap.c index e282a877..7add8fcf 100644 --- a/src/isofs_wrap.c +++ b/src/isofs_wrap.c @@ -202,7 +202,7 @@ int isoburn_free_rwopts(struct isoburn *o) */ int isoburn_start_emulation(struct isoburn *o, int flag) { - int ret; + int ret, i; off_t *data_count; struct burn_drive *drive; struct ecma119_pri_vol_desc *pvm; @@ -213,22 +213,34 @@ int isoburn_start_emulation(struct isoburn *o, int flag) // TODO what about ms? where we validate valid iso image in ms disc? ret = burn_read_data(drive, (off_t) 0, o->target_iso_head, sizeof(o->target_iso_head), &data_count, 0); + // TODO mmm, can a read error mean an empty disc (e.g. CD-R)? if (ret <= 0) return -1; - pvm = (struct ecma119_pri_vol_desc *)(o->target_iso_head + 16 * 2048); + /* check first 64K. If 0's, the disc is treated as a blank disc, and thus + overwritten without extra check. */ + i = sizeof(o->target_iso_head); + while (i && !o->target_iso_head[i-1]) + --i; - /* sanity check */ - if (pvm->vol_desc_type[0] != 1 || pvm->vol_desc_version[0] != 1 - || pvm->file_structure_version[0] != 1 ) { - // TODO for now I treat this as a full disc - o->fabricated_disc_status= BURN_DISC_FULL; + if (!i) { + o->fabricated_disc_status= BURN_DISC_BLANK; return 1; } + pvm = (struct ecma119_pri_vol_desc *)(o->target_iso_head + 16 * 2048); + if (!strncmp((char*)pvm->std_identifier, "CD001", 5)) { off_t size; + /* sanity check */ + if (pvm->vol_desc_type[0] != 1 || pvm->vol_desc_version[0] != 1 + || pvm->file_structure_version[0] != 1 ) { + // TODO for now I treat this as a full disc + o->fabricated_disc_status= BURN_DISC_FULL; + return 1; + } + /* ok, PVM found, set size */ size = (off_t) iso_read_lsb(pvm->vol_space_size, 4); size *= (off_t) 2048; /* block size in bytes */ @@ -240,19 +252,8 @@ int isoburn_start_emulation(struct isoburn *o, int flag) isoburn_set_start_byte(o, (off_t) 0, 0); o->fabricated_disc_status= BURN_DISC_BLANK; } else { - int i; - - /* check first 64K. If 0's, the disc is treated as a blank disc, and thus - overwritten without extra check. If not, the disc is treated as full, - and user needs to isoburn_disc_erase() it before burn it again */ - i = sizeof(o->target_iso_head); - while (i && !o->target_iso_head[i-1]) - --i; - - if (i) - o->fabricated_disc_status= BURN_DISC_FULL; - else - o->fabricated_disc_status= BURN_DISC_BLANK; + /* treat any disc in an unknown format as full */ + o->fabricated_disc_status= BURN_DISC_FULL; } return 1; }