New -find actions update_merge, rm_merge, clear_merge. -cp_clone now merges.
This commit is contained in:
parent
2c37215969
commit
7f01cfd5dc
@ -363,6 +363,8 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
|
||||
|
||||
m->perm_stack= NULL;
|
||||
|
||||
m->update_flags= 0;
|
||||
|
||||
m->result_line[0]= 0;
|
||||
m->result_line_counter= 0;
|
||||
m->result_page_counter= 0;
|
||||
|
@ -284,6 +284,7 @@ ex:;
|
||||
bit1= compare ctime
|
||||
bit2= check only existence of both file objects
|
||||
count one or both missing as "difference"
|
||||
bit26= do not issue message about missing disk file
|
||||
bit27= for Xorriso_path_is_excluded(): bit0
|
||||
bit28= examine eventual disk_path link target rather than link
|
||||
bit29= do not issue pacifier messages
|
||||
@ -320,7 +321,7 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
sprintf(respt , "? %s (DISK) : exluded by %s\n",
|
||||
Text_shellsafe(disk_adr, sfe, 0),
|
||||
(ret==1 ? "-not_paths" : "-not_leaf"));
|
||||
if(!(flag&(1<<31)))
|
||||
if(! (flag & ((1 << 31) | (1 << 26))))
|
||||
Xorriso_result(xorriso,0);
|
||||
missing= 1;
|
||||
(*result)|= 1;
|
||||
@ -334,7 +335,7 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
if(ret==-1) {
|
||||
sprintf(respt , "? %s (DISK) : cannot lstat() : %s\n",
|
||||
Text_shellsafe(disk_adr, sfe, 0), strerror(errno));
|
||||
if(!(flag&(1<<31)))
|
||||
if(! (flag & ((1 << 31) | (1 << 26))))
|
||||
Xorriso_result(xorriso,0);
|
||||
missing= 1;
|
||||
(*result)|= 1;
|
||||
@ -681,10 +682,11 @@ int Xorriso_pfx_disk_path(struct XorrisO *xorriso, char *iso_path,
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param flag bit0= update rather than compare
|
||||
bit1= find[ix] is in recursion
|
||||
bit2= update_merge : do not delete but mark visited and found
|
||||
@return <=0 error, 1= ok , 2= iso_path was deleted
|
||||
3=ok, do not dive into directory (e.g. because it is a split file)
|
||||
*/
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter,
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, void *node,
|
||||
char *iso_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag)
|
||||
{
|
||||
@ -709,22 +711,24 @@ int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter,
|
||||
follow_links= (xorriso->do_follow_links ||
|
||||
(xorriso->do_follow_param && !(flag&2))) <<28;
|
||||
ret= Xorriso_compare_2_files(xorriso, disk_path, iso_path, "", &result,
|
||||
2 | follow_links | ((!(flag&2))<<27) | ((flag&1)<<31));
|
||||
2 | follow_links | ((!!(flag & 4)) << 26)
|
||||
| ((!(flag&2))<<27) | ((flag&1)<<31));
|
||||
/* was once: | ((!(flag&1))<<29) */
|
||||
if(ret<xorriso->find_compare_result)
|
||||
xorriso->find_compare_result= ret;
|
||||
if(flag&1) {
|
||||
if(ret<=0) {
|
||||
if(ret<0)
|
||||
if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0)
|
||||
return(ret);
|
||||
uret= Xorriso_update_interpreter(xorriso, boss_iter, result,
|
||||
disk_path, iso_path, (flag&2)<<1);
|
||||
if(uret<=0)
|
||||
ret= 0;
|
||||
if(uret==2)
|
||||
deleted= 1;
|
||||
}
|
||||
if(ret<0)
|
||||
if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0)
|
||||
return(ret);
|
||||
if(ret > 0)
|
||||
result= 0;
|
||||
uret= Xorriso_update_interpreter(xorriso, boss_iter, node, result,
|
||||
disk_path, iso_path,
|
||||
((flag & 2) << 1) | ((flag & 4) >> 1));
|
||||
if(uret<=0)
|
||||
ret= 0;
|
||||
if(uret==2)
|
||||
deleted= 1;
|
||||
}
|
||||
if(ret<0)
|
||||
return(ret);
|
||||
@ -742,11 +746,15 @@ int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter,
|
||||
Do not call Xorriso_hardlink_update()
|
||||
Overwrite exactly if normal mode would not,
|
||||
else do nothing
|
||||
bit1= do not delete files which are not found under
|
||||
disk_path, but rather mark visited files and mark
|
||||
files which were found.
|
||||
bit2= -follow: this is not a command parameter
|
||||
@return <=0 error, 1= ok , 2= iso_rr_path node object has been deleted ,
|
||||
3= no action taken
|
||||
*/
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso,
|
||||
void *boss_iter, void *node,
|
||||
int compare_result, char *disk_path,
|
||||
char *iso_rr_path, int flag)
|
||||
{
|
||||
@ -767,6 +775,15 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
|
||||
ret= 3; goto ex;
|
||||
}
|
||||
|
||||
if((flag & 2) && !(compare_result & 2)) {
|
||||
ret= Xorriso_mark_update_merge(xorriso, iso_rr_path, node,
|
||||
!(compare_result & 1));
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
if(compare_result == 0)
|
||||
{ret= 1; goto ex;}
|
||||
|
||||
if(compare_result&((1<<11)|(1<<13))) {
|
||||
if(flag & 1)
|
||||
{ret= 3; goto ex;}
|
||||
@ -806,15 +823,24 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
|
||||
deleted= 1;
|
||||
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path,
|
||||
(off_t) 0, (off_t) 0, 2|(flag&4));
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(flag & 2) {
|
||||
ret= Xorriso_mark_update_merge(xorriso, iso_rr_path, NULL, 1);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
sprintf(xorriso->info_text, "Deleted and re-added ");
|
||||
|
||||
} else if(compare_result&(1)) {
|
||||
delete:;
|
||||
/* disk_adr not existing */
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1);
|
||||
deleted= 1;
|
||||
sprintf(xorriso->info_text, "Deleted ");
|
||||
if(!(flag & 2)) {
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1);
|
||||
deleted= 1;
|
||||
sprintf(xorriso->info_text, "Deleted ");
|
||||
}
|
||||
|
||||
} else if(compare_result&(2|128|(1<<12)|(1<<14)|(1<<15))) {
|
||||
/* iso_adr not existing, size, cannot open iso file, early eof of iso file
|
||||
@ -895,6 +921,11 @@ overwrite:;
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
}
|
||||
if(flag & 2) {
|
||||
ret= Xorriso_mark_update_merge(xorriso, iso_rr_path, NULL, 1);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
if(flag & 1)
|
||||
sprintf(xorriso->info_text, "Widened hard link ");
|
||||
else
|
||||
|
@ -23,16 +23,21 @@ int Xorriso_pfx_disk_path(struct XorrisO *xorriso, char *iso_path,
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param node Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param flag bit0= update rather than compare
|
||||
*/
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter,
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, void *node,
|
||||
char *iso_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag);
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param @node Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
*/
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso,
|
||||
void *boss_iter, void *node,
|
||||
int compare_result, char *disk_path,
|
||||
char *iso_rr_path, int flag);
|
||||
|
||||
|
@ -1132,8 +1132,8 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
if(ret<xorriso->find_compare_result)
|
||||
xorriso->find_compare_result= ret;
|
||||
if(ret==0) {
|
||||
uret= Xorriso_update_interpreter(xorriso, NULL, compare_result,
|
||||
abs_path, iso_path, (flag&1)<<2);
|
||||
uret= Xorriso_update_interpreter(xorriso, NULL, NULL, compare_result,
|
||||
abs_path, iso_path, ((flag&1)<<2) | 2);
|
||||
if(uret<=0)
|
||||
ret= 0;
|
||||
}
|
||||
|
@ -900,6 +900,7 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
|
||||
char *ept, *add_pt, eff_path[SfileadrL], indev[SfileadrL+8], msc[80], *cpt;
|
||||
char old_root[SfileadrL];
|
||||
char *boot_path, partno_text[8], *iso_rr_pt, *disk_pt;
|
||||
char *rm_merge_args[3];
|
||||
|
||||
/* >>> This should not be static. Why is it ? */
|
||||
static char *sort_weight_args[4]= {"", "-exec", "sort_weight", ""};
|
||||
@ -1595,8 +1596,8 @@ is_pathspec_2:;
|
||||
goto problem_handler_2;
|
||||
}
|
||||
}
|
||||
/* update_r */
|
||||
ret= Xorriso_option_update(xorriso, disk_pt, iso_rr_pt, 1 | 8);
|
||||
/* update_merge */
|
||||
ret= Xorriso_option_update(xorriso, disk_pt, iso_rr_pt, 1 | 8 | 32);
|
||||
} else {
|
||||
mem_graft_points= xorriso->allow_graft_points;
|
||||
xorriso->allow_graft_points= 1;
|
||||
@ -1634,6 +1635,21 @@ problem_handler_2:;
|
||||
continue;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(old_root[0]) {
|
||||
/* Delete all visited nodes which were not found on disk */
|
||||
if(root_seen)
|
||||
rm_merge_args[0]= xorriso->wdi;
|
||||
else
|
||||
rm_merge_args[0]= "/";
|
||||
rm_merge_args[1]= "-exec";
|
||||
rm_merge_args[2]= "rm_merge";
|
||||
zero= 0;
|
||||
ret= Xorriso_option_find(xorriso, 3, rm_merge_args, &zero, 2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(lower_r) {
|
||||
static char *lower_r_args[3]= {"/", "-exec", "mkisofs_r"};
|
||||
zero= 0;
|
||||
|
@ -155,6 +155,9 @@ struct FindjoB {
|
||||
38= sort_weight number
|
||||
39= hide on|iso_rr|joliet|off
|
||||
40= estimate_size
|
||||
41= update_merge disk_equiv
|
||||
42= rm_merge
|
||||
43= clear_merge
|
||||
*/
|
||||
int action;
|
||||
int prune;
|
||||
|
@ -126,6 +126,11 @@ int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
|
||||
if(ret<0)
|
||||
return(ret);
|
||||
*node= (IsoNode *) new_dir;
|
||||
if(xorriso->update_flags & 1) {
|
||||
ret= Xorriso_mark_update_merge(xorriso, img_name, node, 1);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
}
|
||||
total_parts= size / xorriso->split_size;
|
||||
if(size % xorriso->split_size)
|
||||
total_parts++;
|
||||
@ -213,6 +218,11 @@ int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
if(xorriso->update_flags & 1) {
|
||||
ret= Xorriso_mark_update_merge(xorriso, img_name, *node, 1);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
ex:;
|
||||
if(ret<0) {
|
||||
@ -788,6 +798,12 @@ handle_path_node:;
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
if(xorriso->update_flags & 1) {
|
||||
ret= Xorriso_mark_update_merge(xorriso, path, (IsoNode *) hdir, 1);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
}
|
||||
|
||||
dir= hdir;
|
||||
Xorriso_set_change_pending(xorriso, 0);
|
||||
iso_node_set_ctime((IsoNode *) dir, time(NULL));
|
||||
@ -1391,7 +1407,8 @@ int Xorriso_cannot_clone(struct XorrisO *xorriso, char *eff_origin,
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= for iso_tree_clone() : merge directories
|
||||
*/
|
||||
int Xorriso_clone_tree(struct XorrisO *xorriso, void *boss_iter,
|
||||
char *origin, char *dest, int flag)
|
||||
{
|
||||
@ -1464,7 +1481,7 @@ int Xorriso_clone_tree(struct XorrisO *xorriso, void *boss_iter,
|
||||
return(ret);
|
||||
new_parent= (IsoDir *) dir_node;
|
||||
|
||||
ret = iso_tree_clone(origin_node, new_parent, leafname, &new_node, 0);
|
||||
ret = iso_tree_clone(origin_node, new_parent, leafname, &new_node, flag & 1);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret < 0) {
|
||||
Xorriso_cannot_clone(xorriso, eff_origin, eff_dest, ret, 0);
|
||||
@ -1518,7 +1535,7 @@ int Xorriso_clone_under(struct XorrisO *xorriso, char *origin, char *dest,
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
} else {
|
||||
ret = iso_tree_clone(origin_node, dest_dir, namept, &new_node, 0);
|
||||
ret = iso_tree_clone(origin_node, dest_dir, namept, &new_node, 1);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret < 0) {
|
||||
Xorriso_cannot_clone(xorriso, eff_origin, eff_dest, ret, 0);
|
||||
@ -1850,8 +1867,8 @@ int Xorriso_widen_hardlink(struct XorrisO *xorriso, void * boss_iter,
|
||||
|
||||
/* >>> compare_result bit17 = is_split */;
|
||||
|
||||
ret= Xorriso_update_interpreter(xorriso, boss_iter, compare_result, disk_path,
|
||||
abs_path, 1);
|
||||
ret= Xorriso_update_interpreter(xorriso, boss_iter, NULL,
|
||||
compare_result, disk_path, abs_path, 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
return(ret);
|
||||
@ -2080,10 +2097,13 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
Findjob_set_start_path(subjob, abs_path, 0);
|
||||
ret= Xorriso_findi(xorriso, subjob, boss_iter, boss_mem, NULL,
|
||||
abs_path, &dir_stbuf, depth, 1);
|
||||
} else if(action==14 || action==17) { /* compare , update */
|
||||
} else if(action==14 || action==17 || action == 41) {
|
||||
/* compare , update , update_merge */
|
||||
Findjob_get_start_path(job, &iso_prefix, 0);
|
||||
ret= Xorriso_find_compare(xorriso, (void *) boss_iter, abs_path,
|
||||
iso_prefix, target, (action==17)|((flag&1)<<1));
|
||||
ret= Xorriso_find_compare(xorriso, (void *) boss_iter, (void *) node,
|
||||
abs_path, iso_prefix, target,
|
||||
(action == 17 || action == 41)
|
||||
| ((flag&1)<<1) | ((action == 41) << 2));
|
||||
if(ret==2)
|
||||
deleted= 1;
|
||||
if(ret==3)
|
||||
@ -2164,6 +2184,17 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
if(ret > 0)
|
||||
ret= Xorriso_estimate_file_size(xorriso, job, basename, stbuf.st_mode,
|
||||
stbuf.st_size, 0);
|
||||
} else if(action == 42) { /* rm_merge */
|
||||
ret= Xorriso_mark_update_merge(xorriso, show_path, node, 2 | 4);
|
||||
if(ret == 2) {
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, boss_mem, abs_path, 1|hflag);
|
||||
sprintf(xorriso->info_text, "Deleted ");
|
||||
Text_shellsafe(show_path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
|
||||
deleted= 1;
|
||||
}
|
||||
} else if(action == 43) { /* clear_merge */
|
||||
ret= Xorriso_mark_update_merge(xorriso, show_path, node, 2 | 4);
|
||||
} else { /* includes : 15 in_iso */
|
||||
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
|
||||
Xorriso_result(xorriso, 0);
|
||||
@ -2566,9 +2597,10 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
mem= boss_mem;
|
||||
hflag= 1;
|
||||
if(action==1 || action==2 || action==3 || action==17 || action == 28 ||
|
||||
action == 32)
|
||||
action == 32 || action == 41 || action == 42)
|
||||
hflag|= 2; /* need freedom to manipulate image */
|
||||
if(action==14 || action==17 || action == 28 || action == 35 || action == 36)
|
||||
if(action==14 || action==17 || action == 28 || action == 35 || action == 36 ||
|
||||
action == 41)
|
||||
hflag|= 4; /* need LBA sorted iteration for good data reading performance */
|
||||
ret= Xorriso_findi_iter(xorriso, dir_node, &mem,
|
||||
&iter, &node_array, &node_count, &node_idx,
|
||||
@ -2980,3 +3012,92 @@ ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__mark_update_xinfo(void *data, int flag)
|
||||
{
|
||||
/* data is an int disguised as pointer. It does not point to memory. */
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag)
|
||||
{
|
||||
*new_data= NULL;
|
||||
if(flag)
|
||||
return(ISO_XINFO_NO_CLONE);
|
||||
if(old_data == NULL)
|
||||
return(0);
|
||||
/* data is an int disguised as pointer. It does not point to memory. */
|
||||
*new_data= old_data;
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= found on disk
|
||||
bit1= inquire visit-found status:
|
||||
1=not visited, 2=not found, 3=found
|
||||
bit2= with bit1: delete xinfo before returning status
|
||||
*/
|
||||
int Xorriso_mark_update_merge(struct XorrisO *xorriso, char *path,
|
||||
void *in_node, int flag)
|
||||
{
|
||||
int ret;
|
||||
void *xipt= NULL;
|
||||
IsoNode *node;
|
||||
|
||||
if(in_node == NULL) {
|
||||
ret= Xorriso_node_from_path(xorriso, NULL, path, &node, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
} else
|
||||
node= (IsoNode *) in_node;
|
||||
ret= iso_node_get_xinfo(node, Xorriso__mark_update_xinfo, &xipt);
|
||||
if(ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when looking for update_merge xinfo",
|
||||
0, "FAILURE", 1);
|
||||
return(0);
|
||||
}
|
||||
if(flag & 2) { /* Inquire status and optionally delete xinfo */
|
||||
if(ret == 0)
|
||||
return(1);
|
||||
if(flag & 4) {
|
||||
ret= iso_node_remove_xinfo(node, Xorriso__mark_update_xinfo);
|
||||
if(ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when removing update_merge xinfo",
|
||||
0, "FAILURE", 1);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
if(((char *) &xipt)[0])
|
||||
return(3);
|
||||
return(2);
|
||||
}
|
||||
/* xipt is a byte value disguised as void pointer */
|
||||
if(ret == 1) {
|
||||
if(((char *) &xipt)[0])
|
||||
return(1);
|
||||
if(!(flag & 1))
|
||||
return(1);
|
||||
} else
|
||||
((char *) &xipt)[0]= 0;
|
||||
if(flag & 1)
|
||||
((char *) &xipt)[0]= 1;
|
||||
ret= iso_node_remove_xinfo(node, Xorriso__mark_update_xinfo);
|
||||
if(ret < 0)
|
||||
goto set_error;
|
||||
ret= iso_node_add_xinfo(node, Xorriso__mark_update_xinfo, xipt);
|
||||
if(ret <= 0) {
|
||||
set_error:;
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when trying to set update_merge xinfo",
|
||||
0, "FAILURE", 1);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,8 @@ int Xorriso_all_node_array(struct XorrisO *xorriso, int addon_nodes, int flag);
|
||||
|
||||
int Xorriso__file_start_lba(IsoNode *node, int *lba, int flag);
|
||||
|
||||
int Xorriso__mark_update_xinfo(void *data, int flag);
|
||||
int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_manip_includeD */
|
||||
|
||||
|
@ -55,6 +55,7 @@
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "lib_mgt.h"
|
||||
#include "iso_manip.h"
|
||||
|
||||
|
||||
int Xorriso_abort(struct XorrisO *xorriso, int flag)
|
||||
@ -203,6 +204,9 @@ LIBISOBURN_MISCONFIGURATION_ = 0;
|
||||
zisofs_ctrl.compression_level;
|
||||
}
|
||||
|
||||
iso_node_xinfo_make_clonable(Xorriso__mark_update_xinfo,
|
||||
Xorriso__mark_update_cloner, 0);
|
||||
|
||||
/* Second initialization. This time with libs. */
|
||||
Xorriso_preparer_string(xorriso, xorriso->preparer_id, 0);
|
||||
|
||||
|
@ -1953,14 +1953,20 @@ nondir_exists:;
|
||||
}
|
||||
ret= Xorriso_iso_lstat(xorriso, eff_dest, &stbuf, 0);
|
||||
if(pass == 0) {
|
||||
/* It is ok if both are directories */;
|
||||
if(ret >= 0 && S_ISDIR(stbuf.st_mode)) {
|
||||
ret= Xorriso_iso_lstat(xorriso, eff_origin, &stbuf, 0);
|
||||
if (ret >= 0 && S_ISDIR(stbuf.st_mode))
|
||||
ret= -1;
|
||||
}
|
||||
if(ret >= 0) {
|
||||
sprintf(xorriso->info_text, "Cloning: Copy address already exists: ");
|
||||
sprintf(xorriso->info_text, "Cloning: May not overwrite: ");
|
||||
Text_shellsafe(eff_dest, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
goto problem_handler;
|
||||
}
|
||||
} else if(ret == -1) {
|
||||
ret= Xorriso_clone_tree(xorriso, NULL, eff_origin, eff_dest, 0);
|
||||
} else {
|
||||
ret= Xorriso_clone_tree(xorriso, NULL, eff_origin, eff_dest, 1);
|
||||
if(ret <= 0)
|
||||
goto problem_handler;
|
||||
sprintf(xorriso->info_text, "Cloned in ISO image: ");
|
||||
|
@ -875,15 +875,22 @@ not_enough_exec_arguments:;
|
||||
job= new_job;
|
||||
|
||||
} else if(strcmp(cpt, "compare")==0 || strcmp(cpt, "update")==0 ||
|
||||
strcmp(cpt, "widen_hardlinks")==0) {
|
||||
strcmp(cpt, "widen_hardlinks")==0 ||
|
||||
strcmp(cpt, "update_merge")==0) {
|
||||
if(i+1>=end_idx)
|
||||
goto not_enough_exec_arguments;
|
||||
i++;
|
||||
action= 14;
|
||||
if(strcmp(cpt, "update")==0)
|
||||
action= 17;
|
||||
if(strcmp(cpt, "widen_hardlinks")==0)
|
||||
else if(strcmp(cpt, "widen_hardlinks")==0)
|
||||
action= 32;
|
||||
else if(strcmp(cpt, "update_merge") == 0) {
|
||||
action= 41;
|
||||
/* Enter update_merge mode for node adding */
|
||||
xorriso->update_flags|= 1;
|
||||
}
|
||||
|
||||
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, argv[i],
|
||||
other_path_start, 1|2|4|8);
|
||||
if(ret<=0)
|
||||
@ -1009,6 +1016,12 @@ not_enough_exec_arguments:;
|
||||
Findjob_set_action_type(job, 39, type, 0);
|
||||
} else if(strcmp(cpt, "estimate_size")==0) {
|
||||
Findjob_set_action_target(job, 40, NULL, 0);
|
||||
} else if(strcmp(cpt, "rm_merge")==0) {
|
||||
Findjob_set_action_target(job, 42, NULL, 0);
|
||||
xorriso->update_flags&= ~1; /* End update_merge mode for node adding */
|
||||
} else if(strcmp(cpt, "clear_merge")==0) {
|
||||
Findjob_set_action_target(job, 43, NULL, 0);
|
||||
xorriso->update_flags&= ~1; /* End update_merge mode for node adding */
|
||||
} else {
|
||||
sprintf(xorriso->info_text, "-find -exec: unknown action %s",
|
||||
Text_shellsafe(argv[i], sfe, 0));
|
||||
|
@ -1361,6 +1361,9 @@ int Xorriso_option_uid(struct XorrisO *xorriso, char *uid, int flag)
|
||||
bit2= do not issue pacifier messages at all
|
||||
bit3= recursive: -update_r
|
||||
bit4= do not establish and dispose xorriso->di_array
|
||||
bit5= do not delete files which are not found under
|
||||
disk_path, but rather mark visited files and mark
|
||||
files which were found.
|
||||
*/
|
||||
int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path,
|
||||
char *iso_path, int flag)
|
||||
@ -1447,7 +1450,10 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path,
|
||||
if(ret >= 0) {
|
||||
argv[0]= eff_dest;
|
||||
argv[1]= "-exec";
|
||||
argv[2]= "update";
|
||||
if(flag & 32)
|
||||
argv[2]= "update_merge";
|
||||
else
|
||||
argv[2]= "update";
|
||||
argv[3]= eff_origin;
|
||||
zero= 0;
|
||||
ret= Xorriso_option_find(xorriso, 4, argv, &zero,
|
||||
@ -1468,7 +1474,18 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path,
|
||||
argv[3]= eff_dest;
|
||||
zero= 0;
|
||||
ret= Xorriso_option_find(xorriso, 4, argv, &zero, 1|2); /* -findx */
|
||||
if(ret>0 && !xorriso->do_follow_mount) {
|
||||
if(ret>0 && (!xorriso->do_follow_mount) && !(flag & 32)) {
|
||||
|
||||
/* >>> ??? what about mount points with (flag & 32) ?
|
||||
empty_iso_dir shall delete those which already existed
|
||||
and are freshly excluded. (E.g. by mounting at a non-empty
|
||||
directory, or by new follow rules.)
|
||||
This deletion does not match the idea of merging.
|
||||
For determining the foreign files in a directory which is
|
||||
target of a mount point, one would have to enter that mount
|
||||
point directory. Somewhat contrary to do-not-follow.
|
||||
*/
|
||||
|
||||
argv[0]= eff_origin;
|
||||
argv[1]= "-type";
|
||||
argv[2]= "m";
|
||||
@ -1495,13 +1512,17 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path,
|
||||
ret= -1;
|
||||
}
|
||||
} else {
|
||||
if(flag & 32)
|
||||
xorriso->update_flags|= 1; /* Enter update_merge mode for node adding */
|
||||
/* compare ctime too, no filename reporting, eventually silent */
|
||||
follow_links= (xorriso->do_follow_links || xorriso->do_follow_param) <<28;
|
||||
ret= Xorriso_compare_2_files(xorriso, eff_origin, eff_dest, "", &result,
|
||||
2 | follow_links | ((flag&4)<<27) | (3<<30));
|
||||
if(ret==0) {
|
||||
uret= Xorriso_update_interpreter(xorriso, NULL, result, eff_origin,
|
||||
eff_dest, 0);
|
||||
if(ret == 0 || (ret > 0 && (flag & 32))) {
|
||||
if(ret > 0)
|
||||
result= 0;
|
||||
uret= Xorriso_update_interpreter(xorriso, NULL, NULL, result, eff_origin,
|
||||
eff_dest, (!!(flag & 32)) << 1);
|
||||
if(uret<=0)
|
||||
ret= -1;
|
||||
if(uret==3)
|
||||
|
@ -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 "Feb 07, 2011"
|
||||
.TH XORRISO 1 "Feb 12, 2011"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
@ -1065,7 +1065,8 @@ already exists in the ISO tree.
|
||||
.TP
|
||||
\fB\-cp_clone\fR iso_rr_path_original [***] iso_rr_path_dest
|
||||
Create copies of one or more ISO file objects as with command -clone.
|
||||
Do not not overwrite existing ISO file objects.
|
||||
Eventually merge directories with existing ones, but do not overwrite
|
||||
existing ISO file objects.
|
||||
.br
|
||||
The rules for generating the copy addresses are the same as with
|
||||
command -cpr (see above) resp. shell command cp -r. Other than with -cpr,
|
||||
@ -1649,6 +1650,16 @@ performs command -update with the found file address as
|
||||
iso_rr_path. The corresponding file address is determined like with above
|
||||
action "compare".
|
||||
.br
|
||||
\fBupdate_merge\fR
|
||||
is like update but does not delete the found file if it is missing on disk.
|
||||
It may be run several times and records with all visited files whether their
|
||||
counterpart on disk has already been seen by one of the update_merge runs.
|
||||
Finally, a -find run with action "rm_merge" may remove all files that
|
||||
saw no counterpart on disk.
|
||||
.br
|
||||
Up to the next "rm_merge" or "clear_merge" all newly inserted files will
|
||||
get marked as having a disk counterpart.
|
||||
.br
|
||||
\fBrm\fR
|
||||
removes the found iso_rr_path from the image if it is not a directory
|
||||
with files in it. I.e. this "rm" includes "rmdir".
|
||||
@ -1657,6 +1668,14 @@ with files in it. I.e. this "rm" includes "rmdir".
|
||||
removes the found iso_rr_path from the image, including whole
|
||||
directory trees.
|
||||
.br
|
||||
\fBrm_merge\fR
|
||||
removes the found iso_rr_path if it was visited by one or more previous actions
|
||||
"update_merge" and saw no counterpart on disk in any of them. The marking from
|
||||
the update actions is removed in any case.
|
||||
.br
|
||||
\fBclear_merge\fR
|
||||
removes an eventual marking from action "update_merge".
|
||||
.br
|
||||
\fBreport_damage\fR
|
||||
classifies files whether they hit a data block that is
|
||||
marked as damaged. The result is printed together with the eventual address
|
||||
@ -3118,7 +3137,7 @@ not exist in the ISO image. The report format is the same as with command
|
||||
.br
|
||||
\fBadd_missing\fR iso_rr_path_start
|
||||
adds the counterpart if it does not yet
|
||||
exist in the ISO image.
|
||||
exist in the ISO image and marks it for "rm_merge" as non-removable.
|
||||
.br
|
||||
E.g.: -findx /home/thomas -exec add_missing /thomas_on_cd --
|
||||
.br
|
||||
@ -3550,9 +3569,10 @@ allowed to violate the standard by -compliance option allow_dir_id_ext.
|
||||
This may be avoided by option -disallow_dir_id_ext.
|
||||
.br
|
||||
Option -root is supported. Option -old-root is implemented by xorriso
|
||||
commands -mkdir, -cp_clone, and -update_r. It sets command -disk_dev_ino
|
||||
to "ino_only" and -md5 to "on", by default. -disk_dev_ino can be set
|
||||
to "off" by --old-root-no-ino
|
||||
commands -mkdir, -cp_clone, -find update_merge, and -find rm_merge.
|
||||
-root and -old-root set command -disk_dev_ino to "ino_only" and -md5 to "on",
|
||||
by default.
|
||||
-disk_dev_ino can be set to "off" by --old-root-no-ino
|
||||
resp. to "on" by --old-root-devno .
|
||||
-md5 can be set to "off" by --old-root-no-md5 .
|
||||
.br
|
||||
@ -4275,7 +4295,7 @@ $ xorriso \\
|
||||
.br
|
||||
-not_leaf '*.o' -not_leaf '*.swp' \\
|
||||
.br
|
||||
-update_r /home/thomas/open_source_projects /open_source_projects \\
|
||||
-update_r /home/thomas/projects /projects \\
|
||||
.br
|
||||
-update_r /home/thomas/personal_mail /personal_mail \\
|
||||
.br
|
||||
@ -4318,20 +4338,33 @@ older sessions in the table-of-content. E.g. as superuser:
|
||||
.br
|
||||
# osirrox -mount /dev/sr0 "volid" '*2008_12_05*' /mnt
|
||||
.br
|
||||
.sp 1
|
||||
This example produces a result similar to -root / -old-root / with mkisofs.
|
||||
For getting the session trees accumulated in the new sessions, let all -update
|
||||
commands use a common parent directory and clone it after updating is done:
|
||||
.br
|
||||
-update_r /home/thomas/projects /current/projects \\
|
||||
.br
|
||||
-update_r /home/thomas/personal_mail /current/personal_mail \\
|
||||
.br
|
||||
-clone /current /"$(date '+%Y_%m_%d_%H%M%S')" \\
|
||||
.br
|
||||
The cloned tree will have a name like /2011_02_12_155700.
|
||||
.br
|
||||
.sp 1
|
||||
Sessions on multi-session media are separated by several MB of unused blocks.
|
||||
So with small sessions the payload capacity can become substantially lower
|
||||
than the overall media capacity. If the remaining space on media does not
|
||||
suffice for the next gap, the drive is supposed to close the media
|
||||
automatically.
|
||||
.br
|
||||
.sp 1
|
||||
\fBBetter do not use your youngest backup for -update_r\fR.
|
||||
Have at least two media which you use alternatingly. So only older backups
|
||||
get endangered by the new write operation, while the newest backup is
|
||||
stored safely on a different media.
|
||||
Always have a blank media ready to perform a full backup in case the update
|
||||
attempt fails due to insufficient remaining capacity.
|
||||
.br
|
||||
This example produces a result similar to -root / -old-root / with mkisofs.
|
||||
.SS
|
||||
.B Restore directory trees from a particular ISO session to disk
|
||||
This is an alternative to mounting the media and using normal file operations.
|
||||
|
@ -1000,7 +1000,8 @@ filesystem.
|
||||
|
||||
-cp_clone iso_rr_path_original [***] iso_rr_path_dest
|
||||
Create copies of one or more ISO file objects as with command
|
||||
-clone. Do not not overwrite existing ISO file objects.
|
||||
-clone. Eventually merge directories with existing ones, but do
|
||||
not overwrite existing ISO file objects.
|
||||
The rules for generating the copy addresses are the same as with
|
||||
command -cpr (see above) resp. shell command cp -r. Other than
|
||||
with -cpr, relative iso_rr_path_original will get prepended the
|
||||
@ -1499,12 +1500,28 @@ File: xorriso.info, Node: CmdFind, Next: Filter, Prev: Manip, Up: Options
|
||||
performs command -update with the found file address as
|
||||
iso_rr_path. The corresponding file address is determined
|
||||
like with above action "compare".
|
||||
update_merge
|
||||
is like update but does not delete the found file if it is
|
||||
missing on disk. It may be run several times and records
|
||||
with all visited files whether their counterpart on disk has
|
||||
already been seen by one of the update_merge runs. Finally,
|
||||
a -find run with action "rm_merge" may remove all files that
|
||||
saw no counterpart on disk.
|
||||
Up to the next "rm_merge" or "clear_merge" all newly inserted
|
||||
files will get marked as having a disk counterpart.
|
||||
rm
|
||||
removes the found iso_rr_path from the image if it is not a
|
||||
directory with files in it. I.e. this "rm" includes "rmdir".
|
||||
rm_r
|
||||
removes the found iso_rr_path from the image, including whole
|
||||
directory trees.
|
||||
rm_merge
|
||||
removes the found iso_rr_path if it was visited by one or
|
||||
more previous actions "update_merge" and saw no counterpart
|
||||
on disk in any of them. The marking from the update actions
|
||||
is removed in any case.
|
||||
clear_merge
|
||||
removes an eventual marking from action "update_merge".
|
||||
report_damage
|
||||
classifies files whether they hit a data block that is marked
|
||||
as damaged. The result is printed together with the eventual
|
||||
@ -2763,7 +2780,7 @@ File: xorriso.info, Node: Navigate, Next: Verify, Prev: Inquiry, Up: Options
|
||||
image. The report format is the same as with command -compare.
|
||||
add_missing iso_rr_path_start
|
||||
adds the counterpart if it does not yet exist in the ISO
|
||||
image.
|
||||
image and marks it for "rm_merge" as non-removable.
|
||||
E.g.: -findx /home/thomas -exec add_missing /thomas_on_cd --
|
||||
is_full_in_iso
|
||||
reports if the counterpart in the ISO image contains files.
|
||||
@ -3166,11 +3183,11 @@ programs trigger comparable actions.
|
||||
option allow_dir_id_ext. This may be avoided by option
|
||||
-disallow_dir_id_ext.
|
||||
Option -root is supported. Option -old-root is implemented by
|
||||
xorriso commands -mkdir, -cp_clone, and -update_r. It sets command
|
||||
-disk_dev_ino to "ino_only" and -md5 to "on", by default.
|
||||
-disk_dev_ino can be set to "off" by --old-root-no-ino resp. to
|
||||
"on" by --old-root-devno . -md5 can be set to "off" by
|
||||
--old-root-no-md5 .
|
||||
xorriso commands -mkdir, -cp_clone, -find update_merge, and -find
|
||||
rm_merge. -root and -old-root set command -disk_dev_ino to
|
||||
"ino_only" and -md5 to "on", by default. -disk_dev_ino can be set
|
||||
to "off" by --old-root-no-ino resp. to "on" by --old-root-devno .
|
||||
-md5 can be set to "off" by --old-root-no-md5 .
|
||||
Not original mkisofs options are --quoted_path_list , --hardlinks
|
||||
, --acl , --xattr , --md5 , --stdio_sync . They work like the
|
||||
xorriso options with the same name and hardcoded argument "on",
|
||||
@ -3805,7 +3822,7 @@ $ xorriso \
|
||||
-dev /dev/sr0 \
|
||||
-volid PROJECTS_MAIL_"$(date '+%Y_%m_%d_%H%M%S')" \
|
||||
-not_leaf '*.o' -not_leaf '*.swp' \
|
||||
-update_r /home/thomas/open_source_projects /open_source_projects \
|
||||
-update_r /home/thomas/projects /projects \
|
||||
-update_r /home/thomas/personal_mail /personal_mail \
|
||||
-commit -toc -check_md5 FAILURE -- -eject all
|
||||
|
||||
@ -3843,6 +3860,15 @@ commands for older sessions in the table-of-content. E.g. as superuser:
|
||||
|
||||
# osirrox -mount /dev/sr0 "volid" '*2008_12_05*' /mnt
|
||||
|
||||
This example produces a result similar to -root / -old-root / with
|
||||
mkisofs. For getting the session trees accumulated in the new
|
||||
sessions, let all -update commands use a common parent directory and
|
||||
clone it after updating is done:
|
||||
-update_r /home/thomas/projects /current/projects \
|
||||
-update_r /home/thomas/personal_mail /current/personal_mail \
|
||||
-clone /current /"$(date '+%Y_%m_%d_%H%M%S')" \
|
||||
The cloned tree will have a name like /2011_02_12_155700.
|
||||
|
||||
Sessions on multi-session media are separated by several MB of unused
|
||||
blocks. So with small sessions the payload capacity can become
|
||||
substantially lower than the overall media capacity. If the remaining
|
||||
@ -3856,9 +3882,6 @@ stored safely on a different media. Always have a blank media ready to
|
||||
perform a full backup in case the update attempt fails due to
|
||||
insufficient remaining capacity.
|
||||
|
||||
This example produces a result similar to -root / -old-root / with
|
||||
mkisofs.
|
||||
|
||||
|
||||
File: xorriso.info, Node: ExRestore, Next: ExRecovery, Prev: ExIncBackup, Up: Examples
|
||||
|
||||
@ -4468,45 +4491,45 @@ Node: Options23227
|
||||
Node: AqDrive24835
|
||||
Node: Loading27741
|
||||
Node: Insert40885
|
||||
Node: SetInsert50450
|
||||
Node: Manip59017
|
||||
Node: CmdFind67698
|
||||
Node: Filter78122
|
||||
Node: Writing82471
|
||||
Node: SetWrite88760
|
||||
Node: Bootable102370
|
||||
Node: Jigdo114677
|
||||
Node: Charset118935
|
||||
Node: Exception121686
|
||||
Node: DialogCtl126201
|
||||
Node: Inquiry128788
|
||||
Node: Navigate133121
|
||||
Node: Verify141016
|
||||
Node: Restore149605
|
||||
Node: Emulation156261
|
||||
Node: Scripting165493
|
||||
Node: Frontend171055
|
||||
Node: Examples172350
|
||||
Node: ExDevices173519
|
||||
Node: ExCreate174153
|
||||
Node: ExDialog175427
|
||||
Node: ExGrowing176689
|
||||
Node: ExModifying177491
|
||||
Node: ExBootable177992
|
||||
Node: ExCharset178539
|
||||
Node: ExPseudo179367
|
||||
Node: ExCdrecord180261
|
||||
Node: ExMkisofs180576
|
||||
Node: ExGrowisofs181579
|
||||
Node: ExException182703
|
||||
Node: ExTime183157
|
||||
Node: ExIncBackup183616
|
||||
Node: ExRestore187184
|
||||
Node: ExRecovery188153
|
||||
Node: Files188719
|
||||
Node: Seealso189947
|
||||
Node: Legal190471
|
||||
Node: CommandIdx191393
|
||||
Node: ConceptIdx205765
|
||||
Node: SetInsert50504
|
||||
Node: Manip59071
|
||||
Node: CmdFind67752
|
||||
Node: Filter79052
|
||||
Node: Writing83401
|
||||
Node: SetWrite89690
|
||||
Node: Bootable103300
|
||||
Node: Jigdo115607
|
||||
Node: Charset119865
|
||||
Node: Exception122616
|
||||
Node: DialogCtl127131
|
||||
Node: Inquiry129718
|
||||
Node: Navigate134051
|
||||
Node: Verify141991
|
||||
Node: Restore150580
|
||||
Node: Emulation157236
|
||||
Node: Scripting166510
|
||||
Node: Frontend172072
|
||||
Node: Examples173367
|
||||
Node: ExDevices174536
|
||||
Node: ExCreate175170
|
||||
Node: ExDialog176444
|
||||
Node: ExGrowing177706
|
||||
Node: ExModifying178508
|
||||
Node: ExBootable179009
|
||||
Node: ExCharset179556
|
||||
Node: ExPseudo180384
|
||||
Node: ExCdrecord181278
|
||||
Node: ExMkisofs181593
|
||||
Node: ExGrowisofs182596
|
||||
Node: ExException183720
|
||||
Node: ExTime184174
|
||||
Node: ExIncBackup184633
|
||||
Node: ExRestore188553
|
||||
Node: ExRecovery189522
|
||||
Node: Files190088
|
||||
Node: Seealso191316
|
||||
Node: Legal191840
|
||||
Node: CommandIdx192762
|
||||
Node: ConceptIdx207134
|
||||
|
||||
End Tag Table
|
||||
|
@ -44,7 +44,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 "Feb 07, 2011"
|
||||
@c man .TH XORRISO 1 "Feb 12, 2011"
|
||||
@c man .\" Please adjust this date whenever revising the manpage.
|
||||
@c man .\"
|
||||
@c man .\" Some roff macros, for reference:
|
||||
@ -1331,7 +1331,8 @@ already exists in the ISO tree.
|
||||
@kindex -cp_clone copies ISO directory tree
|
||||
@cindex Directories, copy, -cp_clone
|
||||
Create copies of one or more ISO file objects as with command -clone.
|
||||
Do not not overwrite existing ISO file objects.
|
||||
Eventually merge directories with existing ones, but do not overwrite
|
||||
existing ISO file objects.
|
||||
@*
|
||||
The rules for generating the copy addresses are the same as with
|
||||
command -cpr (see above) resp. shell command cp -r. Other than with -cpr,
|
||||
@ -2013,6 +2014,16 @@ performs command -update with the found file address as
|
||||
iso_rr_path. The corresponding file address is determined like with above
|
||||
action "compare".
|
||||
@*
|
||||
@item update_merge
|
||||
is like update but does not delete the found file if it is missing on disk.
|
||||
It may be run several times and records with all visited files whether their
|
||||
counterpart on disk has already been seen by one of the update_merge runs.
|
||||
Finally, a -find run with action "rm_merge" may remove all files that
|
||||
saw no counterpart on disk.
|
||||
@*
|
||||
Up to the next "rm_merge" or "clear_merge" all newly inserted files will
|
||||
get marked as having a disk counterpart.
|
||||
@*
|
||||
@item rm
|
||||
removes the found iso_rr_path from the image if it is not a directory
|
||||
with files in it. I.e. this "rm" includes "rmdir".
|
||||
@ -2021,6 +2032,14 @@ with files in it. I.e. this "rm" includes "rmdir".
|
||||
removes the found iso_rr_path from the image, including whole
|
||||
directory trees.
|
||||
@*
|
||||
@item rm_merge
|
||||
removes the found iso_rr_path if it was visited by one or more previous actions
|
||||
"update_merge" and saw no counterpart on disk in any of them. The marking from
|
||||
the update actions is removed in any case.
|
||||
@*
|
||||
@item clear_merge
|
||||
removes an eventual marking from action "update_merge".
|
||||
@*
|
||||
@item report_damage
|
||||
classifies files whether they hit a data block that is
|
||||
marked as damaged. The result is printed together with the eventual address
|
||||
@ -3708,7 +3727,7 @@ not exist in the ISO image. The report format is the same as with command
|
||||
@*
|
||||
@item add_missing iso_rr_path_start
|
||||
adds the counterpart if it does not yet
|
||||
exist in the ISO image.
|
||||
exist in the ISO image and marks it for "rm_merge" as non-removable.
|
||||
@*
|
||||
E.g.: -findx /home/thomas -exec add_missing /thomas_on_cd @minus{}@minus{}
|
||||
@*
|
||||
@ -4205,9 +4224,10 @@ allowed to violate the standard by -compliance option allow_dir_id_ext.
|
||||
This may be avoided by option -disallow_dir_id_ext.
|
||||
@*
|
||||
Option -root is supported. Option -old-root is implemented by xorriso
|
||||
commands -mkdir, -cp_clone, and -update_r. It sets command -disk_dev_ino
|
||||
to "ino_only" and -md5 to "on", by default. -disk_dev_ino can be set
|
||||
to "off" by @minus{}@minus{}old-root-no-ino
|
||||
commands -mkdir, -cp_clone, -find update_merge, and -find rm_merge.
|
||||
-root and -old-root set command -disk_dev_ino to "ino_only" and -md5 to "on",
|
||||
by default.
|
||||
@minus{}disk_dev_ino can be set to "off" by @minus{}@minus{}old-root-no-ino
|
||||
resp. to "on" by @minus{}@minus{}old-root-devno .
|
||||
@minus{}md5 can be set to "off" by @minus{}@minus{}old-root-no-md5 .
|
||||
@*
|
||||
@ -5129,7 +5149,7 @@ $ xorriso \
|
||||
@*
|
||||
-not_leaf '*.o' -not_leaf '*.swp' \
|
||||
@*
|
||||
-update_r /home/thomas/open_source_projects /open_source_projects \
|
||||
-update_r /home/thomas/projects /projects \
|
||||
@*
|
||||
-update_r /home/thomas/personal_mail /personal_mail \
|
||||
@*
|
||||
@ -5179,6 +5199,21 @@ older sessions in the table-of-content. E.g. as superuser:
|
||||
# osirrox -mount /dev/sr0 "volid" '*2008_12_05*' /mnt
|
||||
@*
|
||||
@sp 1
|
||||
@c man .sp 1
|
||||
Above example produces a result similar to -root / -old-root / with mkisofs.
|
||||
For getting the session trees accumulated in the new sessions, let all -update
|
||||
commands use a common parent directory and clone it after updating is done:
|
||||
@*
|
||||
-update_r /home/thomas/projects /current/projects \
|
||||
@*
|
||||
-update_r /home/thomas/personal_mail /current/personal_mail \
|
||||
@*
|
||||
-clone /current /"$(date '+%Y_%m_%d_%H%M%S')" \
|
||||
@*
|
||||
The cloned tree will have a name like /2011_02_12_155700.
|
||||
@*
|
||||
@sp 1
|
||||
@c man .sp 1
|
||||
Sessions on multi-session media are separated by several MB of unused blocks.
|
||||
So with small sessions the payload capacity can become substantially lower
|
||||
than the overall media capacity. If the remaining space on media does not
|
||||
@ -5186,15 +5221,13 @@ suffice for the next gap, the drive is supposed to close the media
|
||||
automatically.
|
||||
@*
|
||||
@sp 1
|
||||
@c man .sp 1
|
||||
@strong{Better do not use your youngest backup for -update_r}.
|
||||
Have at least two media which you use alternatingly. So only older backups
|
||||
get endangered by the new write operation, while the newest backup is
|
||||
stored safely on a different media.
|
||||
Always have a blank media ready to perform a full backup in case the update
|
||||
attempt fails due to insufficient remaining capacity.
|
||||
@*
|
||||
@sp 1
|
||||
This example produces a result similar to -root / -old-root / with mkisofs.
|
||||
@c man .SS
|
||||
@c man .B Restore directory trees from a particular ISO session to disk
|
||||
@node ExRestore, ExRecovery, ExIncBackup, Examples
|
||||
|
@ -582,6 +582,10 @@ struct XorrisO { /* the global context of xorriso */
|
||||
|
||||
struct PermiteM *perm_stack; /* Temporarily altered dir access permissions */
|
||||
|
||||
/* bit0= update_merge active: mark all newly added nodes as visited+found
|
||||
*/
|
||||
int update_flags;
|
||||
|
||||
/* result (stdout, R: ) */
|
||||
char result_line[10*SfileadrL];
|
||||
int result_line_counter;
|
||||
|
@ -1 +1 @@
|
||||
#define Xorriso_timestamP "2011.02.08.133624"
|
||||
#define Xorriso_timestamP "2011.02.12.171423"
|
||||
|
@ -567,6 +567,8 @@ int Xorriso_clone_tree(struct XorrisO *xorriso, void *boss_iter,
|
||||
int Xorriso_clone_under(struct XorrisO *xorriso, char *origin, char *dest,
|
||||
int flag);
|
||||
|
||||
int Xorriso_mark_update_merge(struct XorrisO *xorriso, char *path,
|
||||
void *node, int flag);
|
||||
|
||||
#endif /* Xorrisoburn_includeD */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user