New command -update_lxi

This commit is contained in:
2016-12-05 14:35:04 +01:00
parent 9b75d21e2a
commit 7b12dd0dda
12 changed files with 267 additions and 94 deletions

View File

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