diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index 5da17141..8e142675 100644 --- a/xorriso/xorriso.1 +++ b/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 "Nov 17, 2008" +.TH XORRISO 1 "Nov 21, 2008" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -1334,6 +1334,43 @@ Rock Ridge info will be generated by the program unconditionally. \fB\-joliet\fR "on"|"off" If enabled by "on", generate Joliet info additional to Rock Ridge info. .TP +\fB\-relax_compliance\fR rule[:rule...] +Adjust the compliance to specifications of ISO 9660 and its extensions. In some +cases it is worth to deviate a bit in order to circumvent bugs of the intended +reader system or to get inofficial extra features. +.br +There are several adjustable rules which have a keyword each. If they +are mentioned with this option then their rule gets added to the relaxation +list. This list can be erased by rules "strict" or "clear". It can be reset +to its start setting by "default". The term "ISO file" means the plain ISO 9660 +names which get visible if the reader ignores Rock Ridge. +.br +Rule keywords are: +.br +"omit_version" do not add versions (";1") to the file names. +.br +"deep_paths" allow ISO file paths deeper than 8 levels. +.br +"long_paths" allow ISO file paths longer than 255 characters. +.br +"long_names" allow up to 37 characters with ISO file names. +.br +"no_force_dots" do not add a dot to filenames which have none. +.br +"lowercase" allow lowercase characters in ISO file names. +.br +"full_ascii" allow all ASCII characters in ISO file names. +.br +"joliet_long_paths" allow Joliet paths longer than 240 characters. +.br +"always_gmt" store timestamps in GMT representation with timezone 0. +.br +"old_rr" use Rock Ridge version 1.10 (needed if the intended reader +system does not recognize Rock Ridge 1.12 signature). +.br +"rec_mtime" record with ISO files the disk file's mtime and not the +creation time of the image. +.TP \fB\-volid\fR text Specify the volume ID. xorriso accepts any text up to 32 characters, but according to rarely obeyed specs stricter rules apply: diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index 5bf934a7..3088fbe1 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -3649,7 +3649,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->split_size= 0; strcpy(m->list_delimiter, "--"); m->do_joliet= 0; - m->do_always_gmt= 1; /* to avoid a timezone sign bug in FreeBSD */ + m->relax_compliance= 0; m->do_follow_pattern= 1; m->do_follow_param= 0; m->do_follow_links= 0; @@ -3804,6 +3804,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) ret= Exclusions_new(&(m->disk_exclusions), 0); if(ret<=0) goto failure; + Xorriso_relax_compliance(m, "default", 0); return(1); failure:; @@ -5688,6 +5689,11 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); + is_default= (Xorriso_get_relax_text(xorriso, sfe, 0) == 2); + sprintf(line,"-relax_compliance %s\n", sfe); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + if(xorriso->do_global_uid) { sprintf(line,"-uid %lu\n", (unsigned long) xorriso->global_uid); Xorriso_status_result(xorriso,filter,fp,flag&2); @@ -12473,6 +12479,9 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Specifies the application id. (128 chars)", " -joliet \"on\"|\"off\"", " Generate Joliet info additional to Rock Ridge info.", +" -relax_compliance rule[:rule...]", +" Allow more or less harmless deviations from strict standards", +" compliance.", " -boot_image \"any\"|\"isolinux\" \"discard\"|\"keep\"|\"patch\"|\"dir=\"", " \"bin_path=\"|\"cat_path=\"|\"load_size=\"", " Whether to discard or keep an exiting El Torito boot image.", @@ -14191,6 +14200,14 @@ int Xorriso_option_reassure(struct XorrisO *xorriso, char *mode, int flag) } +/* Option -relax_compliance */ +int Xorriso_option_relax_compliance(struct XorrisO *xorriso, char *mode, + int flag) +{ + return(Xorriso_relax_compliance(xorriso, mode, 0)); +} + + /* Option -report_about */ int Xorriso_option_report_about(struct XorrisO *xorriso, char *severity, int flag) @@ -14863,7 +14880,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "options_from_file","osirrox","outdev","out_charset","overwrite", "pacifier","padding","path_list","pathspecs","pkt_output","print","prompt", "prog","prog_help","publisher","quoted_not_list","quoted_path_list", - "reassure","report_about","rom_toc_scan", + "reassure","relax_compliance","report_about","rom_toc_scan", "session_log","speed","split_size","status","status_history_max", "stream_recording","temp_mem_limit","uid","volid","use_readline", "" @@ -15430,6 +15447,10 @@ next_command:; (*idx)++; ret= Xorriso_option_reassure(xorriso, arg1, 0); + } else if(strcmp(cmd,"relax_compliance")==0) { + (*idx)++; + Xorriso_option_relax_compliance(xorriso, arg1, 0); + } else if(strcmp(cmd,"report_about")==0) { (*idx)++; ret= Xorriso_option_report_about(xorriso, arg1, 0); diff --git a/xorriso/xorriso.h b/xorriso/xorriso.h index 10725c9d..f21b179f 100644 --- a/xorriso/xorriso.h +++ b/xorriso/xorriso.h @@ -611,6 +611,10 @@ int Xorriso_option_pwdx(struct XorrisO *xorriso, int flag); /* Option -reassure "on"|"tree"|"off" */ int Xorriso_option_reassure(struct XorrisO *xorriso, char *mode, int flag); +/* Option -relax_compliance */ +int Xorriso_option_relax_compliance(struct XorrisO *xorriso, char *mode, + int flag); + /* Option -report_about */ int Xorriso_option_report_about(struct XorrisO *xorriso, char *severity, int flag); diff --git a/xorriso/xorriso_eng.html b/xorriso/xorriso_eng.html index 3483db64..2c8c586f 100644 --- a/xorriso/xorriso_eng.html +++ b/xorriso/xorriso_eng.html @@ -2,7 +2,7 @@ - + xorriso homepage english @@ -14,7 +14,7 @@

