New commands -x, -list_arg_sorting
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
@ -450,7 +450,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
"ban_stdio_write","close_filter_list","commit",
|
||||
"device_links","devices","end",
|
||||
"for_backup", "help",
|
||||
"list_formats","list_speeds",
|
||||
"list_arg_sorting","list_formats","list_speeds",
|
||||
"no_rc","print_size","pvd_info","pwd","pwdi","pwdx",
|
||||
"read_mkisofsrc","rollback","rollback_end",
|
||||
"tell_media_space","toc","version",
|
||||
@ -571,9 +571,278 @@ ex:
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= list sorting order rather than looking for argv[idx]
|
||||
*/
|
||||
int Xorriso_cmd_sorting_rank(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int idx, int flag)
|
||||
{
|
||||
int ret, i, cmd_data_size= 2 * SfileadrL;
|
||||
char *cmd, *cmd_data= NULL;
|
||||
static char *commands[]= {
|
||||
|
||||
"* Execution order of program arguments with option -x:",
|
||||
"x",
|
||||
|
||||
"* Support for frontend programs via stdin and stdout (1):",
|
||||
"prog", "prog_help",
|
||||
|
||||
"* Exception processing:",
|
||||
"abort_on", "return_with", "report_about", "signal_handling",
|
||||
"error_behavior",
|
||||
|
||||
"* Scripting, dialog and program control features (1):",
|
||||
"no_rc", "help", "version", "list_extras", "list_arg_sorting",
|
||||
"temp_mem_limit", "backslash_codes",
|
||||
"errfile_log", "session_log", "scsi_log",
|
||||
"options_from_file", "list_delimiter",
|
||||
"print", "print_info", "print_mark", "prompt", "sleep",
|
||||
|
||||
"* Drive and media related inquiry actions (1):",
|
||||
"devices", "device_links",
|
||||
"mount_opts", "mount_cmd", "session_string",
|
||||
|
||||
"* Influencing the behavior of image loading:",
|
||||
"load", "displacement", "drive_class", "assert_volid", "in_charset",
|
||||
"auto_charset", "hardlinks", "acl", "xattr", "md5", "for_backup",
|
||||
"disk_dev_ino", "rom_toc_scan", "calm_drive", "ban_stdio_write",
|
||||
"early_stdio_test",
|
||||
|
||||
"* Character sets:",
|
||||
"charset", "local_charset",
|
||||
|
||||
"* Aquiring source and target drive:",
|
||||
"dev", "indev", "outdev",
|
||||
|
||||
"* Drive and media related inquiry actions (2):",
|
||||
"list_profiles", "list_formats", "list_speeds",
|
||||
"toc", "pvd_info",
|
||||
|
||||
"* Settings for file insertion:",
|
||||
"file_size_limit", "not_mgt", "not_paths", "not_leaf", "not_list",
|
||||
"quoted_not_list", "follow", "pathspecs", "overwrite", "split_size",
|
||||
|
||||
"* Navigation in ISO image and disk filesystem (1):",
|
||||
"cd", "cdx", "pwd", "pwdx",
|
||||
|
||||
"* Inserting files into ISO image:",
|
||||
"disk_pattern", "add_plainly",
|
||||
"mkdir", "add", "path_list", "quoted_path_list",
|
||||
"map", "map_single", "map_l", "update", "update_r", "update_l",
|
||||
"cut_out", "cpr",
|
||||
"clone", "cp_clone",
|
||||
|
||||
"* Navigation in ISO image and disk filesystem (2):",
|
||||
"ls", "lsd", "lsl", "lsdl", "lsx", "lsdx", "lslx", "lsdlx",
|
||||
"getfacl", "getfacl_r", "getfattr", "getfattr_r", "du", "dus",
|
||||
"dux", "dusx", "findx",
|
||||
"compare", "compare_r", "compare_l", "show_stream", "show_stream_r",
|
||||
|
||||
"* File manipulations:",
|
||||
"iso_rr_pattern",
|
||||
"rm", "rm_r", "rmdir", "mv",
|
||||
"chown", "chown_r", "chgrp", "chgrp_r", "chmod", "chmod_r", "setfacl",
|
||||
"setfacl_r", "setfacl_list", "setfattr", "setfattr_r", "setfattr_list",
|
||||
"alter_date", "alter_date_r", "hide",
|
||||
|
||||
"* Filters for data file content:",
|
||||
"external_filter", "unregister_filter", "close_filter_list",
|
||||
"set_filter", "set_filter_r",
|
||||
|
||||
"* Tree traversal command -find:",
|
||||
"find",
|
||||
|
||||
"* osirrox ISO-to-disk restore options:",
|
||||
"osirrox", "extract", "extract_single", "extract_l", "extract_cut",
|
||||
"cpx", "cpax", "cp_rx", "cp_rax", "paste_in",
|
||||
"mount",
|
||||
|
||||
"* Settings for result writing:",
|
||||
"joliet", "compliance", "volid", "volset_id", "publisher",
|
||||
"application_id", "system_id", "volume_date", "copyright_file",
|
||||
"abstract_file", "biblio_file", "preparer_id", "out_charset",
|
||||
"read_mkisofsrc",
|
||||
"uid", "gid", "zisofs", "speed", "stream_recording", "dvd_obs",
|
||||
"stdio_sync", "dummy", "fs", "close", "padding",
|
||||
"grow_blindly", "pacifier", "scdbackup_tag",
|
||||
|
||||
"* Bootable ISO images:",
|
||||
"boot_image", "append_partition",
|
||||
|
||||
"* Jigdo Template Extraction:",
|
||||
"jigdo",
|
||||
|
||||
"* Command compatibility emulations:",
|
||||
"as",
|
||||
|
||||
"* Scripting, dialog and program control features (2):",
|
||||
"history", "status_history_max", "status",
|
||||
|
||||
"* Drive and media related inquiry actions (3):",
|
||||
"print_size", "tell_media_space",
|
||||
|
||||
"* Writing the result, drive control:",
|
||||
"format", "blank", "close_damaged",
|
||||
"rollback", "commit", "commit_eject",
|
||||
"eject",
|
||||
|
||||
"* Evaluation of readability and recovery:",
|
||||
"check_media_defaults", "check_media", "check_md5", "check_md5_r",
|
||||
|
||||
"* Support for frontend programs via stdin and stdout (2):",
|
||||
"pkt_output", "logfile", "mark",
|
||||
|
||||
"* Dialog mode control:",
|
||||
"dialog", "page", "use_readline", "reassure",
|
||||
|
||||
"* Scripting, dialog and program control features (3):",
|
||||
"rollback_end", "end",
|
||||
|
||||
""
|
||||
};
|
||||
|
||||
if(flag & 1) {
|
||||
for(i= 0; commands[i][0] !=0; i++) {
|
||||
if(commands[i][0] == '*')
|
||||
sprintf(xorriso->result_line, "#%s\n", commands[i] + 1);
|
||||
else
|
||||
sprintf(xorriso->result_line, "-%s\n", commands[i]);
|
||||
Xorriso_result(xorriso, 0);
|
||||
}
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
if(argc <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
Xorriso_alloc_meM(cmd_data, char, cmd_data_size);
|
||||
ret= Xorriso_normalize_command(xorriso, argv[idx], -1,
|
||||
cmd_data, cmd_data_size, &cmd, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
|
||||
if(cmd[0] == '#' || cmd[0] == 0 ||
|
||||
strcmp(cmd, xorriso->list_delimiter) == 0) {
|
||||
/* Move to end: comment line , empty option , orphaned list delimiter */
|
||||
ret= 0x7fffffff; goto ex;
|
||||
}
|
||||
for(i= 0; commands[i][0] !=0; i++) {
|
||||
if(commands[i][0] == '*') /* headline in command list */
|
||||
continue;
|
||||
if(strcmp(commands[i], cmd) != 0)
|
||||
continue;
|
||||
ret= i + 1; goto ex;
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:
|
||||
Xorriso_free_meM(cmd_data);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__cmp_cmd_rank(const void *a, const void *b)
|
||||
{
|
||||
int ra, rb;
|
||||
|
||||
ra= ((int *) a)[1];
|
||||
rb= ((int *) b)[1];
|
||||
if(ra < rb)
|
||||
return(-1);
|
||||
if(ra > rb)
|
||||
return(1);
|
||||
ra= ((int *) a)[2];
|
||||
rb= ((int *) b)[2];
|
||||
if(ra < rb)
|
||||
return(-1);
|
||||
if(ra > rb)
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= print command sequence rather than executing it
|
||||
bit1= these are command line arguments
|
||||
(for xorriso->argument_emulation)
|
||||
*/
|
||||
int Xorriso_exec_args_sorted(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int *idx, int flag)
|
||||
{
|
||||
int cmd_count= 0, ret, i, arg_count, *idx_rank= NULL, cmd_idx;
|
||||
|
||||
/* Count commands and allocate index-rank array */
|
||||
for(i= *idx; i < argc; i++) {
|
||||
ret= Xorriso_count_args(xorriso, argc - i, argv + i, &arg_count, 1);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(ret != 1)
|
||||
continue;
|
||||
cmd_count++;
|
||||
i+= arg_count;
|
||||
}
|
||||
if(cmd_count <= 0)
|
||||
{ret= 1; goto ex;}
|
||||
Xorriso_alloc_meM(idx_rank, int, 3 * cmd_count);
|
||||
|
||||
/* Fill index-rank array and sort */
|
||||
cmd_count= 0;
|
||||
for(i= *idx; i < argc; i++) {
|
||||
ret= Xorriso_count_args(xorriso, argc - i, argv + i, &arg_count, 1);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(ret != 1)
|
||||
continue;
|
||||
idx_rank[3 * cmd_count]= i;
|
||||
ret= Xorriso_cmd_sorting_rank(xorriso, argc, argv, i, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
idx_rank[3 * cmd_count + 1]= ret;
|
||||
idx_rank[3 * cmd_count + 2]= cmd_count;
|
||||
cmd_count++;
|
||||
i+= arg_count;
|
||||
}
|
||||
qsort(idx_rank, cmd_count, 3 * sizeof(int), Xorriso__cmp_cmd_rank);
|
||||
|
||||
/* Execute or print indice from index-rank array */
|
||||
if(flag & 1) {
|
||||
sprintf(xorriso->result_line,
|
||||
"Automatically determined command sequence:\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
xorriso->result_line[0]= 0;
|
||||
}
|
||||
for(i= 0; i < cmd_count; i++) {
|
||||
cmd_idx= idx_rank[3 * i];
|
||||
if(flag & 1) {
|
||||
if(strlen(xorriso->result_line) + 1 + strlen(argv[cmd_idx]) > 78) {
|
||||
strcat(xorriso->result_line, "\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
xorriso->result_line[0]= 0;
|
||||
}
|
||||
sprintf(xorriso->result_line + strlen(xorriso->result_line),
|
||||
" %s", argv[cmd_idx]);
|
||||
} else {
|
||||
ret= Xorriso_interpreter(xorriso, argc, argv, &cmd_idx, 4 | (flag & 2));
|
||||
if(ret <= 0 || ret == 3)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
if(flag & 1) {
|
||||
if(strlen(xorriso->result_line) > 0) {
|
||||
strcat(xorriso->result_line, "\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
}
|
||||
} else
|
||||
*idx= argc;
|
||||
ret= 1;
|
||||
ex:
|
||||
Xorriso_free_meM(idx_rank);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= recursion
|
||||
bit1= these are command line arguments
|
||||
(for xorriso->argument_emulation)
|
||||
bit2= Only execute the one command argv[*idx] and advance
|
||||
*idx to the next command if sucessful. Then return.
|
||||
*/
|
||||
int Xorriso_interpreter(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int *idx, int flag)
|
||||
@ -610,6 +879,10 @@ next_command:;
|
||||
if((*idx)>=argc)
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
if((xorriso->arrange_args || (flag & 8)) && !(flag & (4 | 16))) {
|
||||
ret= Xorriso_exec_args_sorted(xorriso, argc, argv, idx, 0);
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_count_args(xorriso, argc - *idx, argv + *idx, &arg_count, 1);
|
||||
@ -1019,6 +1292,9 @@ next_command:;
|
||||
(*idx)++;
|
||||
ret= Xorriso_option_joliet(xorriso, arg1, 0);
|
||||
|
||||
} else if(strcmp(cmd, "list_arg_sorting") == 0) {
|
||||
ret= Xorriso_option_list_arg_sorting(xorriso, 0);
|
||||
|
||||
} else if(strcmp(cmd, "list_delimiter") == 0) {
|
||||
(*idx)++;
|
||||
ret= Xorriso_option_list_delimiter(xorriso, arg1, 0);
|
||||
@ -1423,6 +1699,9 @@ next_command:;
|
||||
(*idx)+= 2;
|
||||
ret= Xorriso_option_volume_date(xorriso, arg1, arg2, 0);
|
||||
|
||||
} else if(strcmp(cmd, "x") == 0) {
|
||||
/* only in effect in Xorriso_prescan_args() */;
|
||||
|
||||
} else if(strcmp(cmd,"xattr")==0) {
|
||||
(*idx)++;
|
||||
ret= Xorriso_option_xattr(xorriso, arg1, 0);
|
||||
@ -1459,7 +1738,7 @@ eval_any_problems:
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
|
||||
if(*idx<argc)
|
||||
if(*idx < argc && !(flag & 4))
|
||||
goto next_command;
|
||||
|
||||
ex:;
|
||||
@ -1589,6 +1868,7 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int flag)
|
||||
/*
|
||||
bit0= do not interpret argv[1]
|
||||
bit1= complain about inknown arguments
|
||||
*/
|
||||
/*
|
||||
return:
|
||||
@ -1750,6 +2030,9 @@ protect_stdout:;
|
||||
Xorriso_option_signal_handling(xorriso, arg1, 1); /* no install */
|
||||
was_signal_handling= 1;
|
||||
|
||||
} else if(strcmp(original_cmd, "-x") == 0) {
|
||||
xorriso->arrange_args= 1;
|
||||
|
||||
} else {
|
||||
ret= Xorriso_count_args(xorriso, argc - i, argv + i, &arg_count, 1);
|
||||
if(ret == 1) {
|
||||
|
Reference in New Issue
Block a user