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