Homepage of

xorriso

-

ISO 9660 Rock Ridge Filesystem Manipulator for Linux

+

ISO 9660 Rock Ridge Filesystem Manipulator for Linux and FreeBSD

@@ -48,10 +48,8 @@ and to MMC-5 for DVD or BD).

Linux with kernel 2.4 or higher (and libc, of course) :
With kernel 2.4 an ATA drive has to be under ide-scsi emulation.
With kernel 2.6 the drive should not be under ide-scsi.
-
libpthread
is supposed to be a standard system component.
libreadline and libreadline-dev
@@ -69,7 +67,7 @@ GPL software included:
(founded by Derek Foreman and Ben Jansens, developed and maintained since August 2006 by Thomas Schmitt from team of libburnia-project.org)
-
libisofs-0.6.10
+
libisofs-0.6.10.pl01
operates on ISO 9660 filesystem images.
(By Vreixo Formoso and Mario Danic from team of libburnia-project.org)
libisoburn-0.2.8
@@ -84,8 +82,7 @@ cdrecord and mkisofs.

This program has been tested on Intel/AMD Linux - -only.
+and on FreeBSD systems.
For ports to other usable systems contact us.

@@ -369,7 +366,7 @@ are interested in using BD-R media.

Download as source code (see README):

-
xorriso-0.2.8.pl00.tar.gz +
xorriso-0.2.8.pl01.tar.gz (1050 KB).
@@ -406,6 +403,15 @@ Bug fixes towards xorriso-0.2.6.pl00: --> + +Bug fixes towards xorriso-0.2.8.pl00 and xorriso-0.2.6.pl00: + +

