diff --git a/test/xorriso.c b/test/xorriso.c index 2920d82b..67f6142e 100644 --- a/test/xorriso.c +++ b/test/xorriso.c @@ -4469,15 +4469,22 @@ int Xorriso_option_status_history_max(struct XorrisO *xorriso, int num, /* Option -tell_media_space */ int Xorriso_option_tell_media_space(struct XorrisO *xorriso, int flag) { - int ret; + int ret, free_space= 0, media_space= 0; - ret= Xorriso_tell_media_space(xorriso, 0); + ret= Xorriso_tell_media_space(xorriso, &media_space, &free_space, 0); if(ret<0) { sprintf(xorriso->info_text, "Cannot -tell_media_space"); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); return(0); } - sprintf(xorriso->result_line, "%d\n", ret); + if(free_space<0) { + sprintf(xorriso->info_text, + "Pending image size larger than free space on media"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0); + } + sprintf(xorriso->result_line, "Write space : %d\n", media_space); + Xorriso_result(xorriso, 0); + sprintf(xorriso->result_line, "Free space : %d\n", free_space); Xorriso_result(xorriso, 0); return(1); } @@ -4688,6 +4695,9 @@ next_command:; } else if(strcmp(cmd,"-end")==0) { Xorriso_option_end(xorriso, 0); + ret= Xorriso_eval_problem_status(xorriso, ret, 0); + if(ret<0) + return(ret); {ret= 3; goto ex;} } else if(strcmp(cmd,"-f")==0) { diff --git a/test/xorriso_timestamp.h b/test/xorriso_timestamp.h index 927880d1..9d49af31 100644 --- a/test/xorriso_timestamp.h +++ b/test/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2007.10.20.171046" +#define Xorriso_timestamP "2007.10.20.194918" diff --git a/test/xorrisoburn.c b/test/xorrisoburn.c index 254e1a76..ff2e563a 100644 --- a/test/xorrisoburn.c +++ b/test/xorrisoburn.c @@ -268,7 +268,7 @@ int Xorriso_make_write_options( */ int Xorriso_write_growing(struct XorrisO *xorriso, int flag) { - int ret; + int ret, media_space; struct isoburn_source_opts sopts; struct burn_drive_info *dinfo; struct burn_drive *drive; @@ -309,15 +309,22 @@ int Xorriso_write_growing(struct XorrisO *xorriso, int flag) {ret= 0; goto ex;} } - if(flag&1) { - ret= burn_disc_get_sectors(disc); - goto ex; - } - ret= Xorriso_make_write_options(xorriso, drive, &burn_options, 0); if(ret<=0) goto ex; + ret= burn_disc_get_sectors(disc); + if(flag&1) + goto ex; + media_space= burn_disc_available_space(drive, burn_options) / (off_t) 2048; + if(media_space < ret) { + Xorriso_process_msg_queues(xorriso,0); + sprintf(xorriso->info_text,"Image size %ds exceeds free space on media %ds", + ret, media_space); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + {ret= 0; goto ex;} + } + isoburn_disc_write(burn_options, disc); burn_write_opts_free(burn_options); @@ -767,13 +774,16 @@ int Xorriso_show_devices(struct XorrisO *xorriso, int flag) } -int Xorriso_tell_media_space(struct XorrisO *xorriso, int flag) +int Xorriso_tell_media_space(struct XorrisO *xorriso, + int *media_space, int *free_space, int flag) { - int ret, free_space; + int ret; struct burn_drive_info *dinfo; struct burn_drive *drive; struct burn_write_opts *burn_options; + (*free_space)= (*media_space)= 0; + ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, "on attempt to -tell_media_space", 2); if(ret<=0) @@ -782,15 +792,20 @@ int Xorriso_tell_media_space(struct XorrisO *xorriso, int flag) ret= Xorriso_make_write_options(xorriso, drive, &burn_options, 0); if(ret<=0) return(-1); - free_space= burn_disc_available_space(drive, burn_options) / (off_t) 2048; + (*free_space)= (*media_space)= + burn_disc_available_space(drive, burn_options) / (off_t) 2048; burn_write_opts_free(burn_options); - /* >>> subtract space needed for pending session image */ + if(xorriso->volset_change_pending) { + /* >>> care for modifying */ + + ret= Xorriso_write_growing(xorriso, 1); + if(ret>0) + (*free_space)-= ret; + } Xorriso_process_msg_queues(xorriso,0); - if(free_space<=0) - free_space= 0; - return(free_space); + return(1); } diff --git a/test/xorrisoburn.h b/test/xorrisoburn.h index f3751827..441eca6d 100644 --- a/test/xorrisoburn.h +++ b/test/xorrisoburn.h @@ -37,7 +37,8 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag); int Xorriso_show_devices(struct XorrisO *xorriso, int flag); -int Xorriso_tell_media_space(struct XorrisO *xorriso, int flag); +int Xorriso_tell_media_space(struct XorrisO *xorriso, + int *media_space, int *free_space, int flag); int Xorriso_blank_media(struct XorrisO *xorriso, int flag);