From 8491645aed186f936516eb70f085b7b2ab119711 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Thu, 17 Jul 2008 11:13:32 +0000 Subject: [PATCH] Rectified usage of original xorriso options underneath growisofs --- libisoburn/trunk/xorriso/xorriso.1 | 29 ++++++++++------ libisoburn/trunk/xorriso/xorriso.c | 35 ++++++++++++-------- libisoburn/trunk/xorriso/xorriso.h | 3 +- libisoburn/trunk/xorriso/xorriso_timestamp.h | 2 +- libisoburn/trunk/xorriso/xorrisoburn.c | 13 ++++---- 5 files changed, 50 insertions(+), 32 deletions(-) diff --git a/libisoburn/trunk/xorriso/xorriso.1 b/libisoburn/trunk/xorriso/xorriso.1 index e9fcd0e2..ef4d5720 100644 --- a/libisoburn/trunk/xorriso/xorriso.1 +++ b/libisoburn/trunk/xorriso/xorriso.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH XORRISO 1 "Jul, 16, 2008" +.TH XORRISO 1 "Jul, 17, 2008" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -1762,11 +1762,11 @@ Personality "\fBmkisofs\fR" accepts the options listed with: .br -as mkisofs -help -- .br -Among them: -R (always on), -J, -o, -M, -C, -path-list, -m, -exclude-list, -f, --print-size, -pad, -no-pad, -V, -v, -version, -graft-points, -pathspecs as with xorriso -add. A lot of options are not supported and lead -to failure of the mkisofs emulation. Some are ignored, -but better do not rely on this tolerance. +Among them: -R (always on), -J, -o, -M, -C, -path-list, -m, -exclude-list, +-f, -print-size, -pad, -no-pad, -V, -v, -version, -graft-points, +pathspecs as with xorriso -add. +A lot of options are not supported and lead to failure of the mkisofs +emulation. Some are ignored, but better do not rely on this tolerance. .br -graft-points is equivalent to -pathspecs on. Note that pathspecs without "=" are interpreted differently than with xorriso option -add. Directories get @@ -1779,9 +1779,9 @@ the end of a "mkisofs" option list. Verbosity settings -v (= "UPDATE") and persists until things happen like -commit, -rollback, -dev, or end of xorriso. -pacifier gets set to "mkisofs" if files are added to the image. .br -If no output file was chosen before or during a "mkisofs" option list, then -standard output (-outdev "-") will get into effect before pathspecs get -added. If -o points to a regular file, then it will be truncated to 0 bytes +If pathspecs are given and if no output file was chosen before or during the +"mkisofs" option list, then standard output (-outdev "-") will get into effect. +If -o points to a regular file, then it will be truncated to 0 bytes when finally writing begins. This truncation does not happen if the drive is chosen by xorriso options before or after -as mkisofs. Directories and symbolic links are no valid -o targets. @@ -2180,7 +2180,7 @@ Add cdrskin option --grow_overwriteable_iso to all -as cdrecord runs in order to enable multi-session emulation on overwriteable media. .SS .B Let xorriso work underneath growisofs -growisofs expects an ISO formatter program which understands options -o, -C, +growisofs expects an ISO formatter program which understands options -C and -M. If xorriso gets started by name "xorrisofs" then it is suitable for that. .br \fB$\fR export MKISOFS="xorrisofs" @@ -2196,6 +2196,15 @@ a link pointing to the xorriso binary and tell growisofs to use it. E.g. by: .br \fB$\fR export MKISOFS="$HOME/xorrisofs" .br +One may quit mkisofs emulation by argument "--" and make +use of all xorriso commands. growisofs dislikes options which +start with "-o" but -outdev must be set to "-". +So use "outdev" instead: +.br +\fB$\fR growisofs -Z /dev/dvd -- outdev - -update_r /my/files /files +.br +\fB$\fR growisofs -M /dev/dvd -- outdev - -update_r /my/files /files +.br growisofs has excellent burn capabilities with DVD and BD. It does not emulate session history on overwriteable media, though. .SS diff --git a/libisoburn/trunk/xorriso/xorriso.c b/libisoburn/trunk/xorriso/xorriso.c index 48bbe5b7..3ed05ad9 100644 --- a/libisoburn/trunk/xorriso/xorriso.c +++ b/libisoburn/trunk/xorriso/xorriso.c @@ -2947,10 +2947,12 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) else if(strcmp(leafname, "xorrisofs")==0 || strcmp(leafname, "genisofs")==0 || strcmp(leafname, "mkisofs")==0 || strcmp(leafname, "genisoimage")==0) { m->argument_emulation= 1; + m->pacifier_style= 1; Xorriso_protect_stdout(*xorriso, 0); } else if(strcmp(leafname, "xorrecord")==0 || strcmp(leafname, "wodim")==0 || strcmp(leafname, "cdrecord")==0 || strcmp(leafname, "cdrskin")==0) { m->argument_emulation= 2; + m->pacifier_style= 2; } ret= Exclusions_new(&(m->disk_exclusions), 0); if(ret<=0) @@ -4202,8 +4204,8 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) is_default= (xorriso->pacifier_style==0); sprintf(line,"-pacifier '%s'\n", - xorriso->pacifier_style==2 ? "mkisofs" : - xorriso->pacifier_style==1 ? "cdrecord" : "xorriso"); + xorriso->pacifier_style==1 ? "mkisofs" : + xorriso->pacifier_style==2 ? "cdrecord" : "xorriso"); if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); @@ -7667,14 +7669,14 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, if(ret<=0) goto ex; } - if(!was_other_option) - {ret= 1; goto ex;} - if(xorriso->out_drive_handle==NULL) { + if(was_other_option && xorriso->out_drive_handle==NULL) { ret= Xorriso_option_dev(xorriso, "-", 2|4); /* set outdev to stdout */ if(ret<=0) return(ret); } +/* MULTI : */ + if(msc[0]) { cpt= strchr(msc, ','); if(cpt==NULL) { @@ -7688,15 +7690,16 @@ illegal_c:; goto illegal_c; strncpy(sfe, msc, cpt-msc); sfe[cpt-msc]= 0; - if(strcmp(sfe, "16")==0) /* growisofs uses 16 to avoid a bug in mkisofs */ - strcpy(sfe, "0"); if(xorriso->in_drive_handle!=NULL && indev[0]) { /* give up indev before setting the load address */ ret= Xorriso_option_dev(xorriso, "", 1); if(ret<=0) return(ret); } - ret= Xorriso_option_load(xorriso, "sbsector", sfe, 0); + /* growisofs submits msc1+16 to avoid a theoretical bug in mkisofs. + Therefore this bug has to be emulated here. Sigh. + */ + ret= Xorriso_option_load(xorriso, "sbsector", sfe, 1); if(ret<=0) return(ret); ret= Xorriso_option_grow_blindly(xorriso, cpt+1, 0); @@ -7709,6 +7712,9 @@ illegal_c:; goto ex; } + if(!was_other_option) + {ret= 1; goto ex;} + xorriso->padding= 300*1024; for(i= 0; ipacifier_style= 2; + xorriso->pacifier_style= 1; } } if(do_print_size) { @@ -10380,7 +10386,8 @@ int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag) /* Option -load session|track|sbsector value */ -/* @return <=0 error , 1 success, 2 revoked by -reassure +/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high + @return <=0 error , 1 success, 2 revoked by -reassure */ int Xorriso_option_load(struct XorrisO *xorriso, char *adr_mode, char *adr_value, int flag) @@ -10404,7 +10411,7 @@ int Xorriso_option_load(struct XorrisO *xorriso, char *adr_mode, else if(strcmp(adr_mode, "track")==0) xorriso->image_start_mode= 2; else if(strcmp(adr_mode, "lba")==0 || strcmp(adr_mode, "sbsector")==0) - xorriso->image_start_mode= 3; + xorriso->image_start_mode= 3 | ((flag&1) << 16); else if(strcmp(adr_mode, "volid")==0) xorriso->image_start_mode= 4; else { @@ -11264,11 +11271,11 @@ int Xorriso_option_pacifier(struct XorrisO *xorriso, char *style, int flag) { if(strcmp(style, "xorriso")==0 || strcmp(style, "default")==0) xorriso->pacifier_style= 0; - else if(strcmp(style, "cdrecord")==0 || strcmp(style, "cdrskin")==0 || - strcmp(style, "wodim")==0 || strcmp(style, "xorrecord")==0) - xorriso->pacifier_style= 1; else if(strcmp(style, "mkisofs")==0 || strcmp(style, "genisofs")==0 || strcmp(style, "genisoimage")==0 || strcmp(style, "xorrisofs")==0) + xorriso->pacifier_style= 1; + else if(strcmp(style, "cdrecord")==0 || strcmp(style, "cdrskin")==0 || + strcmp(style, "wodim")==0 || strcmp(style, "xorrecord")==0) xorriso->pacifier_style= 2; else { sprintf(xorriso->info_text, "-pacifier: unknown behavior code '%s'", style); diff --git a/libisoburn/trunk/xorriso/xorriso.h b/libisoburn/trunk/xorriso/xorriso.h index df20526f..0ed8c98a 100644 --- a/libisoburn/trunk/xorriso/xorriso.h +++ b/libisoburn/trunk/xorriso/xorriso.h @@ -345,7 +345,8 @@ int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag); int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag); /* Option -load session|track|sbsector value */ -/* @return <=0 error , 1 success, 2 revoked by -reassure +/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high + @return <=0 error , 1 success, 2 revoked by -reassure */ int Xorriso_option_load(struct XorrisO *xorriso, char *adr_mode, char *adr_value, int flag); diff --git a/libisoburn/trunk/xorriso/xorriso_timestamp.h b/libisoburn/trunk/xorriso/xorriso_timestamp.h index 0065c248..47ddd4bf 100644 --- a/libisoburn/trunk/xorriso/xorriso_timestamp.h +++ b/libisoburn/trunk/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.07.17.110812" +#define Xorriso_timestamP "2008.07.17.111411" diff --git a/libisoburn/trunk/xorriso/xorrisoburn.c b/libisoburn/trunk/xorriso/xorrisoburn.c index 17fc776a..9cf09382 100644 --- a/libisoburn/trunk/xorriso/xorrisoburn.c +++ b/libisoburn/trunk/xorriso/xorrisoburn.c @@ -487,7 +487,8 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) xorriso->image_start_mode&= ~0xffff; /* perform auto setting */ if((xorriso->image_start_mode&(1<<30))) { /* if enabled at all */ ret= isoburn_set_msc1(drive, xorriso->image_start_mode & 0xffff, - xorriso->image_start_value, 0); + xorriso->image_start_value, + !!(xorriso->image_start_mode & (1<<16))); if(ret<=0) goto ex; if(xorriso->image_start_mode&(1<<31)) @@ -1096,8 +1097,8 @@ int Xorriso_check_burn_abort(struct XorrisO *xorriso, int flag) It issues pacifying update messages to the user. @param flag bit0-3 = emulation mode 0= xorriso - 1= cdrecord - 2= mkisofs + 1= mkisofs + 2= cdrecord bit4= report speed in CD units */ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive, @@ -1130,7 +1131,7 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive, break; current_time= Sfile_microtime(0); if(drive_status == BURN_DRIVE_WRITING && progress.sectors > 0) { - if(emul==1) { + if(emul==2) { if(progress.sector<=progress.sectors) sprintf(xorriso->info_text, "%4d of %4d MB written", progress.sector / 512, progress.sectors / 512); @@ -1163,7 +1164,7 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive, measured_speed/speed_factor); } - } else if(emul == 2 && + } else if(emul == 1 && progress.sectors > 0 && progress.sector <= progress.sectors) { /* "37.87% done, estimate finish Tue Jul 15 18:55:07 2008" */ @@ -6170,7 +6171,7 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address, xorriso->run_state= 1; /* Indicate that burning has started */ burn_disc_write(burn_options, disc); - ret= Xorriso_pacifier_loop(xorriso, drive, 1|(is_cd<<4)); + ret= Xorriso_pacifier_loop(xorriso, drive, 2|(is_cd<<4)); if(ret<=0) goto ex; if(!burn_drive_wrote_well(drive)) {