@@ -438,6 +444,7 @@ Enhancements towards previous stable version xorriso-0.2.6.pl00:

  • New option -backslash_codes for terminal safety with weird file names
  • New options -charset, -in_charset, -out_charset
  • New option -application_id
  • +
  • New option -relax_compliance
  • diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index 8ee03db1..23d6af75 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -104,7 +104,7 @@ struct XorrisO { /* the global context of xorriso */ /* >>> put libisofs aspects here <<< */ int do_joliet; - int do_always_gmt; + int relax_compliance; /* opaque bitfield to be set by xorrisoburn */ int do_follow_pattern; int do_follow_param; int do_follow_links; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index c6556a2e..eea34004 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.11.21.160019" +#define Xorriso_timestamP "2008.11.21.160632" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 5c29d061..5ef98d18 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -109,6 +109,12 @@ int Xorriso_path_from_node(struct XorrisO *xorriso, IsoNode *node, int lba, #define Xorriso_cd_min_track_sizE 300 +/* Default setting for -relax_compliance */ +#define Xorriso_relax_compliance_defaulT \ + (isoburn_igopt_allow_deep_paths | isoburn_igopt_allow_longer_paths | \ + isoburn_igopt_always_gmt) + + /* ------------------------------------------------------------------------ */ @@ -1065,7 +1071,11 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) Xorriso_process_msg_queues(xorriso, 0); return(ret); } +#ifdef NIX relax= isoburn_igopt_allow_deep_paths; +#else + relax= xorriso->relax_compliance; +#endif xorriso->alignment= 0; image= isoburn_get_attached_image(source_drive); @@ -1221,8 +1231,15 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) } isoburn_igopt_set_level(sopts, 3); isoburn_igopt_set_extensions(sopts, 1|((!!xorriso->do_joliet)<<1)); + +#ifdef NIX isoburn_igopt_set_relaxed(sopts, isoburn_igopt_allow_deep_paths | - (xorriso->do_always_gmt * isoburn_igopt_always_gmt)); + (xorriso->do_always_gmt * isoburn_igopt_always_gmt) | + isoburn_igopt_rrip_version_1_10); +#else + isoburn_igopt_set_relaxed(sopts, relax); +#endif + isoburn_igopt_set_sort_files(sopts, 1); isoburn_igopt_set_over_mode(sopts, 0, 0, (mode_t) 0, (mode_t) 0); isoburn_igopt_set_over_ugid(sopts, 0, 0, (uid_t) 0, (gid_t) 0); @@ -7278,6 +7295,19 @@ int Xorriso_iso_file_open(struct XorrisO *xorriso, char *pathname, } Xorriso_process_msg_queues(xorriso,0); *stream= iso_stream; + +#ifdef NIX + /* <<< */ + { + unsigned int fs_id; + dev_t dev_id; + ino_t ino; + + iso_stream_get_id(iso_stream, &fs_id, &dev_id, &ino); + fprintf(stderr, "xorriso_debug: iso_ino= %ld\n", (long int) ino); + } +#endif + return(1); } @@ -8151,3 +8181,104 @@ cannot:; } +int Xorriso_relax_compliance(struct XorrisO *xorriso, char *mode, + int flag) +{ + char *npt, *cpt; + int l, was; + + was= xorriso->relax_compliance; + npt= cpt= mode; + for(; npt!=NULL; cpt= npt+1) { + npt= strchr(cpt,':'); + if(npt==NULL) + l= strlen(cpt); + else + l= npt-cpt; + if(l == 0) + continue; + if((l == 6 && strncmp(cpt, "strict", l) == 0) || + (l == 5 && strncmp(cpt, "clear", l) == 0)) { + xorriso->relax_compliance= 0; + } else if(l == 7 && strncmp(cpt, "default", l) == 0) { + xorriso->relax_compliance= Xorriso_relax_compliance_defaulT; + } else if(l == 12 && strncmp(cpt, "omit_version", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_omit_version_numbers; + } else if(l == 10 && strncmp(cpt, "deep_paths", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_allow_deep_paths; + } else if(l == 10 && strncmp(cpt, "long_paths", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_allow_longer_paths; + } else if(l == 10 && strncmp(cpt, "long_names", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_max_37_char_filenames; + } else if(l == 13 && strncmp(cpt, "no_force_dots", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_no_force_dots; + } else if(l == 9 && strncmp(cpt, "lowercase", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_allow_lowercase; + } else if(l == 10 && strncmp(cpt, "full_ascii", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_allow_full_ascii; + } else if(l == 17 && strncmp(cpt, "joliet_long_paths", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_joliet_longer_paths; + } else if(l == 10 && strncmp(cpt, "always_gmt", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_always_gmt; + } else if(l == 6 && strncmp(cpt, "old_rr", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_rrip_version_1_10; + } else if(l == 9 && strncmp(cpt, "rec_mtime", l) == 0) { + xorriso->relax_compliance|= isoburn_igopt_dir_rec_mtime; + } else if(l == 4 && strncmp(cpt, "help", l) == 0) { + + /* >>> */; + + } else { + if(linfo_text, "-relax_compliance: unknown mode '%s'", + cpt); + else + sprintf(xorriso->info_text, + "-relax_compliance: oversized mode parameter (%d)", l); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + xorriso->relax_compliance= was; + return(0); + } + } + return(1); +} + + +/* @return 1=ok 2=ok, is default setting */ +int Xorriso_get_relax_text(struct XorrisO *xorriso, char mode[1024], + int flag) +{ + int r; + + r= xorriso->relax_compliance; + if(r == 0) { + strcpy(mode, "strict"); + return(1); + } + strcpy(mode, "clear"); + if(r & isoburn_igopt_omit_version_numbers) + strcat(mode, ":omit_version"); + if(r & isoburn_igopt_allow_deep_paths) + strcat(mode, ":deep_paths"); + if(r & isoburn_igopt_allow_longer_paths) + strcat(mode, ":long_paths"); + if(r & isoburn_igopt_max_37_char_filenames) + strcat(mode, ":long_names"); + if(r & isoburn_igopt_no_force_dots) + strcat(mode, ":no_force_dots"); + if(r & isoburn_igopt_allow_lowercase) + strcat(mode, ":lowercase"); + if(r & isoburn_igopt_allow_full_ascii) + strcat(mode, ":full_ascii"); + if(r & isoburn_igopt_joliet_longer_paths) + strcat(mode, ":joliet_long_paths"); + if(r & isoburn_igopt_always_gmt) + strcat(mode, ":always_gmt"); + if(r & isoburn_igopt_rrip_version_1_10) + strcat(mode, ":old_rr"); + if(r & isoburn_igopt_dir_rec_mtime) + strcat(mode, ":rec_mtime"); + return(1 + (r == Xorriso_relax_compliance_defaulT)); +} + + diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index 3d0cf04b..a928c255 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -357,6 +357,14 @@ int Xorriso_extract_cut(struct XorrisO *xorriso, off_t img_offset, off_t bytes, int flag); +int Xorriso_relax_compliance(struct XorrisO *xorriso, char *mode, + int flag); + +/* @return 1=ok 2=ok, is default setting */ +int Xorriso_get_relax_text(struct XorrisO *xorriso, char mode[1024], + int flag); + + /* A pseudo file type for El-Torito bootsectors as in man 2 stat : For now take the highest possible value. */