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