Bug fix: -backslash_codes "with_program_arguments" was interpreted too late

This commit is contained in:
2013-05-30 19:26:07 +00:00
parent e5fe7c117d
commit 4cae30b6fe
7 changed files with 157 additions and 72 deletions

View File

@ -2086,6 +2086,26 @@ ex:;
}
/* @return 1=replaced , 2=not replaced , <=0 = error
*/
int Xorriso_replace_arg_by_bsl(struct XorrisO *xorriso, char **arg,
char **argpt, int flag)
{
int ret, eaten, l;
if(!(xorriso->bsl_interpretation & 16))
return(2);
l= strlen(*argpt);
Xorriso_free_meM(*arg);
Xorriso_alloc_meM(*arg, char, l + 1);
strcpy(*arg, *argpt);
*argpt= *arg;
ret= Sfile_bsl_interpreter(*arg, l, &eaten, 0);
ex:;
return(ret);
}
int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
int flag)
/*
@ -2100,14 +2120,16 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
*/
{
int i, ret, was_dashed, num2, arg_count;
int advice, mem_add_plainly, error_seen= 0;
int advice, mem_add_plainly, error_seen= 0, mem_bsl;
int was_report_about= 0, was_abort_on= 0, was_return_with= 0;
int was_signal_handling= 0, was_scsi_log= 0, cmd_data_size= 5 * SfileadrL;
char *cmd, *original_cmd, *cmd_data= NULL, *arg1, *arg2;
char *arg1_data= NULL, *arg2_data= NULL;
char mem_list_delimiter[81];
strcpy(mem_list_delimiter, xorriso->list_delimiter);
mem_add_plainly= xorriso->add_plainly;
mem_bsl= xorriso->bsl_interpretation;
Xorriso_alloc_meM(cmd_data, char, cmd_data_size);
@ -2121,11 +2143,19 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
{ret= -1; goto ex;}
arg1= "";
if(i+1<argc)
arg1= argv[i+1];
if(i + 1 < argc) {
arg1= argv[i + 1];
ret= Xorriso_replace_arg_by_bsl(xorriso, &arg1_data, &arg1, 0);
if(ret <= 0)
goto ex;
}
arg2= "";
if(i+2<argc)
arg2= argv[i+2];
if(i + 2 < argc) {
arg2= argv[i + 2];
ret= Xorriso_replace_arg_by_bsl(xorriso, &arg2_data, &arg2, 0);
if(ret <= 0)
goto ex;
}
if(i>1)
xorriso->did_something_useful= 1;
if(i==1 && argc==2) {
@ -2255,6 +2285,12 @@ protect_stdout:;
} else if(strcmp(original_cmd, "-x") == 0) {
xorriso->arrange_args= 1;
} else if(strcmp(cmd, "backslash_codes") == 0) {
i++;
ret= Xorriso_option_backslash_codes(xorriso, arg1, 0);
if(ret <= 0)
error_seen= 1;
} else {
ret= Xorriso_count_args(xorriso, argc - i, argv + i, &arg_count, 1);
if(ret == 1) {
@ -2272,6 +2308,9 @@ protect_stdout:;
ex:;
strcpy(xorriso->list_delimiter, mem_list_delimiter);
xorriso->add_plainly= mem_add_plainly;
xorriso->bsl_interpretation= mem_bsl;
Xorriso_free_meM(arg1_data);
Xorriso_free_meM(arg2_data);
Xorriso_free_meM(cmd_data);
if(error_seen && ret > 0) {
advice= Xorriso_eval_problem_status(xorriso, 0, 0);
@ -2472,11 +2511,74 @@ int Xorriso_make_return_value(struct XorrisO *xorriso, int flag)
int Xorriso_program_arg_bsl(struct XorrisO *xorriso, int argc, char ***argv,
int flag)
{
int ret;
int i, ret, eaten, bsl_mem, params_to_come= 0, cmd_data_size= 5 * SfileadrL;
int next_is_backslash_codes= 0, next_is_list_delimiter= 0;
char **new_argv= NULL, *cmd, *cmd_data= NULL;
char mem_list_delimiter[81];
if(!(xorriso->bsl_interpretation & 16))
return(1);
ret= Sfile_argv_bsl(argc, argv, 0);
strcpy(mem_list_delimiter, xorriso->list_delimiter);
bsl_mem= xorriso->bsl_interpretation;
if(argc <= 0)
return(0);
Xorriso_alloc_meM(cmd_data, char, cmd_data_size);
new_argv= (char **) Smem_malloC(argc * sizeof(char *));
if(new_argv == NULL)
return(-1);
for(i= 0; i < argc; i++) {
new_argv[i]= strdup((*argv)[i]);
if(new_argv[i] == NULL)
{ret= -1; goto ex;}
if(i == 0)
continue;
if(xorriso->bsl_interpretation & 16) {
ret= Sfile_bsl_interpreter(new_argv[i], strlen(new_argv[i]), &eaten, 0);
if(ret <= 0)
goto ex;
}
if(params_to_come == 0) {
ret= Xorriso_normalize_command(xorriso, new_argv[i], i,
cmd_data, cmd_data_size, &cmd, 0);
if(ret < 0)
goto ex;
if(strcmp(cmd, "backslash_codes") == 0) {
params_to_come= 1;
next_is_backslash_codes= 1;
} else if(strcmp(cmd, "list_delimiter") == 0) {
params_to_come= 1;
next_is_list_delimiter= 1;
} else {
ret= Xorriso_count_args(xorriso, argc - i, *argv + i,
&params_to_come, 1);
if(ret <= 0)
goto ex;
if(ret != 1)
params_to_come= 0;
}
} else {
params_to_come--;
if(next_is_backslash_codes) {
next_is_backslash_codes= 0;
ret= Xorriso_option_backslash_codes(xorriso, new_argv[i], 0);
if(ret <= 0)
goto ex;
} else if(next_is_list_delimiter) {
next_is_list_delimiter= 0;
ret= Xorriso_option_list_delimiter(xorriso, new_argv[i], 0);
if(ret <= 0)
goto ex;
}
}
}
ret= 1;
ex:;
Xorriso_free_meM(cmd_data);
strcpy(xorriso->list_delimiter, mem_list_delimiter);
xorriso->bsl_interpretation= bsl_mem;
if(ret <= 0) {
if(new_argv != NULL)
free((char *) new_argv);
} else
*argv= new_argv;
return(ret);
}