diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index 5ab2835d..866705c5 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 "Aug 09, 2009" +.TH XORRISO 1 "Aug 10, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -750,6 +750,14 @@ same filesystems. Use this if mode "on" always sees all files changed. The speed advantage appears only if the loaded session was produced with -disk_dev_ino "on" too. .TP +\fB\-md5\fR "on"|"off" +Enable or disable processing of MD5 checksums for the overall session and for +each single data file. If enabled then MD5 checksums get loaded from the image +if there are any. At image generation time they are computed for each file +which gets its data written into the new session. The checksums of files which +have their data in older sessions get copied into the new session. +For now checksums can be exploited only via find action get_md5. +.TP \fB\-rom_toc_scan\fR "on"|"off"[:"emul_on"|"emul_off"] Read-only drives do not tell the actual media type but show any media as ROM (e.g. as DVD-ROM). The session history of MMC multi-session media might diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index e28cd932..1f0742f9 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -5265,6 +5265,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->ino_behavior= 7; m->do_joliet= 0; m->do_aaip= 0; + m->do_md5= 0; m->relax_compliance= 0; m->do_follow_pattern= 1; m->do_follow_param= 0; @@ -7664,6 +7665,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->do_md5 & (1 | 2 | 4)) == 0); + sprintf(line,"-md5 %s\n", (xorriso->do_md5 & 1 ? "on" : "off")); + 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,"-compliance %s\n", sfe); if(!(is_default && no_defaults)) @@ -11226,6 +11232,7 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, " --hardlinks Record eventual hard link relations of files", " --acl Record eventual ACLs of files", " --xattr Record eventual user space xattr of files", +" --md5 Compute and record MD5 checksums of data files", " -V ID, -volid ID Set Volume ID", " -b FILE, -eltorito-boot FILE", " Set El Torito boot image name", @@ -11387,6 +11394,8 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, Xorriso_option_acl(xorriso, "on", 0); } else if(strcmp(argv[i], "--xattr")==0) { Xorriso_option_xattr(xorriso, "on", 0); + } else if(strcmp(argv[i], "--md5")==0) { + Xorriso_option_md5(xorriso, "on", 0); } else if(strcmp(argv[i], "-z")==0 || strcmp(argv[i], "-transparent-compression")==0) { Xorriso_option_zisofs(xorriso, "by_magic=on", 0); @@ -11600,6 +11609,8 @@ not_enough_args:; /* was already handled in first argument scan */; } else if(strcmp(argv[i], "--xattr")==0) { /* was already handled in first argument scan */; + } else if(strcmp(argv[i], "--md5")==0) { + /* was already handled in first argument scan */; } else if(strcmp(argv[i], "-z")==0 || strcmp(argv[i], "-transparent-compression")==0) { /* was already handled in first argument scan */; @@ -15840,6 +15851,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " -disk_dev_ino \"on\"|\"ino_only\"|\"off\"", " Enable resp. disable recording of disk file dev_t and ino_t", " and their use in file comparison.", +" -md5 \"on\"|\"off\"", +" Enable resp. disable processing of MD5 checksums.", " -ban_stdio_write", " Allow for writing only the usage of optical drives.", " -blank \"fast\"|\"all\"|\"deformat\"|\"deformat_quickest\"", @@ -16885,6 +16898,22 @@ int Xorriso_option_mark(struct XorrisO *xorriso, char *mark, int flag) } +/* Option -md5 "on"|"off" */ +int Xorriso_option_md5(struct XorrisO *xorriso, char *mode, int flag) +{ + if(strcmp(mode, "off")==0) + xorriso->do_md5&= ~7; + else if(strcmp(mode, "on")==0) + xorriso->do_md5|= (1 | 2 | 4); + else { + sprintf(xorriso->info_text, "-md5: unknown mode '%s'", mode); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + return(1); +} + + /* Option -mkdir alias -mkdiri */ int Xorriso_option_mkdiri(struct XorrisO *xorriso, int argc, char **argv, int *idx, int flag) @@ -19014,7 +19043,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "dev","dialog","disk_dev_ino","disk_pattern","dummy","eject", "iso_rr_pattern","follow","format","fs","gid","grow_blindly","hardlinks", "history","indev","in_charset","joliet","list_delimiter","local_charset", - "mark","not_leaf","not_list","not_mgt", + "mark","md5","not_leaf","not_list","not_mgt", "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", @@ -19518,6 +19547,10 @@ next_command:; (*idx)++; ret= Xorriso_option_mark(xorriso, arg1, 0); + } else if(strcmp(cmd, "md5")==0) { + (*idx)++; + ret= Xorriso_option_md5(xorriso, arg1, 0); + } else if(strcmp(cmd, "mount") == 0 || strcmp(cmd, "mount_cmd") == 0) { (*idx)+= 4; if((*idx)>argc) { diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index 2fa327c0..55fdfeca 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -124,6 +124,11 @@ struct XorrisO { /* the global context of xorriso */ bit9= allow to set input charset from xattr "isofs.cs" */ + int do_md5; /* bit0= read MD5 array + bit1= write session MD5 + bit2= wite MD5 for each data file + */ + int relax_compliance; /* opaque bitfield to be set by xorrisoburn */ int do_follow_pattern; int do_follow_param; @@ -835,6 +840,7 @@ struct ExprtesT { 11= -decision char *arg1 ("yes", "no") 12= -prune 13= -wholename char *arg1 (regex_t in *arg2) + 14= -has_any_xattr */ int test_type; @@ -936,6 +942,8 @@ struct FindjoB { 30= internal: count by xorriso->node_counter 31= internal: register in xorriso->node_array 32= internal: widen_hardlinks disk_equiv: update nodes marked in di_do_widen + 33= get_any_xattr + 34= get_md5 */ int action; int prune; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 5f88786b..020121be 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.08.10.192240" +#define Xorriso_timestamP "2009.08.10.193843" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 77a63297..4dc34edc 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -1122,10 +1122,12 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag) ext|= isoburn_ropt_noacl; if(!(xorriso->do_aaip & 4)) ext|= isoburn_ropt_noea; - -#ifdef isoburn_ropt_noino - if (xorriso->ino_behavior & 1) + if(xorriso->ino_behavior & 1) ext|= isoburn_ropt_noino; + +#ifdef isoburn_ropt_nomd5 + if(!(xorriso->do_md5 & 1)) + ext|= isoburn_ropt_nomd5; #endif isoburn_ropt_set_extensions(ropts, ext); @@ -1787,7 +1789,11 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) ((!!xorriso->do_joliet) * isoburn_igopt_joliet) | (( !(xorriso->ino_behavior & 2)) * isoburn_igopt_hardlinks) | (( (!(xorriso->ino_behavior & 2)) || - (xorriso->do_aaip & (2 | 8 | 16 | 256))) * isoburn_igopt_aaip); + (xorriso->do_aaip & (2 | 8 | 16 | 256)) || + (xorriso->do_md5 & (2 | 4)) + ) * isoburn_igopt_aaip) | + ((!!(xorriso->do_md5 & 2)) * isoburn_igopt_session_md5) | + ((!!(xorriso->do_md5 & 4)) * isoburn_igopt_file_md5); isoburn_igopt_set_extensions(sopts, ext); isoburn_igopt_set_relaxed(sopts, relax); isoburn_igopt_set_sort_files(sopts, 1);