diff --git a/libisoburn/burn_wrap.c b/libisoburn/burn_wrap.c index 4b2f0712..af81acad 100644 --- a/libisoburn/burn_wrap.c +++ b/libisoburn/burn_wrap.c @@ -255,7 +255,7 @@ int isoburn_drive_scan_and_grab(struct burn_drive_info *drive_infos[], if(conv_ret<=0) { sprintf(msg, "Unsuitable drive address: '%s'\n",adr); msg[BURN_MSGS_MESSAGE_LEN-1]= 0; - burn_msgs_submit(0, msg, 0, "SORRY", NULL); + burn_msgs_submit(0x00060000, msg, 0, "SORRY", NULL); ret= 0; goto ex; } @@ -309,8 +309,11 @@ int isoburn_find_emulator(struct isoburn **pt, ret= isoburn_find_by_drive(pt, drive, 0); if(ret<=0) return(0); - if((*pt)->emulation_mode==-1) + if((*pt)->emulation_mode==-1) { + burn_msgs_submit(0x00060000, + "Unsuitable drive and media state", 0, "FAILURE", NULL); return(-1); + } if((*pt)->emulation_mode==0) return(0); return(1); @@ -388,8 +391,11 @@ int isoburn_disc_get_msc1(struct burn_drive *d, int *start_lba) #endif if(isoburn_disc_get_status(d)!=BURN_DISC_APPENDABLE && - isoburn_disc_get_status(d)!=BURN_DISC_FULL) + isoburn_disc_get_status(d)!=BURN_DISC_FULL) { + burn_msgs_submit(0x00060000, + "Media contains no recognizable data", 0, "SORRY",NULL); return(0); + } ret= isoburn_find_emulator(&o, d, 0); if(ret<0) return(0); @@ -454,7 +460,7 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc) write_type= burn_write_opts_auto_write_type(opts, disc, reasons, 0); if (write_type == BURN_WRITE_NONE) { sprintf(msg, "Failed to find a suitable write mode:\n%s", reasons); - burn_msgs_submit(0, msg, 0, "SORRY", NULL); + burn_msgs_submit(0x00060000, msg, 0, "SORRY", NULL); if(o!=NULL) o->wrote_well= 0; /* To cause a negative reply with burn_drive_wrote_well() */ @@ -531,8 +537,12 @@ int isoburn_set_start_byte(struct isoburn *o, off_t value, int flag) ret= burn_disc_get_multi_caps(drive, BURN_WRITE_NONE, &caps, 0); if(ret<=0) goto ex; - if(!caps->start_adr) + if(!caps->start_adr) { + burn_msgs_submit(0x00060000, + "Cannot set start byte address with this type of media", + 0, "FAILURE", NULL); {ret= 0; goto ex;} + } o->min_start_byte= value; if(value % caps->start_alignment) value+= caps->start_alignment - (value % caps->start_alignment); @@ -557,7 +567,7 @@ int isoburn_get_min_start_byte(struct burn_drive *d, off_t *start_byte, ret= isoburn_find_emulator(&o, d, 0); if(ret<0) return(-1); - if(ret==0) + if(ret==0) return(0); *start_byte= o->min_start_byte; if(o->min_start_byte<=0) @@ -701,11 +711,13 @@ int isoburn_report_iso_error(int iso_error_code, char msg_text[], int os_errno, int error_code, iso_sev, min_sev, ret; char *sev_text_pt, *msg_text_pt= NULL; -/* <<< delete as soon as replacement appears in libisofs */ + error_code= 0x00050000; + +/* It would have been neat ... #define ISO_ERR_CODE(e) (e & 0x0000FFFF) - - error_code= 0x00050000 | ISO_ERR_CODE(iso_error_code); +*/ + if(iso_error_code<0) msg_text_pt= (char *) iso_error_to_msg(iso_error_code); if(msg_text_pt==NULL) diff --git a/libisoburn/isoburn.c b/libisoburn/isoburn.c index ed3a758b..5b5e4b15 100644 --- a/libisoburn/isoburn.c +++ b/libisoburn/isoburn.c @@ -58,8 +58,12 @@ int isoburn_new(struct isoburn **objpt, int flag) int i, ret; *objpt= o= (struct isoburn *) malloc(sizeof(struct isoburn)); - if(o==NULL) + if(o==NULL) { + burn_msgs_submit(0x00060000, + "Cannot allocate memory for isoburn control object", + 0, "FATAL", NULL); return(-1); + } o->drive= NULL; o->emulation_mode= 0; @@ -276,6 +280,7 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc, if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE && (state != BURN_DISC_FULL || ! new_img)) { /* unsuitable status */ + burn_msgs_submit(0x00060000, "Unsuitable media state", 0, "FAILURE", NULL); {ret= -2; goto ex;} } @@ -322,10 +327,15 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc, } else { int lba, nwa; ret = isoburn_disc_track_lba_nwa(d, NULL, 0, &lba, &nwa); - if (ret != 1) + 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", 0, + "FAILURE", NULL); {ret= -4; goto ex;} } iso_write_opts_set_ms_block(wopts, nwa); @@ -347,7 +357,7 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc, o->fifo = burn_fifo_source_new(wsrc, 2048, fifo_chunks, 0); burn_source_free(wsrc); if (o->fifo == NULL) { - fprintf(stderr, "Cannot attach fifo\n"); + burn_msgs_submit(0x00060000, "Cannot attach fifo", 0, "FATAL", NULL); {ret= -1; goto ex;} } #endif /* ! Libisoburn_no_fifO */ @@ -416,6 +426,7 @@ int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc, /* API @since 0.1.0 @param flag bit0= this is a regular end, not an abort + give up source reference */ int isoburn_cancel_prepared_write(struct burn_drive *d, int flag) { @@ -432,6 +443,8 @@ int isoburn_cancel_prepared_write(struct burn_drive *d, int flag) if(o->iso_source->version<1) return(0); o->iso_source->cancel(o->iso_source); + burn_source_free(o->iso_source); + o->iso_source= NULL; return(1); } @@ -482,8 +495,11 @@ int isoburn_ropt_new(struct isoburn_read_opts **new_o, int flag) struct isoburn_read_opts *o; o= (*new_o)= calloc(1, sizeof(struct isoburn_read_opts)); - if(o==NULL) + if(o==NULL) { + burn_msgs_submit(0x00060000, "Cannot allocate memory for read options", + 0, "FATAL", NULL); return(-1); + } o->norock= 0; o->nojoliet= 0; o->noiso1999= 1; @@ -616,8 +632,12 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag) struct isoburn_imgen_opts *o; o= (*new_o)= calloc(1, sizeof(struct isoburn_imgen_opts)); - if(o==NULL) + if(o==NULL) { + burn_msgs_submit(0x00060000, + "Cannot allocate memory for image generation options", + 0, "FATAL", NULL); return(-1); + } o->level= 2; o->rockridge= 1; o->joliet= 0; diff --git a/libisoburn/isofs_wrap.c b/libisoburn/isofs_wrap.c index 8d531ef2..3ae073ba 100644 --- a/libisoburn/isofs_wrap.c +++ b/libisoburn/isofs_wrap.c @@ -116,19 +116,15 @@ int isoburn_read_image(struct burn_drive *d, struct isoburn *o= NULL; if(read_opts==NULL) { - - /* >>> program error */; - + burn_msgs_submit(0x00060000, + "Program error: isoburn_read_image: read_opts==NULL", + 0, "FATAL", NULL); return(-1); } if(d != NULL) { ret = isoburn_find_emulator(&o, d, 0); - if (ret < 0) + if (ret < 0 || o == NULL) return 0; - - if (o == NULL) { - return -1; - } status = isoburn_disc_get_status(d); } if (d == NULL || status == BURN_DISC_BLANK || read_opts->pretend_blank) { @@ -139,8 +135,12 @@ int isoburn_read_image(struct burn_drive *d, if (d == NULL) { /* New empty image without relation to a drive */ - if (image==NULL) + if (image==NULL) { + burn_msgs_submit(0x00060000, + "Program error: isoburn_read_image: image==NULL", + 0, "FATAL", NULL); return -1; + } /* create a new image */ ret = iso_image_new("ISOIMAGE", image); if (ret < 0) { @@ -164,14 +164,16 @@ int isoburn_read_image(struct burn_drive *d, } if (status != BURN_DISC_APPENDABLE && status != BURN_DISC_FULL) { - /* incorrect disc status */ + burn_msgs_submit(0x00060000, + "Program error: isoburn_read_image: incorrect disc status", + 0, "FATAL", NULL); return -4; } memset((char *) &ropts, 0, sizeof(ropts)); ret = isoburn_disc_get_msc1(d, &int_num); - if (ret < 0) + if (ret <= 0) return -2; ms_block= int_num; @@ -233,13 +235,15 @@ int isoburn_attach_image(struct burn_drive *d, IsoImage *image) int ret; struct isoburn *o; - if (image == NULL) + if (image == NULL) { + burn_msgs_submit(0x00060000, + "Program error: isoburn_attach_image: image==NULL", + 0, "FATAL", NULL); return -1; + } ret = isoburn_find_emulator(&o, d, 0); - if (ret < 0) + if (ret < 0 || o == NULL) return 0; - if (o == NULL) - return -1; if(o->image != NULL) iso_image_unref(o->image); o->image = image; @@ -284,8 +288,12 @@ int isoburn_start_emulation(struct isoburn *o, int flag) struct burn_drive *drive; struct ecma119_pri_vol_desc *pvm; - if(o==NULL) + if(o==NULL) { + burn_msgs_submit(0x00060000, + "Program error: isoburn_start_emulation: o==NULL", + 0, "FATAL", NULL); return -1; + } drive= o->drive; diff --git a/libisoburn/libisoburn.h b/libisoburn/libisoburn.h index 59eff8c5..8ea59d9a 100644 --- a/libisoburn/libisoburn.h +++ b/libisoburn/libisoburn.h @@ -697,7 +697,7 @@ int isoburn_prepare_new_image(struct burn_drive *in_drive, preparation call. @param flag Bitfield, submit 0 for now. bit0= -reserved for internal use- - @return <=0 error , 1 = success + @return <0 error, 0= no pending preparations detectable, 1 = canceled */ int isoburn_cancel_prepared_write(struct burn_drive *input_drive, int flag); diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 87a6fa15..2598013f 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.02.04.154405" +#define Xorriso_timestamP "2008.02.04.184038" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 2b944b98..dcf85780 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -298,10 +298,13 @@ int Xorriso_report_iso_error(struct XorrisO *xorriso, int error_code, iso_sev, min_sev, ret; char *sev_text_pt, *msg_text_pt= NULL; -/* <<< delete as soon as replacement appears in libisofs */ -#define ISO_ERR_CODE(e) (e & 0x0000FFFF) + error_code= 0x00050000; +/* It would have been neat ... +#define ISO_ERR_CODE(e) (e & 0x0000FFFF) error_code= 0x00050000 | ISO_ERR_CODE(iso_error_code); +*/ + if(flag&1) msg_text_pt= (char *) iso_error_to_msg(iso_error_code); if(msg_text_pt==NULL) @@ -838,6 +841,10 @@ no_track:; Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0); goto ex; } + /* Done early to free any reference to the libisofs resources via disc */ + if(disc!=NULL) + burn_disc_free(disc); + disc= NULL; /* To wait for the end of the libisofs threads and their messages. */ isoburn_sync_after_write(source_drive, 1); Xorriso_process_msg_queues(xorriso,0); @@ -1565,12 +1572,15 @@ int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag) else { ret= burn_msgs_obtain("ALL", &error_code, xorriso->info_text, &os_errno, severity); - tunneled= (error_code>=0x00050000 && error_code<0x00060000); + if(error_code>=0x00050000 && error_code<0x00060000) + tunneled= -1; /* "libisofs:" */ + if(error_code>=0x00060000 && error_code<0x00070000) + tunneled= 1; /* "libisoburn:" */ } if(ret<=0) break; Xorriso_msgs_submit(xorriso, error_code, xorriso->info_text, os_errno, - severity, ((pass&&!tunneled)+1)<<2); + severity, ((pass+tunneled)+1)<<2); count++; } }