diff --git a/xorriso/disk_ops.c b/xorriso/disk_ops.c index 67f6a84d..7a8bfb65 100644 --- a/xorriso/disk_ops.c +++ b/xorriso/disk_ops.c @@ -1775,7 +1775,7 @@ int Xorriso_afile_fopen(struct XorrisO *xorriso, if(fp==NULL){ if(!(flag&1)) { sprintf(xorriso->info_text, - "Failed to open file '%s' in %s mode\n", filename, mode); + "Failed to open file '%s' in %s mode", filename, mode); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0); } return(0); diff --git a/xorriso/emulators.c b/xorriso/emulators.c index 3edae7db..74a4371e 100644 --- a/xorriso/emulators.c +++ b/xorriso/emulators.c @@ -619,7 +619,7 @@ int Xorriso_genisofs_count_args(struct XorrisO *xorriso, int argc, char **argv, "-partition_sec_hd", "-partition_cyl_align", "-untranslated_name_len", "-rr_reloc_dir", "-hfsplus-serial-no", "-prep-boot-part", "-efi-boot-part", "-hfsplus-block-size", "-apm-block-size", "--grub2-mbr", - "--grub2-sparc-core", + "--grub2-sparc-core", "--sort-weight-list", "--sort-weight-patterns", "" }; static char arg2_options[][41]= { @@ -850,6 +850,8 @@ int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag) " isolinux_mbr=on|auto|off Control eventual isohybrid MBR generation", #endif " --sort-weight NUMBER FILE Set LBA weight number to file or file tree", +" --sort-weight-list DISKFILE Read list of NUMBER FILE pairs for --sort-weight", +" --sort-weight-patterns DISKFILE --sort-weight-list with pattern expansion", " --stdio_sync on|off|number Control forced output to disk files", " --no-emul-toc Save 64 kB size on random access output files", " --emul-toc Multi-session history on such output files", @@ -1143,10 +1145,10 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, int root_seen= 0, do_md5_mem, option_d= 0, arg_count; mode_t mode_and, mode_or; int with_boot_image= 0, with_cat_path= 0, with_emul_toc= 0; - int old_root_md5= 1, old_root_dev= 0, old_root_ino= 1; + int old_root_md5= 1, old_root_dev= 0, old_root_ino= 1, sort_file_pattern= 0; int *weight_list= NULL, weight_count= 0; int *delay_opt_list= NULL, delay_opt_count= 0; - char *sfe= NULL, *adr= NULL, ra_text[80], *pathspec= NULL; + char *sfe= NULL, *adr= NULL, ra_text[80], *pathspec= NULL, *sort_file= NULL; char *ept, *add_pt, *eff_path= NULL, *indev= NULL, msc[80], *cpt; char *old_root= NULL, *argpt, *hargv[1]; char *boot_path, partno_text[8], *iso_rr_pt, *disk_pt, *rpt, *wpt; @@ -1161,6 +1163,7 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, Xorriso_alloc_meM(eff_path, char, SfileadrL); Xorriso_alloc_meM(indev, char, SfileadrL+8); Xorriso_alloc_meM(old_root, char, SfileadrL); + Xorriso_alloc_meM(sort_file, char, SfileadrL); for(i= 0; iboot_image_cat_path[0]) with_cat_path= -1; - adr[0]= indev[0]= msc[0]= old_root[0]= 0; + adr[0]= indev[0]= msc[0]= old_root[0]= sort_file[0]= 0; for(i= 0; i= argc) + goto not_enough_args; + i++; + if(Sfile_str(sort_file, argv[i], 0) <= 0) + {ret= -1; goto ex;} + sort_file_pattern= (strcmp(argpt, "--sort-weight-patterns") == 0); + } else if(strcmp(argpt, "-z")==0 || strcmp(argpt, "-transparent-compression")==0) { /* was already handled in first argument scan */; @@ -2184,6 +2196,12 @@ problem_handler_2:; goto ex; } + if(sort_file[0]) { + ret= Xorriso_apply_sort_file(xorriso, sort_file, sort_file_pattern); + if(ret<=0) + goto ex; + } + for(j= 0; j < weight_count; j++) { i= weight_list[j]; /* find argv[i+2] -exec sort_weight argv[i+1] */ diff --git a/xorriso/iso_manip.c b/xorriso/iso_manip.c index acdaa2a4..373b718c 100644 --- a/xorriso/iso_manip.c +++ b/xorriso/iso_manip.c @@ -3954,3 +3954,85 @@ int Xorriso_get_blessing(struct XorrisO *xorriso, IsoNode *node, } +/* @param flag bit0= use file addresses as search patterns +*/ +int Xorriso_apply_sort_file(struct XorrisO *xorriso, char *path, int flag) +{ + int ret, linecount= 0, filec= 0, zero, i; + FILE *fp= NULL; + char *sret, *line= NULL, *spt, *tpt, *patterns[1], **filev= NULL; + char *sort_weight_args[4]; + off_t mem= 0; + IsoImage *volume; + + Xorriso_alloc_meM(line, char, SfileadrL); + + ret= Xorriso_get_volume(xorriso, &volume, 0); + if(ret<=0) + goto ex; + + ret= Xorriso_afile_fopen(xorriso, path, "rb", &fp, 2); + if(ret <= 0) + {ret= 0; goto ex;} + while(1) { + sret= Sfile_fgets_n(line, SfileadrL - 1, fp, 0); + if(sret == NULL) { + if(ferror(fp)) + {ret= 0; goto ex;} + break; + } + linecount++; + + /* Find first space or tab */ + spt= strchr(line, ' '); + tpt= strchr(line, '\t'); + if(spt == NULL || (tpt != NULL && tpt < spt)) + spt= tpt; + if(spt == NULL) { + sprintf(xorriso->info_text, + "No space or tab character found in line %d of sort weight file ", + linecount); + Text_shellsafe(path, xorriso->info_text, 1); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + ret= 0; goto ex; + } + *spt= 0; + + patterns[0]= spt + 1; + if(flag & 1) { + /* Obtain list of matching files */ + ret= Xorriso_expand_pattern(xorriso, 1, patterns, 0, + &filec, &filev, &mem, 4); + if(ret <= 0) + {ret= 0; goto ex;} + } else { + filec= 1; + } + + /* Apply weight to file or directory tree */ + for(i= 0; i < filec; i++) { + zero= 0; + if(flag & 1) { + sort_weight_args[0]= filev[i]; + } else { + sort_weight_args[0]= patterns[0]; + } + sort_weight_args[1]= "-exec"; + sort_weight_args[2]= "sort_weight"; + sort_weight_args[3]= line; + ret= Xorriso_option_find(xorriso, 4, sort_weight_args, &zero, 2); + if(ret <= 0) + {ret= 0; goto ex;} + } + if(flag & 1) + Sfile_destroy_argv(&filec, &filev, 0); + } + ret= 1; +ex: + if(fp != NULL) + fclose(fp); + Xorriso_free_meM(line); + Sfile_destroy_argv(&filec, &filev, 0); + return(ret); +} + diff --git a/xorriso/iso_tree.c b/xorriso/iso_tree.c index 1343b1a5..5ee172cc 100644 --- a/xorriso/iso_tree.c +++ b/xorriso/iso_tree.c @@ -1883,6 +1883,7 @@ ex:; /* @param flag bit0= a match count !=1 is a FAILURE event bit1= with bit0 tolerate 0 matches if pattern is a constant + bit2= do not issue debug messages about temporay memory needs */ int Xorriso_expand_pattern(struct XorrisO *xorriso, int num_patterns, char **patterns, int extra_filec, @@ -1965,7 +1966,7 @@ int Xorriso_expand_pattern(struct XorrisO *xorriso, mem+= extra_filec*sizeof(char *); if(count<=0) {ret= 0; goto ex;} - ret= Xorriso_alloc_pattern_mem(xorriso, *mem, count, filev, 0); + ret= Xorriso_alloc_pattern_mem(xorriso, *mem, count, filev, !!(flag & 4)); if(ret<=0) goto ex; /* now store addresses */ diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 2f456bd0..78777ffd 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2013.05.24.111243" +#define Xorriso_timestamP "2013.05.28.175212" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index 4fcba211..2bdf4105 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -608,5 +608,9 @@ int Xorriso_hfsplus_bless(struct XorrisO *xorriso, char *path, int Xorriso_pretend_full_disc(struct XorrisO *xorriso, int flag); + +int Xorriso_apply_sort_file(struct XorrisO *xorriso, char *path, int flag); + + #endif /* Xorrisoburn_includeD */ diff --git a/xorriso/xorrisofs.1 b/xorriso/xorrisofs.1 index ac93dc59..3d345db3 100644 --- a/xorriso/xorrisofs.1 +++ b/xorriso/xorrisofs.1 @@ -9,7 +9,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 XORRISOFS 1 "Version 1.3.1, May 17, 2013" +.TH XORRISOFS 1 "Version 1.3.1, May 27, 2013" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -374,6 +374,35 @@ Currently the El Torito boot catalog has a hardcoded weight of 1 billion. Normally it should occupy the block with the lowest possible address. Data files get added or loaded with initial weight 0. .TP +\fB--sort-weight-list\fR disk_path +Read pairs of weight number and iso_rr_path from a file of the +local filesystem. Apply each pair like with \-\-sort\-weight. +.br +Only the last \-\-sort\-weight\-list or +\-\-sort\-weight\-patterns of a xorrisofs run gets into effect. +.br +The weight number is read from the start of the line. +The iso_rr_path part of an input line begins immediately after the first blank +or tab character of the line. +.br +Notes for the case that this feature is used within a sequence of generic +xorriso commands (not an issue with a pure mkisofs emulation run): +.br +The addressed files must already be in the ISO image model when you execute +.br + \-as mkisofs \-\-sort\-weight\-list disk_path \-\- +.br +Several such commands may be used to apply more than one weight file. +.br +Data files which are loaded by \-indev or \-dev get a weight between 1 and +2 exp 28 = 268,435,456, depending on their block address. This shall keep +them roughly in the same order if the write method of modifying is applied. +.TP +\fB--sort-weight-patterns\fR disk_path +Like \-\-sort\-weight\-list , but expanding the iso_rr_paths as +shell parser patterns and applying \-\-sort\-weight to each +matching file. +.TP \fB\-dir-mode\fR mode Set the access permissions for all directories in the image to the given mode which is either an octal number beginning with "0" or a comma separated diff --git a/xorriso/xorrisofs.info b/xorriso/xorrisofs.info index 3fdba406..d10ecc3d 100644 --- a/xorriso/xorrisofs.info +++ b/xorriso/xorrisofs.info @@ -393,6 +393,31 @@ File: xorrisofs.info, Node: SetProduct, Next: SetCompl, Prev: SetInsert, Up: the block with the lowest possible address. Data files get added or loaded with initial weight 0. +--sort-weight-list disk_path + Read pairs of weight number and iso_rr_path from a file of the + local filesystem. Apply each pair like with --sort-weight. + Only the last --sort-weight-list or --sort-weight-patterns of a + xorrisofs run gets into effect. + The weight number is read from the start of the line. The + iso_rr_path part of an input line begins immediately after the + first blank or tab character of the line. + Notes for the case that this feature is used within a sequence of + generic xorriso commands (not an issue with a pure mkisofs + emulation run): + The addressed files must already be in the ISO image model when + you execute + -as mkisofs --sort-weight-list disk_path -- + Several such commands may be used to apply more than one weight + file. + Data files which are loaded by -indev or -dev get a weight between + 1 and 2 exp 28 = 268,435,456, depending on their block address. + This shall keep them roughly in the same order if the write method + of modifying is applied. + +--sort-weight-patterns disk_path + Like --sort-weight-list , but expanding the iso_rr_paths as shell + parser patterns and applying --sort-weight to each matching file. + -dir-mode mode Set the access permissions for all directories in the image to the given mode which is either an octal number beginning with "0" or a @@ -1753,7 +1778,7 @@ File: xorrisofs.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: T * --no_rc do not execute startup files: Miscellaneous. (line 19) * --norock disable Rock Ridge production: SetExtras. (line 25) * --old-empty old block addresses for empty files: SetProduct. - (line 81) + (line 106) * --old-root-devno enable disk idevno with -old-root: SetInsert. (line 97) * --old-root-no-ino disable disk ino with -old-root: SetInsert. @@ -1764,7 +1789,12 @@ File: xorrisofs.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: T * --quoted_path_list read pathspecs from disk file: SetInsert. (line 13) * --scdbackup_tag Recording of MD5 checksum: SetExtras. (line 101) -* --sort-weight set output file address: SetProduct. (line 49) +* --sort-weight set block address sorting weight: SetProduct. + (line 49) +* --sort-weight-list set block address sorting weight: SetProduct. + (line 60) +* --sort-weight-patterns set block address sorting weight: SetProduct. + (line 81) * --stdio_sync control forced output to disk files: SetProduct. (line 25) * --xattr Recording of xattr: SetExtras. (line 77) @@ -1791,7 +1821,7 @@ File: xorrisofs.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: T * -D allow deep directory hierachies: SetExtras. (line 31) * -d omit trailing dot in ISO file names: SetCompl. (line 56) * -dev set path for loading existing ISO image: Loading. (line 25) -* -dir-mode permissions for all directories: SetProduct. (line 60) +* -dir-mode permissions for all directories: SetProduct. (line 85) * -disable-deep-relocation allow deep directory hierachies: SetExtras. (line 44) * -disallow_dir_id_ext enforce ISO level 1 directory names: SetCompl. @@ -1809,7 +1839,7 @@ File: xorrisofs.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: T * -exclude-list exclude disk files from inserting: SetInsert. (line 51) * -f follow symbolic links on disk: SetInsert. (line 24) -* -file-mode permissions for all data files: SetProduct. (line 66) +* -file-mode permissions for all data files: SetProduct. (line 91) * -follow-links follow symbolic links on disk: SetInsert. (line 28) * -full-iso9660-filenames allow 31 characters in ISO file names: SetCompl. (line 66) @@ -1873,7 +1903,7 @@ File: xorrisofs.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: T * -mipsel-boot MIPS Little Endian boot image: SystemArea. (line 178) * -N omit version number in ISO file names: SetCompl. (line 73) * -no-emul-boot El Torito boot image emulation: Bootable. (line 72) -* -no-pad do not add zeros to ISO tree: SetProduct. (line 76) +* -no-pad do not add zeros to ISO tree: SetProduct. (line 101) * -o set output file address: SetProduct. (line 8) * -old-exclude exclude disk files from inserting: SetInsert. (line 48) @@ -1887,7 +1917,7 @@ File: xorrisofs.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: T (line 21) * -p set Preparer Id: ImageId. (line 54) * -P set Publisher Id: ImageId. (line 30) -* -pad add 300 KiB of zeros to ISO tree: SetProduct. (line 69) +* -pad add 300 KiB of zeros to ISO tree: SetProduct. (line 94) * -partition_cyl_align Image size alignment: SystemArea. (line 116) * -partition_hd_cyl MBR heads per cylinder: SystemArea. (line 99) * -partition_offset Make mountable by partition 1: SystemArea. @@ -1945,7 +1975,12 @@ File: xorrisofs.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * Application Id, set, -A, -appid: ImageId. (line 38) * Backup, enable fidelity, --for_backup: SetExtras. (line 67) * Biblio File, set path, -biblio: ImageId. (line 72) -* Block address, set sort weight, --sort-weight: SetProduct. (line 49) +* Block address, set sorting weight, --sort-weight: SetProduct. + (line 49) +* Block address, set sorting weight, --sort-weight-list: SetProduct. + (line 60) +* Block address, set sorting weight, --sort-weight-patterns: SetProduct. + (line 81) * Bootability, boot catalog hidden, --boot-catalog-hide: Bootable. (line 114) * Bootability, boot catalog name, -c, -eltorito-catalog: Bootable. @@ -2087,15 +2122,15 @@ File: xorrisofs.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top (line 87) * Options, list, -help: Miscellaneous. (line 23) * Output file, set address, -o, -output: SetProduct. (line 8) -* Padding, 300 KiB, -pad: SetProduct. (line 69) -* Padding, disable, --old-empty: SetProduct. (line 81) -* Padding, disable, -no-pad: SetProduct. (line 76) +* Padding, 300 KiB, -pad: SetProduct. (line 94) +* Padding, disable, --old-empty: SetProduct. (line 106) +* Padding, disable, -no-pad: SetProduct. (line 101) * pathspec, _definition: Insert. (line 12) * pathspec, enable target=source, -graft-points: SetInsert. (line 31) * pathspec, read list of, --quoted_path_list: SetInsert. (line 13) * pathspec, read list of, -path-list: SetInsert. (line 8) -* Permissions, for all data files, -file-mode: SetProduct. (line 66) -* Permissions, for all directories, -dir-mode: SetProduct. (line 60) +* Permissions, for all data files, -file-mode: SetProduct. (line 91) +* Permissions, for all directories, -dir-mode: SetProduct. (line 85) * Preparer Id, set, -p: ImageId. (line 54) * Problems, reporting: Bugreport. (line 6) * Program version, report, -version: Miscellaneous. (line 42) @@ -2135,28 +2170,28 @@ Node: Options6709 Node: Loading7436 Node: SetInsert9732 Node: SetProduct14148 -Node: SetCompl17855 -Node: SetExtras20451 -Node: SetHide28860 -Node: ImageId30168 -Node: Bootable33673 -Node: SystemArea38667 -Node: Charset48964 -Node: Jigdo49990 -Node: Miscellaneous54257 -Node: Examples55813 -Node: ExSimple56299 -Node: ExGraft56778 -Node: ExMkisofs58025 -Node: ExGrowisofs59278 -Node: ExIncBackup60450 -Node: ExIncBckAcc63558 -Node: ExBootable65234 -Node: Files67326 -Node: Seealso68400 -Node: Bugreport69056 -Node: Legal69637 -Node: CommandIdx70532 -Node: ConceptIdx84598 +Node: SetCompl19092 +Node: SetExtras21688 +Node: SetHide30097 +Node: ImageId31405 +Node: Bootable34910 +Node: SystemArea39904 +Node: Charset50201 +Node: Jigdo51227 +Node: Miscellaneous55494 +Node: Examples57050 +Node: ExSimple57536 +Node: ExGraft58015 +Node: ExMkisofs59262 +Node: ExGrowisofs60515 +Node: ExIncBackup61687 +Node: ExIncBckAcc64795 +Node: ExBootable66471 +Node: Files68563 +Node: Seealso69637 +Node: Bugreport70293 +Node: Legal70874 +Node: CommandIdx71769 +Node: ConceptIdx86187  End Tag Table diff --git a/xorriso/xorrisofs.texi b/xorriso/xorrisofs.texi index a8da9b9d..d78e1d73 100644 --- a/xorriso/xorrisofs.texi +++ b/xorriso/xorrisofs.texi @@ -50,7 +50,7 @@ @c man .\" First parameter, NAME, should be all caps @c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection @c man .\" other parameters are allowed: see man(7), man(1) -@c man .TH XORRISOFS 1 "Version 1.3.1, May 17, 2013" +@c man .TH XORRISOFS 1 "Version 1.3.1, May 27, 2013" @c man .\" Please adjust this date whenever revising the manpage. @c man .\" @c man .\" Some roff macros, for reference: @@ -545,8 +545,8 @@ files. This is the default. @c man .TP @item @minus{}@minus{}sort-weight weight_number iso_rr_path -@kindex @minus{}@minus{}sort-weight set output file address -@cindex Block address, set sort weight, @minus{}@minus{}sort-weight +@kindex @minus{}@minus{}sort-weight set block address sorting weight +@cindex Block address, set sorting weight, @minus{}@minus{}sort-weight Attribute a LBA weight number to regular files. If iso_rr_path leads to a directory then all regular files underneath will get the weight_number. @* @@ -557,6 +557,39 @@ Currently the El Torito boot catalog has a hardcoded weight of 1 billion. Normally it should occupy the block with the lowest possible address. Data files get added or loaded with initial weight 0. @c man .TP +@item @minus{}@minus{}sort-weight-list disk_path +@kindex @minus{}@minus{}sort-weight-list set block address sorting weight +@cindex Block address, set sorting weight, @minus{}@minus{}sort-weight-list +Read pairs of weight number and iso_rr_path from a file of the +local filesystem. Apply each pair like with @minus{}@minus{}sort-weight. +@* +Only the last @minus{}@minus{}sort-weight-list or +@minus{}@minus{}sort-weight-patterns of a xorrisofs run gets into effect. +@* +The weight number is read from the start of the line. +The iso_rr_path part of an input line begins immediately after the first blank +or tab character of the line. +@* +Notes for the case that this feature is used within a sequence of generic +xorriso commands (not an issue with a pure mkisofs emulation run): +@* +The addressed files must already be in the ISO image model when you execute +@* + -as mkisofs @minus{}@minus{}sort-weight-list disk_path @minus{}@minus{} +@* +Several such commands may be used to apply more than one weight file. +@* +Data files which are loaded by -indev or -dev get a weight between 1 and +2 exp 28 = 268,435,456, depending on their block address. This shall keep +them roughly in the same order if the write method of modifying is applied. +@c man .TP +@item @minus{}@minus{}sort-weight-patterns disk_path +@kindex @minus{}@minus{}sort-weight-patterns set block address sorting weight +@cindex Block address, set sorting weight, @minus{}@minus{}sort-weight-patterns +Like @minus{}@minus{}sort-weight-list , but expanding the iso_rr_paths as +shell parser patterns and applying @minus{}@minus{}sort-weight to each +matching file. +@c man .TP @item -dir-mode mode @kindex -dir-mode permissions for all directories @cindex Permissions, for all directories, -dir-mode