diff --git a/xorriso/findjob.h b/xorriso/findjob.h index f51eabdf..d383d5bc 100644 --- a/xorriso/findjob.h +++ b/xorriso/findjob.h @@ -52,6 +52,7 @@ struct ExprtesT { 21= -bad_outname int namespace 22= -use_pattern char *arg1 ("on" [or "ls"], "off") 23= -or_use_pattern char *arg1 ("on" [or "ls"], "off") + 24= -name_limit_blocker int *arg1 */ int test_type; @@ -174,6 +175,12 @@ struct FindjoB { 51= report_sections 52= show_stream_id 53= internal: show_hfs_cmd , controlled by xorriso->show_hfs_cmd* + 54= internal: truncate_names + 55= internal: unique_trunc_test lenght + test for not uniquely truncatable names, + result delivered in XorrisO.find_unique_trunc_result + 56= like 54 but tolerating existing truncated names + 57= like 55 but tolerating existing truncated names */ int action; int prune; @@ -185,7 +192,8 @@ struct FindjoB { uid_t user; gid_t group; mode_t mode_and, mode_or; - int type; /* see Xorriso_set_time flag, also used as weight */ + int type; /* see Xorriso_set_time flag, + also used as weight and truncate_length */ time_t date; char *found_path; off_t estim_upper_size; diff --git a/xorriso/iso_manip.c b/xorriso/iso_manip.c index 197ab325..17af61be 100644 --- a/xorriso/iso_manip.c +++ b/xorriso/iso_manip.c @@ -2864,6 +2864,16 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job, } ret= 1; + } else if(action == 54 || action == 56) { /* internal: truncate_name */ + ret= Xorriso_truncate_uniquely(xorriso, xorriso->file_name_limit, + node, abs_path, show_path, + 2 * (action == 56)); + + } else if(action == 55 || action == 57) { + /* internal: unique_trunc_test length (in type) */ + ret= Xorriso_truncate_uniquely(xorriso, type, node, abs_path, show_path, + 1 | (2 * (action == 57))); + } else { /* includes : 15 in_iso */ Xorriso_esc_filepath(xorriso, show_path, xorriso->result_line, 0); strcat(xorriso->result_line, "\n"); @@ -3177,6 +3187,11 @@ return: ftest->boss->use_pattern= (strcmp(arg1, "off") != 0); value= 0; + break; case 24: /* -name_limit_blocker */ + ret= Xorriso_truncate_uniquely(xorriso, *((int *) arg1), node, path, path, + 1 | 4); + value= (ret == 0); + break; default: /* >>> complain about unknown test type */; @@ -4262,32 +4277,186 @@ ex: } -/* @param flag bit0= allow to increase limit for loaded image +/* @param flag bit0= tolerate truncated files of old length + and mangle collisions */ int Xorriso_set_file_name_limit(struct XorrisO *xorriso, int value, int flag) { int ret; IsoImage *volume= NULL; + struct FindjoB *job= NULL; + struct stat dir_stbuf; ret= Xorriso_get_volume(xorriso, &volume, 1); if(ret < 0) - return(ret); - if (volume != NULL) { - if(flag & 1) { - - /* >>> check whether there are non-refreshable truncated names */; - - /* >>> refresh truncation of names */; - - iso_image_set_truncate_mode(volume, 1, value); - } else { + goto ex; + if (ret == 1 && volume != NULL) { + /* Check whether there are non-refreshable truncated names */ + ret= Findjob_new(&job, "/", 0); + if(ret<=0) { + Xorriso_no_findjob(xorriso, "xorriso", 0); + {ret= -1; goto ex;} + } + Findjob_set_action_type(job, 55 + 2 * (flag & 1), value, 0); + xorriso->find_unique_trunc_result= 2; + ret= Xorriso_findi(xorriso, job, NULL, (off_t) 0, NULL, "/", + &dir_stbuf, 0, 0); + if(ret < 0) + goto ex; + xorriso->request_to_abort= 0; + if(xorriso->find_unique_trunc_result == 0 && !(flag & 1)) { Xorriso_msgs_submit(xorriso, 0, - "-file_name_limit may not be changed because a drive is acquired", - 0, "SORRY", 0); - return(0); + "-file_name_limit may not be changed because truncated files exist or collisions would occur", + 0, "SORRY", 0); + ret= 0; goto ex; + } + + xorriso->file_name_limit= value; + iso_image_set_truncate_mode(volume, 1, value); + + /* truncations are necessary */; + if(xorriso->find_unique_trunc_result == 1) { + Findjob_set_action_type(job, 54 + 2 * (flag & 1), + xorriso->file_name_limit, 0); + xorriso->find_unique_trunc_result= 2; + ret= Xorriso_findi(xorriso, job, NULL, (off_t) 0, NULL, "/", + &dir_stbuf, 0, 0); + if(ret < 0) + goto ex; + if(xorriso->find_unique_trunc_result == 0) { + + /* >>> Did not work . What to do ? */; + + } } } xorriso->file_name_limit= value; - return(1); + ret= 1; +ex:; + Findjob_destroy(&job, 0); + return(ret); +} + + +/* @param flag bit0= test for uniqueness, do not change name + bit1= tolerate existing truncated names and mangle collisions + bit2= be silent about non-uniquely truncatables + do not set xorriso->request_to_abort +*/ +int Xorriso_truncate_uniquely(struct XorrisO *xorriso, int length, + IsoNode *node, char *abs_path, char *show_path, + int flag) +{ + int ret, l, i; + unsigned int mangleno; + char *name, *trunc= NULL, *old_name= NULL; + IsoDir *dir; + IsoNode *collider; + IsoImage *volume= NULL; + + name= (char *) iso_node_get_name(node); + l= strlen(name); + + /* Check for truncated name */ + if(l == xorriso->file_name_limit && l != length && !(flag & 2)) { + i= 0; + if(name[l - 33] == ':') { + for(i= l - 32; i < l; i++) + if((name[i] < '0' || name[i] > '9') && + (name[i] < 'a' || name[i] > 'f')) + break; + } + if(i == l) { + if(!(flag & 4)) { + sprintf(xorriso->info_text, "Truncated name of current limit found: "); + Text_shellsafe(name, xorriso->info_text, 1); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + } + xorriso->find_unique_trunc_result= 0; + {ret= 0; goto ex;} + } + } + + /* Check for need to truncate */ + if(l <= length) + {ret= 1; goto ex;} + + if(xorriso->find_unique_trunc_result > 1) + xorriso->find_unique_trunc_result= 1; + trunc= strdup(name); + old_name= strdup(name); + if(trunc == NULL || old_name == NULL) { + Xorriso_no_malloc_memory(xorriso, NULL, 0); + ret= -1; goto ex; + } + ret= iso_truncate_leaf_name(1, length, trunc, 0); + if(ret < 0) { + Xorriso_process_msg_queues(xorriso, 0); + Xorriso_report_iso_error(xorriso, "", ret, + "Error when truncating file name", 0, "SORRY", 1); + xorriso->find_unique_trunc_result= 0; + {ret= 0; goto ex;} + } + + dir= iso_node_get_parent(node); + if(dir != NULL) { + /* (intentionally using deprecated call which does not truncate by itself)*/ + ret= iso_dir_get_node(dir, trunc, &collider); + if(ret == 1) { + if((flag & 1) && !(flag & 2)) { + if(!(flag & 4)) { + sprintf(xorriso->info_text, + "Truncated name collides with existing name: "); + Text_shellsafe(name, xorriso->info_text, 1); + strcat(xorriso->info_text, " -> "); + Text_shellsafe(trunc, xorriso->info_text, 1); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + } + xorriso->find_unique_trunc_result= 0; + {ret= 0; goto ex;} + } else { + /* Mangle */ + for(mangleno= 0; mangleno < 0xffffffff; mangleno++) { + Sfile_flatten_utf8_heads(trunc, length - 33 - 9, 0); + sprintf(trunc + length - 33 - 9, ":%-8.8X", mangleno); + trunc [length - 33] = ':'; + ret= iso_dir_get_node(dir, trunc, &collider); + if(ret == 0) + break; + } + } + } + } + + /* If only for testing: done now */ + if(flag & 1) + {ret= 1; goto ex;} + if(xorriso->file_name_limit != length) + {ret= -1; goto ex;} /* Programming error */ + ret= Xorriso_get_volume(xorriso, &volume, 1); + if(ret < 0) + {ret= -1; goto ex;} /* Programming error */ + + /* Set truncated name */ + ret= iso_image_set_node_name(volume, node, trunc, 0); + if(ret < 0) { + Xorriso_process_msg_queues(xorriso, 0); + xorriso->find_unique_trunc_result= 0; + {ret= 0; goto ex;} + } + Xorriso_set_change_pending(xorriso, 0); + sprintf(xorriso->info_text, "Truncated: "); + Text_shellsafe(old_name, xorriso->info_text, 1); + strcat(xorriso->info_text, " -> "); + Text_shellsafe(trunc, xorriso->info_text, 1); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); + + ret= 1; +ex:; + if(ret == 0 && (flag & 1) && !(flag & 4)) + xorriso->request_to_abort= 1; + Xorriso_free_meM(old_name); + Xorriso_free_meM(trunc); + return(ret); } diff --git a/xorriso/iso_manip.h b/xorriso/iso_manip.h index d5d3f357..a90cd1de 100644 --- a/xorriso/iso_manip.h +++ b/xorriso/iso_manip.h @@ -73,5 +73,9 @@ int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag); int Xorriso_get_blessing(struct XorrisO *xorriso, IsoNode *node, int *bless_idx, char bless_code[17], int flag); +int Xorriso_truncate_uniquely(struct XorrisO *xorriso, int length, + IsoNode *node, char *abs_path, char *show_path, + int flag); + #endif /* ! Xorriso_pvt_iso_manip_includeD */ diff --git a/xorriso/opts_d_h.c b/xorriso/opts_d_h.c index d6556f32..9c087324 100644 --- a/xorriso/opts_d_h.c +++ b/xorriso/opts_d_h.c @@ -664,6 +664,8 @@ int Xorriso_option_file_name_limit(struct XorrisO *xorriso, char *value, Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); return(0); } + if(num == xorriso->file_name_limit) + return(1); ret= Xorriso_set_file_name_limit(xorriso, (int) num, sub_flag); return(ret > 0); } @@ -1009,6 +1011,19 @@ not_enough_arguments:; argv[i], 0); if(ret <= 0) goto ex; + } else if(strcmp(argv[i], "-name_limit_blocker") == 0) { + if(i + 1 >= end_idx) + goto not_enough_arguments; + i++; + sscanf(argv[i], "%d", &count); + if(count < 64 || count > 255) { + sprintf(xorriso->info_text, + "-findi: wrong length with -name_limit_blocker [64...255]"); + goto sorry_ex; + } + ret= Findjob_set_num_filter(job, 24, count, 0, 0); + if(ret <= 0) + goto ex; } else if(strcmp(argv[i], "-exec")==0) { if(i+1>=end_idx) { not_enough_exec_arguments:; @@ -2000,6 +2015,7 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " -lba_range start count, -damaged, -has_acl, -has_xattr,", " -has_aaip, -has_filter, -has_md5, -has_any_xattr,", " -has_hfs_crtp, -has_hfs_bless, -bad_outname,", +" -name_limit_blocker", " -prune, -decision yes|no, -true, -false", " Operators: -not, -or, -and, -sub, (, -subend, ),", " -if, -then, -elseif, -else, -endif", diff --git a/xorriso/sfile.c b/xorriso/sfile.c index 37d533c9..c0dcedab 100644 --- a/xorriso/sfile.c +++ b/xorriso/sfile.c @@ -937,3 +937,43 @@ decode:; } +/* From libisofs: + Find backward from idx the start byte of a possible UTF-8 character. + https://en.wikipedia.org/wiki/UTF-8#Description +*/ +static +int find_utf8_start(char *name, int idx, int flag) +{ + unsigned char *uname, uch; + int i; + + uname= (unsigned char *) name; + if ((uname[idx] & 0xc0) != 0x80) + return idx; /* not an UTF-8 tail byte */ + for (i = 0; i < 5 && idx - 1 - i >= 0; i++) { + /* up to deprecated 6-byte codes */ + uch = uname[idx - 1 - i]; + if ((uch & 0xe0) == 0xc0 || (uch & 0xf0) == 0xe0 || + (uch & 0xf8) == 0xf0 || (uch & 0xfc) == 0xf8 || + (uch & 0xfe) == 0xfc) + return (idx - 1 - i); /* UTF-8 start byte found */ + if ((uch & 0xc0) != 0x80) + return idx; /* not an UTF-8 tail byte, so no UTF-8 */ + } + return idx; /* no UTF-8 start found */ +} + + +int Sfile_flatten_utf8_heads(char *name, int idx, int flag) +{ + int neck; + + neck = find_utf8_start(name, idx, 0); + if(neck >= idx) + return(2); + for(; neck < idx; neck++) + name[neck] = '_'; + return(1); +} + + diff --git a/xorriso/sfile.h b/xorriso/sfile.h index d0840d20..758a5ef2 100644 --- a/xorriso/sfile.h +++ b/xorriso/sfile.h @@ -139,5 +139,7 @@ int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag); int Sfile_get_dev_fd_no(char *filename, int flag); +int Sfile_flatten_utf8_heads(char *name, int idx, int flag); + #endif /* ! Xorriso_pvt_sfile_includeD */ diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index 0fa3e79e..7df746d1 100644 --- a/xorriso/xorriso.1 +++ b/xorriso/xorriso.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 XORRISO 1 "Version 1.4.1, Sep 25, 2015" +.TH XORRISO 1 "Version 1.4.1, Sep 28, 2015" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -993,14 +993,17 @@ oversized name. Potential incomplete UTF\-8 characters will get their leading bytes replaced by '_'. .br iso_rr_paths with the long components will still be able to access the -file paths with truncated components. To avoid confusion by having both -truncated and untruncated names in the same directory, it is highly deprecated -to change this setting after a drive was acquired. All file names must get -truncated by the same length. +file paths with truncated components. .br -Normally this command will produce a SORRY event if it is executed while a -drive is aquired. One may override this ban by prepending the character "+" -to the argument of \-file_name_limit. +If \-file_name_limit is executed while an ISO tree is present, the file names +in the ISO tree get checked for existing truncated file names of the current +limit and for name collisions between newly truncated files and existing files. +In both cases, the setting will be refused with a SORRY event. +.br +One may lift this ban by prepending the character "+" to the argument +of \-file_name_limit. Truncated filenames may then get truncated again, +invalidating their MD5 part. Colliding truncated names are made unique, +consuming at least 9 more bytes of the remaining name part. .br If writing of xattr is enabled, then the length will be stored in "isofs.nt" of the root directory. @@ -1886,6 +1889,10 @@ to name length, permissible characters, and mandatory name components. "rockridge" uses the character set defined by \-out_charset, "joliet" uses UCS\-2BE, "ecma119" uses ASCII, "hfsplus" uses UTF\-16BE. .br +\fB\-name_limit_blocker\fR length : +Matches file names which would prevent command \-file_name_limit with the +given length. The command itself reports only the first problem file. +.br \fB\-prune\fR : If this test is reached and the tested file is a directory then \-find will not dive into that directory. This test itself does always match. @@ -2156,6 +2163,7 @@ E.g.: \-exec sort_weight 3 \-\- .br \fBshow_stream\fR shows the content stream chain of a data file. +.br \fBshow_stream_id\fR is like show_stream, but also prints between stream type and first ":" in square brackets libisofs id numbers: [fs_id,dev_id,ino_id]. diff --git a/xorriso/xorriso.info b/xorriso/xorriso.info index 44901db0..46f0f6db 100644 --- a/xorriso/xorriso.info +++ b/xorriso/xorriso.info @@ -894,13 +894,17 @@ activate them only after image loading. bytes of the whole oversized name. Potential incomplete UTF-8 characters will get their leading bytes replaced by '_'. iso_rr_paths with the long components will still be able to access - the file paths with truncated components. To avoid confusion by - having both truncated and untruncated names in the same directory, - it is highly deprecated to change this setting after a drive was - acquired. All file names must get truncated by the same length. - Normally this command will produce a SORRY event if it is executed - while a drive is aquired. One may override this ban by prepending - the character "+" to the argument of -file_name_limit. + the file paths with truncated components. + If -file_name_limit is executed while an ISO tree is present, the + file names in the ISO tree get checked for existing truncated file + names of the current limit and for name collisions between newly + truncated files and existing files. In both cases, the setting + will be refused with a SORRY event. + One may lift this ban by prepending the character "+" to the + argument of -file_name_limit. Truncated filenames may then get + truncated again, invalidating their MD5 part. Colliding truncated + names are made unique, consuming at least 9 more bytes of the + remaining name part. If writing of xattr is enabled, then the length will be stored in "isofs.nt" of the root directory. If reading of xattr is enabled and "isofs.nt" is found, then the found length will get into effect @@ -1620,6 +1624,10 @@ File: xorriso.info, Node: CmdFind, Next: Filter, Prev: Manip, Up: Commands mandatory name components. "rockridge" uses the character set defined by -out_charset, "joliet" uses UCS-2BE, "ecma119" uses ASCII, "hfsplus" uses UTF-16BE. + -name_limit_blocker length : + Matches file names which would prevent command + -file_name_limit with the given length. The command itself + reports only the first problem file. -prune : If this test is reached and the tested file is a directory then -find will not dive into that directory. This test @@ -5033,11 +5041,11 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -assert_volid rejects undesired images: Loading. (line 111) * -auto_charset learns character set from image: Loading. (line 123) * -backslash_codes enables backslash conversion: Scripting. (line 71) -* -ban_stdio_write demands real drive: Loading. (line 312) +* -ban_stdio_write demands real drive: Loading. (line 316) * -biblio_file sets biblio file name: SetWrite. (line 234) * -blank erases media: Writing. (line 57) * -boot_image controls bootability: Bootable. (line 65) -* -calm_drive reduces drive activity: Loading. (line 302) +* -calm_drive reduces drive activity: Loading. (line 306) * -cd sets working directory in ISO: Navigate. (line 7) * -cdx sets working directory on disk: Navigate. (line 15) * -changes_pending overrides change status: Writing. (line 12) @@ -5071,7 +5079,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -cp_rx copies file trees to disk: Restore. (line 103) * -cp_rx copies file trees to disk <1>: Restore. (line 111) * -cut_out inserts piece of data file: Insert. (line 118) -* -data_cache_size adjusts read cache size: Loading. (line 328) +* -data_cache_size adjusts read cache size: Loading. (line 332) * -dev acquires one drive for input and output: AqDrive. (line 12) * -devices gets list of drives: Inquiry. (line 7) * -device_links gets list of drives: Inquiry. (line 17) @@ -5087,7 +5095,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -dusx show directory size on disk: Navigate. (line 85) * -dux show directory size on disk: Navigate. (line 81) * -dvd_obs set write block size: SetWrite. (line 314) -* -early_stdio_test classifies stdio drives: Loading. (line 316) +* -early_stdio_test classifies stdio drives: Loading. (line 320) * -ecma119_map names w/o Rock Ridge, Joliet: Loading. (line 214) * -eject ejects drive tray: Writing. (line 50) * -end writes pending session and ends program: Scripting. (line 151) @@ -5204,7 +5212,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top (line 51) * -rollback discards pending changes: Writing. (line 9) * -rollback_end ends program without writing: Scripting. (line 154) -* -rom_toc_scan searches for sessions: Loading. (line 274) +* -rom_toc_scan searches for sessions: Loading. (line 278) * -rr_reloc_dir sets name of relocation directory: SetWrite. (line 144) * -scdbackup_tag enables scdbackup checksum tag: Emulation. (line 179) * -scsi_log reports SCSI commands: Scripting. (line 143) @@ -5311,8 +5319,8 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * Directory, delete, -rmdir: Manip. (line 29) * disk_path, _definition: Insert. (line 6) * Drive, accessability, -drive_class: Loading. (line 73) -* Drive, classify stdio, -early_stdio_test: Loading. (line 316) -* Drive, demand real MMC, -ban_stdio_write: Loading. (line 312) +* Drive, classify stdio, -early_stdio_test: Loading. (line 320) +* Drive, demand real MMC, -ban_stdio_write: Loading. (line 316) * Drive, eject tray, -eject: Writing. (line 50) * Drive, for input and output, -dev: AqDrive. (line 12) * Drive, for input, -indev: AqDrive. (line 23) @@ -5320,7 +5328,7 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * Drive, get drive list, -devices: Inquiry. (line 7) * Drive, get drive list, -device_links: Inquiry. (line 17) * Drive, list supported media, -list_profiles: Writing. (line 177) -* Drive, reduce activity, -calm_drive: Loading. (line 302) +* Drive, reduce activity, -calm_drive: Loading. (line 306) * Drive, report SCSI commands, -scsi_log: Scripting. (line 143) * Drive, write and eject, -commit_eject: Writing. (line 53) * Drive, _definition: Drives. (line 6) @@ -5359,7 +5367,7 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * HFS+ serial number: Bootable. (line 339) * hidden, set in ISO image, -hide: Manip. (line 171) * HP-PA boot sector, production: Bootable. (line 314) -* Image reading, cache size, -data_cache_size: Loading. (line 328) +* Image reading, cache size, -data_cache_size: Loading. (line 332) * Image, demand volume ID, -assert_volid: Loading. (line 111) * Image, discard pending changes, -rollback: Writing. (line 9) * Image, filesystem to load, -read_fs: Loading. (line 102) @@ -5517,7 +5525,7 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * SUN SPARC boot images, activation: Bootable. (line 377) * Symbolic link, create, -lns: Insert. (line 160) * System area, _definition: Bootable. (line 184) -* Table-of-content, search sessions, -rom_toc_scan: Loading. (line 274) +* Table-of-content, search sessions, -rom_toc_scan: Loading. (line 278) * Table-of-content, show, -toc: Inquiry. (line 27) * Timestamps, set in ISO image, -alter_date: Manip. (line 136) * Timestamps, set in ISO image, -alter_date_r: Manip. (line 168) @@ -5575,47 +5583,47 @@ Node: Commands24952 Node: ArgSort26629 Node: AqDrive28123 Node: Loading31178 -Node: Insert51099 -Node: SetInsert61324 -Node: Manip70175 -Node: CmdFind79958 -Node: Filter98053 -Node: Writing102675 -Node: SetWrite112830 -Node: Bootable135774 -Node: Jigdo158302 -Node: Charset162561 -Node: Exception165888 -Node: DialogCtl172017 -Node: Inquiry174619 -Node: Navigate183069 -Node: Verify191364 -Node: Restore201241 -Node: Emulation209854 -Node: Scripting220264 -Node: Frontend228046 -Node: Examples237681 -Node: ExDevices238859 -Node: ExCreate239520 -Node: ExDialog240820 -Node: ExGrowing242091 -Node: ExModifying242900 -Node: ExBootable243410 -Node: ExCharset243965 -Node: ExPseudo244861 -Node: ExCdrecord245788 -Node: ExMkisofs246108 -Node: ExGrowisofs247465 -Node: ExException248619 -Node: ExTime249077 -Node: ExIncBackup249535 -Node: ExRestore253561 -Node: ExRecovery254507 -Node: Files255079 -Node: Seealso256413 -Node: Bugreport257128 -Node: Legal257719 -Node: CommandIdx258731 -Node: ConceptIdx275773 +Node: Insert51283 +Node: SetInsert61508 +Node: Manip70359 +Node: CmdFind80142 +Node: Filter98445 +Node: Writing103067 +Node: SetWrite113222 +Node: Bootable136166 +Node: Jigdo158694 +Node: Charset162953 +Node: Exception166280 +Node: DialogCtl172409 +Node: Inquiry175011 +Node: Navigate183461 +Node: Verify191756 +Node: Restore201633 +Node: Emulation210246 +Node: Scripting220656 +Node: Frontend228438 +Node: Examples238073 +Node: ExDevices239251 +Node: ExCreate239912 +Node: ExDialog241212 +Node: ExGrowing242483 +Node: ExModifying243292 +Node: ExBootable243802 +Node: ExCharset244357 +Node: ExPseudo245253 +Node: ExCdrecord246180 +Node: ExMkisofs246500 +Node: ExGrowisofs247857 +Node: ExException249011 +Node: ExTime249469 +Node: ExIncBackup249927 +Node: ExRestore253953 +Node: ExRecovery254899 +Node: Files255471 +Node: Seealso256805 +Node: Bugreport257520 +Node: Legal258111 +Node: CommandIdx259123 +Node: ConceptIdx276165  End Tag Table diff --git a/xorriso/xorriso.texi b/xorriso/xorriso.texi index ae150dbe..e13fea6f 100644 --- a/xorriso/xorriso.texi +++ b/xorriso/xorriso.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 XORRISO 1 "Version 1.4.1, Sep 25, 2015" +@c man .TH XORRISO 1 "Version 1.4.1, Sep 28, 2015" @c man .\" Please adjust this date whenever revising the manpage. @c man .\" @c man .\" Some roff macros, for reference: @@ -1244,14 +1244,17 @@ oversized name. Potential incomplete UTF-8 characters will get their leading bytes replaced by '_'. @* iso_rr_paths with the long components will still be able to access the -file paths with truncated components. To avoid confusion by having both -truncated and untruncated names in the same directory, it is highly deprecated -to change this setting after a drive was acquired. All file names must get -truncated by the same length. +file paths with truncated components. @* -Normally this command will produce a SORRY event if it is executed while a -drive is aquired. One may override this ban by prepending the character "+" -to the argument of -file_name_limit. +If -file_name_limit is executed while an ISO tree is present, the file names +in the ISO tree get checked for existing truncated file names of the current +limit and for name collisions between newly truncated files and existing files. +In both cases, the setting will be refused with a SORRY event. +@* +One may lift this ban by prepending the character "+" to the argument +of -file_name_limit. Truncated filenames may then get truncated again, +invalidating their MD5 part. Colliding truncated names are made unique, +consuming at least 9 more bytes of the remaining name part. @* If writing of xattr is enabled, then the length will be stored in "isofs.nt" of the root directory. @@ -2273,6 +2276,10 @@ to name length, permissible characters, and mandatory name components. "rockridge" uses the character set defined by -out_charset, "joliet" uses UCS-2BE, "ecma119" uses ASCII, "hfsplus" uses UTF-16BE. @* +@item -name_limit_blocker length : +Matches file names which would prevent command -file_name_limit with the +given length. The command itself reports only the first problem file. +@* @item -prune : If this test is reached and the tested file is a directory then -find will not dive into that directory. This test itself does always match. @@ -2561,6 +2568,7 @@ E.g.: -exec sort_weight 3 @minus{}@minus{} @* @item show_stream shows the content stream chain of a data file. +@* @item show_stream_id is like show_stream, but also prints between stream type and first ":" in square brackets libisofs id numbers: [fs_id,dev_id,ino_id]. diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index a6aaafb6..015dccc9 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -736,6 +736,10 @@ struct XorrisO { /* the global context of xorriso */ bit2= seen data file without MD5 bit3= seen match */ + int find_unique_trunc_result; /* 0= some names are not uniquely truncatable + 1= all names are uniquely truncatable + 2= no names need truncation + */ double last_abort_file_time; /* most recent check for aborting -check_md5 */ diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 97b67212..b6190693 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2015.09.25.171620" +#define Xorriso_timestamP "2015.09.28.141723"