|
|
|
@ -553,22 +553,25 @@ ex:;
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Options -map_l , -compare_l , -update_l , -extract_l */ |
|
|
|
|
/* Command -map_l , -compare_l , -update_l , -extract_l , -update_lxi */ |
|
|
|
|
/* @param flag bit4= do not establish and dispose xorriso->di_array
|
|
|
|
|
for update_l |
|
|
|
|
bit8-11= mode 0= -map_l |
|
|
|
|
1= -compare_l |
|
|
|
|
2= -update_l |
|
|
|
|
3= -extract_l |
|
|
|
|
4= -update_lxi |
|
|
|
|
*/ |
|
|
|
|
int Xorriso_option_map_l(struct XorrisO *xorriso, int argc, char **argv, |
|
|
|
|
int *idx, int flag) |
|
|
|
|
{ |
|
|
|
|
int ret, end_idx, optc= 0, was_failure= 1, i, fret, mode, problem_count; |
|
|
|
|
int ns_flag= 2|4, nt_flag= 2, opt_args_flag= 2; |
|
|
|
|
int ret, end_idx, optc= 0, was_failure= 1, i, j, fret, mode, problem_count; |
|
|
|
|
int ns_flag= 2|4, nt_flag= 2, opt_args_flag= 2, arg2c= 0, opt2c= 0; |
|
|
|
|
int new_opt2c; |
|
|
|
|
char *source_prefix= NULL, *target_prefix= NULL, *cmd, **optv= NULL; |
|
|
|
|
char *eff_source= NULL, *eff_target= NULL, *source_pt, *s_wd, *t_wd; |
|
|
|
|
char **eff_src_array= NULL, **eff_tgt_array= NULL; |
|
|
|
|
char *eff_source= NULL, *eff_target= NULL, *s_wd, *t_wd; |
|
|
|
|
char **eff_src_array= NULL, **eff_tgt_array= NULL, **opt2v= NULL; |
|
|
|
|
char **arg2v= NULL; |
|
|
|
|
|
|
|
|
|
cmd= "-map_l"; |
|
|
|
|
s_wd= xorriso->wdx; |
|
|
|
@ -587,6 +590,8 @@ int Xorriso_option_map_l(struct XorrisO *xorriso, int argc, char **argv,
|
|
|
|
|
nt_flag= 2|4; |
|
|
|
|
t_wd= xorriso->wdx; |
|
|
|
|
opt_args_flag= 0; |
|
|
|
|
} else if(mode == 4) { |
|
|
|
|
cmd= "-update_lxi"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 1|2); |
|
|
|
@ -614,7 +619,77 @@ int Xorriso_option_map_l(struct XorrisO *xorriso, int argc, char **argv,
|
|
|
|
|
&optc, &optv, opt_args_flag); |
|
|
|
|
if(ret<=0) |
|
|
|
|
goto ex; |
|
|
|
|
|
|
|
|
|
if(mode == 4) { |
|
|
|
|
/* Convert pattern from disk to iso_rr */ |
|
|
|
|
arg2c= end_idx - *idx - 2; |
|
|
|
|
Xorriso_alloc_meM(arg2v, char *, arg2c); |
|
|
|
|
for(i = 0; i < arg2c; i++) |
|
|
|
|
arg2v[i]= NULL; |
|
|
|
|
arg2c= 0; |
|
|
|
|
for(i = (*idx) + 2; i < end_idx; i++) { |
|
|
|
|
ret= Xorriso_normalize_img_path(xorriso, s_wd, argv[i], |
|
|
|
|
eff_source, ns_flag); |
|
|
|
|
if(ret<=0) |
|
|
|
|
goto ex; |
|
|
|
|
ret= Xorriso__exchange_prefix(source_prefix, target_prefix, |
|
|
|
|
eff_source, eff_target, 0); |
|
|
|
|
if(ret <= 0) |
|
|
|
|
continue; |
|
|
|
|
Xorriso_alloc_meM(arg2v[arg2c], char, strlen(eff_target) + 1); |
|
|
|
|
strcpy(arg2v[arg2c], eff_target); |
|
|
|
|
arg2c++; |
|
|
|
|
} |
|
|
|
|
/* Expand wildcards in iso_rr, do not include unmatched patterns */ |
|
|
|
|
ret= Xorriso_opt_args(xorriso, cmd, arg2c, arg2v, 0, &i, |
|
|
|
|
&opt2c, &opt2v, (1 << 10) | (1 << 7)); |
|
|
|
|
if(ret<=0) |
|
|
|
|
goto ex; |
|
|
|
|
/* Convert from iso_rr path to disk path */ |
|
|
|
|
new_opt2c= 0; |
|
|
|
|
for(i = 0; i < opt2c; i++) { |
|
|
|
|
ret= Xorriso__exchange_prefix(target_prefix, source_prefix, |
|
|
|
|
opt2v[i], eff_source, 0); |
|
|
|
|
free(opt2v[i]); |
|
|
|
|
opt2v[i]= NULL; |
|
|
|
|
if(ret <= 0) |
|
|
|
|
continue; |
|
|
|
|
Xorriso_alloc_meM(opt2v[new_opt2c], char, strlen(eff_source) + 1); |
|
|
|
|
strcpy(opt2v[new_opt2c], eff_source); |
|
|
|
|
new_opt2c++; |
|
|
|
|
} |
|
|
|
|
opt2c= new_opt2c; |
|
|
|
|
/* Merge both results */ |
|
|
|
|
if(opt2c > 0) { |
|
|
|
|
Sfile_destroy_argv(&arg2c, &arg2v, 0); |
|
|
|
|
Xorriso_alloc_meM(arg2v, char *, optc + opt2c); |
|
|
|
|
for(i = 0; i < optc + opt2c; i++) |
|
|
|
|
arg2v[i]= NULL; |
|
|
|
|
arg2c= 0; |
|
|
|
|
for(i= 0; i < optc; i++) { |
|
|
|
|
ret= Xorriso_normalize_img_path(xorriso, s_wd, optv[i], |
|
|
|
|
eff_source, ns_flag); |
|
|
|
|
if(ret<=0) |
|
|
|
|
goto ex; |
|
|
|
|
Xorriso_alloc_meM(arg2v[arg2c], char, strlen(eff_source) + 1); |
|
|
|
|
strcpy(arg2v[arg2c], eff_source); |
|
|
|
|
arg2c++; |
|
|
|
|
} |
|
|
|
|
for(i= 0; i < opt2c; i++) { |
|
|
|
|
for(j= 0; j < optc; j++) |
|
|
|
|
if(strcmp(opt2v[i], arg2v[j]) == 0) |
|
|
|
|
break; |
|
|
|
|
if(j < optc) |
|
|
|
|
continue; |
|
|
|
|
arg2v[arg2c++]= opt2v[i]; |
|
|
|
|
opt2v[i]= NULL; |
|
|
|
|
} |
|
|
|
|
Sfile_destroy_argv(&optc, &optv, 0); |
|
|
|
|
optv= arg2v; |
|
|
|
|
arg2v= NULL; |
|
|
|
|
optc= arg2c; |
|
|
|
|
arg2c= 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(mode == 3 && |
|
|
|
|
(xorriso->do_restore_sort_lba || !(xorriso->ino_behavior & 4))) { |
|
|
|
@ -627,8 +702,9 @@ int Xorriso_option_map_l(struct XorrisO *xorriso, int argc, char **argv,
|
|
|
|
|
for(i= 0; i < optc; i++) |
|
|
|
|
eff_src_array[i]= eff_tgt_array[i]= NULL; |
|
|
|
|
} |
|
|
|
|
if(mode == 2 && !((xorriso->ino_behavior & 2) || (flag & 16) || |
|
|
|
|
xorriso->di_array != NULL)) { |
|
|
|
|
if((mode == 2 || mode == 4) && |
|
|
|
|
!((xorriso->ino_behavior & 2) || (flag & 16) || |
|
|
|
|
xorriso->di_array != NULL)) { |
|
|
|
|
/* Create all-image node array sorted by isofs.di */ |
|
|
|
|
ret= Xorriso_make_di_array(xorriso, 0); |
|
|
|
|
if(ret <= 0) |
|
|
|
@ -640,26 +716,23 @@ int Xorriso_option_map_l(struct XorrisO *xorriso, int argc, char **argv,
|
|
|
|
|
eff_source, ns_flag); |
|
|
|
|
if(ret<=0) |
|
|
|
|
goto ex; |
|
|
|
|
strcpy(eff_target, target_prefix); |
|
|
|
|
source_pt= eff_source; |
|
|
|
|
if(source_prefix[0]) { |
|
|
|
|
if(strncmp(source_prefix, eff_source, strlen(source_prefix))!=0) { |
|
|
|
|
sprintf(xorriso->info_text, "%s: disk_path ", cmd); |
|
|
|
|
Text_shellsafe(eff_source, xorriso->info_text, 1); |
|
|
|
|
strcat(xorriso->info_text, " does not begin with disk_prefix "); |
|
|
|
|
Text_shellsafe(source_prefix, xorriso->info_text, 1); |
|
|
|
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 1); |
|
|
|
|
ret= 0; goto ex; |
|
|
|
|
} |
|
|
|
|
source_pt+= strlen(source_prefix); |
|
|
|
|
ret= Xorriso__exchange_prefix(source_prefix, target_prefix, |
|
|
|
|
eff_source, eff_target, 0); |
|
|
|
|
if(ret == 0) { |
|
|
|
|
sprintf(xorriso->info_text, "%s: disk_path ", cmd); |
|
|
|
|
Text_shellsafe(eff_source, xorriso->info_text, 1); |
|
|
|
|
strcat(xorriso->info_text, " does not begin with disk_prefix "); |
|
|
|
|
Text_shellsafe(source_prefix, xorriso->info_text, 1); |
|
|
|
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 1); |
|
|
|
|
} |
|
|
|
|
strcat(eff_target, source_pt); |
|
|
|
|
if(ret <= 0) |
|
|
|
|
goto ex; |
|
|
|
|
|
|
|
|
|
if(mode==0) |
|
|
|
|
ret= Xorriso_option_map(xorriso, eff_source, eff_target, 2); |
|
|
|
|
else if(mode==1) |
|
|
|
|
ret= Xorriso_option_compare(xorriso, eff_source, eff_target, 2|8); |
|
|
|
|
else if(mode==2) |
|
|
|
|
else if(mode == 2 || mode == 4) |
|
|
|
|
ret= Xorriso_option_update(xorriso, eff_source, eff_target, 2 | 8 | 16); |
|
|
|
|
else if(mode==3) { |
|
|
|
|
if(eff_src_array != NULL) { |
|
|
|
@ -701,7 +774,7 @@ int Xorriso_option_map_l(struct XorrisO *xorriso, int argc, char **argv,
|
|
|
|
|
if(mode==0) |
|
|
|
|
Xorriso_pacifier_callback(xorriso, "files added", xorriso->pacifier_count, |
|
|
|
|
xorriso->pacifier_total, "", 1); |
|
|
|
|
else if(mode==1 || mode==2) |
|
|
|
|
else if(mode==1 || mode==2 || mode == 4) |
|
|
|
|
Xorriso_pacifier_callback(xorriso, "content bytes read", |
|
|
|
|
xorriso->pacifier_count, 0, "", 1 | 8 | 32); |
|
|
|
|
else if(mode==3) |
|
|
|
@ -719,6 +792,13 @@ ex:;
|
|
|
|
|
Xorriso_free_meM(eff_target); |
|
|
|
|
(*idx)= end_idx; |
|
|
|
|
Xorriso_opt_args(xorriso, cmd, argc, argv, *idx, &end_idx, &optc, &optv, 256); |
|
|
|
|
Xorriso_opt_args(xorriso, cmd, argc, argv, *idx, &end_idx, &opt2c, &opt2v, |
|
|
|
|
256); |
|
|
|
|
if(arg2c > 0) |
|
|
|
|
Sfile_destroy_argv(&arg2c, &arg2v, 0); |
|
|
|
|
else if(arg2v != NULL) |
|
|
|
|
Xorriso_free_meM(arg2v); |
|
|
|
|
|
|
|
|
|
if(ret<=0) |
|
|
|
|
return(ret); |
|
|
|
|
return(!was_failure); |
|
|
|
|