From 0d2e79ece8a42abd440849966e20461981d2471f Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 14 Jun 2008 10:47:19 +0000 Subject: [PATCH] New options -extract and -extract_single --- xorriso/xorriso.1 | 36 +++++++++++------- xorriso/xorriso.c | 76 +++++++++++++++++++++++++++++++++---- xorriso/xorriso_eng.html | 11 +++++- xorriso/xorriso_timestamp.h | 2 +- 4 files changed, 101 insertions(+), 24 deletions(-) diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index 443d48f9..f43b5ee5 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 "Jun, 13, 2008" +.TH XORRISO 1 "Jun, 14, 2008" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -31,6 +31,8 @@ filesystems into Rock Ridge enhanced ISO 9660 filesystems and allows session-wise manipulation of such filesystems. It can load the management information of existing ISO images and it writes the session results to optical media or to filesystem objects. +.br +Vice versa xorriso is able to restore file objects from ISO 9660 filesystems. .PP A special property of xorriso is that it needs neither an external ISO 9660 formatter program nor an external burn program for CD or DVD but rather @@ -54,7 +56,7 @@ filesystem objects. Can write result as add-on session to appendable multi-session media, to overwriteable media, to regular files, and to block devices. .br -Can copy files from ISO image to disk filesystem. +Can restore files from ISO image to disk filesystem (see osirrox). .br Scans for optical drives, blanks re-useable optical media. .br @@ -1641,18 +1643,6 @@ of -cut_out part files. .br With option "concat_split_off" such directories are handled like any other ISO image directory. -.br -Note that some restore operations are inverse mappings of data manipulation -commands which have the same parameters. I.e. the disk_path stays the first -argument although the operation copies data from ISO image to disk. -.br -Other operations, like -cpx, have the iso_rr_paths first and the the disk_path -as last argument. -.TP -\fB\-paste_in\fR disk_path byte_offset byte_count iso_rr_path -Extract the content of a ISO data file iso_rr_path and write it into a data -file on disk beginning at the byte_offset. Write at most byte_count bytes. -This is the inverse mapping of option -cut_out. .TP \fB\-cpx\fR iso_rr_path [***] disk_path Extract single leaf file objects from the ISO image and store them under @@ -1688,6 +1678,24 @@ by file objects from the ISO image. \fB\-cp_rax\fR iso_rr_path [***] disk_path Like -cp_rx but restoring mtime, atime as in ISO image and trying to set ownership and group as in ISO image. +.PP +The following restore operations are inverse mappings of data manipulation +commands which have the same parameters. I.e. the disk_path stays the first +argument although the operation copies data from ISO image to disk. +.TP +\fB\-extract\fR disk_path iso_rr_path +Restore the file objects underneath iso_rr_path to their corresponding +addresses underneath disk_path. This is the inverse mapping of options -map +or -update_r with the same arguments. +.TP +\fB\-extract_single\fR disk_path iso_rr_path +Like -extract, but if iso_rr_path is a directory then its sub tree gets not +restored. +.TP +\fB\-paste_in\fR disk_path byte_offset byte_count iso_rr_path +Read the content of a ISO data file iso_rr_path and write it into a data +file on disk beginning at the byte_offset. Write at most byte_count bytes. +This is the inverse mapping of option -cut_out with the same arguments. .TP .B Command compatibility emulations: .PP diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index b1a263de..efedcfa8 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -8835,7 +8835,7 @@ int Xorriso_option_cpx(struct XorrisO *xorriso, int argc, char **argv, } } ret= Xorriso_restore(xorriso, eff_origin, eff_dest, (off_t) 0, (off_t) 0, - 16 | (!(flag&2)<<6)); + 16 | ((!(flag&2))<<6)); if(ret<=0 || xorriso->request_to_abort) goto problem_handler; if(ret==3 || (flag&1)) @@ -9217,6 +9217,52 @@ int Xorriso_option_error_behavior(struct XorrisO *xorriso, } +/* Option -extract , -extract_single */ +/* @param flag bit0=do not report the restored item + bit1=do not reset pacifier, no final pacifier message + bit5= -extract_single: eventually do not insert directory tree +*/ +int Xorriso_option_extract(struct XorrisO *xorriso, char *disk_path, + char *iso_path, int flag) +{ + int ret; + char eff_origin[SfileadrL], eff_dest[SfileadrL], *ipth; + + if(!(flag&2)) + Xorriso_pacifier_reset(xorriso, 0); + + ipth= iso_path; + if(ipth[0]==0) + ipth= disk_path; + if(disk_path[0]==0) { + sprintf(xorriso->info_text, "-extract: Empty disk_path given"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 1); + return(0); + } + ret= Xorriso_normalize_img_path(xorriso, xorriso->wdx, disk_path, eff_dest, + 2|4); + if(ret<=0) + return(ret); + ret= Xorriso_normalize_img_path(xorriso, xorriso->wdi, ipth, eff_origin, 2); + if(ret<=0) + return(ret); + ret= Xorriso_restore(xorriso, eff_origin, eff_dest, + (off_t) 0, (off_t) 0, (flag&32)); + if(!(flag&2)) + Xorriso_pacifier_callback(xorriso, "files restored",xorriso->pacifier_count, + xorriso->pacifier_total, "", 1); + if(ret<=0) + return(ret); + + if(!(flag&1)) { + sprintf(xorriso->info_text, "Extracted from ISO image: %s '%s'='%s'\n", + (ret>1 ? "directory" : "file"), eff_origin, eff_dest); + Xorriso_info(xorriso,0); + } + return(1); +} + + /* Option -follow */ int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag) { @@ -9797,8 +9843,6 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " By default \"off\" the inverse operation of xorriso from ISO", " image to disk filesystem is disabled. \"on\" allows xorriso", " to create, overwrite, delete files in the disk filesystem.", -" -paste_in disk_path byte_offset byte_count iso_rr_path", -" Copy ISO file content into a byte interval of a disk file.", " -cpx iso_rr_path [***] disk_path", " Copy leaf file objects from ISO image to disk filesystem.", " -cpax iso_rr_path [***] disk_path", @@ -9807,6 +9851,15 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Copy directory trees from ISO image to disk filesystem.", " -cp_rax iso_rr_path [***] disk_path", " Like -cp_rx but trying to restore timestamps and ownership.", +"The following restore options get the same arguments as their counterparts", +"which put files into ISO images. Thus first disk_path and then iso_rr_path:", +" -extract disk_path iso_rr_path", +" Copy tree under iso_rr_path onto disk address disk_path.", +" This avoids the pitfalls of cp -r addressing rules.", +" -extract_single disk_path iso_rr_path", +" Like -extract but with directory do not insert its sub tree.", +" -paste_in disk_path byte_offset byte_count iso_rr_path", +" Copy ISO file content into a byte interval of a disk file.", "", "Compatibility emulation (argument list may be ended by --):", " -as mkisofs [-help|-o|-R|-J|-V|-P|-f|-m|-graft-points|-path-list|pathspecs]", @@ -11661,7 +11714,8 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, }; static char arg2_commands[][40]= { "alter_date","alter_date_r","boot_image","compare","compare_r", - "errfile_log","error_behavior","load","logfile", + "errfile_log","error_behavior","extract","extract_single", + "load","logfile", "map","map_single","page","return_with","update","update_r", "" }; @@ -11930,9 +11984,13 @@ next_command:; (*idx)+= 2; ret= Xorriso_option_error_behavior(xorriso, arg1, arg2, 0); - } else if(strcmp(cmd,"iso_rr_pattern")==0) { - (*idx)++; - ret= Xorriso_option_iso_rr_pattern(xorriso, arg1, 0); + } else if(strcmp(cmd,"extract")==0) { + (*idx)+= 2; + ret= Xorriso_option_extract(xorriso, arg1, arg2, 0); + + } else if(strcmp(cmd,"extract_single")==0) { + (*idx)+= 2; + ret= Xorriso_option_extract(xorriso, arg1, arg2, 32); } else if(strcmp(cmd,"follow")==0) { (*idx)++; @@ -11968,6 +12026,10 @@ next_command:; (*idx)++; ret= Xorriso_option_dev(xorriso, arg1, 1); + } else if(strcmp(cmd,"iso_rr_pattern")==0) { + (*idx)++; + ret= Xorriso_option_iso_rr_pattern(xorriso, arg1, 0); + } else if(strcmp(cmd,"joliet")==0) { (*idx)++; ret= Xorriso_option_joliet(xorriso, arg1, 0); diff --git a/xorriso/xorriso_eng.html b/xorriso/xorriso_eng.html index 3e193e6d..6870cb85 100644 --- a/xorriso/xorriso_eng.html +++ b/xorriso/xorriso_eng.html @@ -358,16 +358,23 @@ Enhancements towards previous stable version xorriso-0.1.6.pl00:

Development snapshot, version 0.1.9 :

Bug fixes towards xorriso-0.1.8.pl00:
Enhancements towards stable version 0.1.8.pl00:
diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index d2e7178e..57c8658c 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.06.13.151630" +#define Xorriso_timestamP "2008.06.14.104745"