New -find actions update_merge, rm_merge, clear_merge. -cp_clone now merges.

This commit is contained in:
2011-02-12 17:14:23 +00:00
parent 4642148e6f
commit 26a6a24093
18 changed files with 435 additions and 116 deletions

View File

@ -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);
}