fftools: handle errors in parse_options()

This commit is contained in:
Anton Khirnov
2023-07-14 16:43:51 +02:00
parent 49ac7fc485
commit 39d5104332
4 changed files with 27 additions and 14 deletions

View File

@@ -364,8 +364,8 @@ int parse_option(void *optctx, const char *opt, const char *arg,
return !!(po->flags & HAS_ARG); return !!(po->flags & HAS_ARG);
} }
void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, int parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
void (*parse_arg_function)(void *, const char*)) int (*parse_arg_function)(void *, const char*))
{ {
const char *opt; const char *opt;
int optindex, handleoptions = 1, ret; int optindex, handleoptions = 1, ret;
@@ -386,13 +386,18 @@ void parse_options(void *optctx, int argc, char **argv, const OptionDef *options
opt++; opt++;
if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0) if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)
exit_program(1); return ret;
optindex += ret; optindex += ret;
} else { } else {
if (parse_arg_function) if (parse_arg_function) {
parse_arg_function(optctx, opt); ret = parse_arg_function(optctx, opt);
if (ret < 0)
return ret;
} }
} }
}
return 0;
} }
int parse_optgroup(void *optctx, OptionGroup *g) int parse_optgroup(void *optctx, OptionGroup *g)

View File

@@ -194,8 +194,8 @@ void show_help_default(const char *opt, const char *arg);
* argument without a leading option name flag. NULL if such arguments do * argument without a leading option name flag. NULL if such arguments do
* not have to be processed. * not have to be processed.
*/ */
void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, int parse_options(void *optctx, int argc, char **argv, const OptionDef *options,
void (* parse_arg_function)(void *optctx, const char*)); int (* parse_arg_function)(void *optctx, const char*));
/** /**
* Parse one given option. * Parse one given option.

View File

@@ -3501,17 +3501,19 @@ static int opt_show_mode(void *optctx, const char *opt, const char *arg)
return 0; return 0;
} }
static void opt_input_file(void *optctx, const char *filename) static int opt_input_file(void *optctx, const char *filename)
{ {
if (input_filename) { if (input_filename) {
av_log(NULL, AV_LOG_FATAL, av_log(NULL, AV_LOG_FATAL,
"Argument '%s' provided as input filename, but '%s' was already specified.\n", "Argument '%s' provided as input filename, but '%s' was already specified.\n",
filename, input_filename); filename, input_filename);
exit(1); return AVERROR(EINVAL);
} }
if (!strcmp(filename, "-")) if (!strcmp(filename, "-"))
filename = "fd:"; filename = "fd:";
input_filename = filename; input_filename = filename;
return 0;
} }
static int opt_codec(void *optctx, const char *opt, const char *arg) static int opt_codec(void *optctx, const char *opt, const char *arg)
@@ -3630,7 +3632,7 @@ void show_help_default(const char *opt, const char *arg)
/* Called from the main */ /* Called from the main */
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int flags; int flags, ret;
VideoState *is; VideoState *is;
init_dynload(); init_dynload();
@@ -3649,7 +3651,9 @@ int main(int argc, char **argv)
show_banner(argc, argv, options); show_banner(argc, argv, options);
parse_options(NULL, argc, argv, options, opt_input_file); ret = parse_options(NULL, argc, argv, options, opt_input_file);
if (ret < 0)
exit(1);
if (!input_filename) { if (!input_filename) {
show_usage(); show_usage();

View File

@@ -3770,17 +3770,19 @@ static int opt_show_entries(void *optctx, const char *opt, const char *arg)
return ret; return ret;
} }
static void opt_input_file(void *optctx, const char *arg) static int opt_input_file(void *optctx, const char *arg)
{ {
if (input_filename) { if (input_filename) {
av_log(NULL, AV_LOG_ERROR, av_log(NULL, AV_LOG_ERROR,
"Argument '%s' provided as input filename, but '%s' was already specified.\n", "Argument '%s' provided as input filename, but '%s' was already specified.\n",
arg, input_filename); arg, input_filename);
exit_program(1); return AVERROR(EINVAL);
} }
if (!strcmp(arg, "-")) if (!strcmp(arg, "-"))
arg = "fd:"; arg = "fd:";
input_filename = arg; input_filename = arg;
return 0;
} }
static int opt_input_file_i(void *optctx, const char *opt, const char *arg) static int opt_input_file_i(void *optctx, const char *opt, const char *arg)
@@ -4121,7 +4123,9 @@ int main(int argc, char **argv)
#endif #endif
show_banner(argc, argv, options); show_banner(argc, argv, options);
parse_options(NULL, argc, argv, options, opt_input_file); ret = parse_options(NULL, argc, argv, options, opt_input_file);
if (ret < 0)
exit_program(1);
if (do_show_log) if (do_show_log)
av_log_set_callback(log_callback); av_log_set_callback(log_callback);