New command -update_lxi
This commit is contained in:
@ -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);
|
||||
|
Reference in New Issue
Block a user