В Wed, 01 Oct 2014 09:25:12 +0200 "Thomas Schmitt" <scdbac...@gmx.net> пишет:
> Hi, > > to substantiate my proposal of renaming young grub-mkrescue.c to > grub-mkiso.c and to add a built-in emulation of grub-mkrescue(.in), > here the necessary code which i tested standalone with valgrind. Well, below is much more simple patch which is reusing argp infrastructure. The only problem - it needs small patch for gnulib otherwise --help does not work. IMHO this is a bug in gnulib. If you convince them to fix it ... I do not say that I particular like it, but looks better than reimplement parser from scratch. --- grub-core/gnulib/argp-parse.c | 7 +++++-- util/grub-mkrescue.c | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/grub-core/gnulib/argp-parse.c b/grub-core/gnulib/argp-parse.c index 67ea32c..8fb50e1 100644 --- a/grub-core/gnulib/argp-parse.c +++ b/grub-core/gnulib/argp-parse.c @@ -89,13 +89,16 @@ static const struct argp_option argp_default_options[] = static error_t argp_default_parser (int key, char *arg, struct argp_state *state) { + struct argp_state help_state = *state; + + help_state.flags &= ~ARGP_NO_ERRS; switch (key) { case '?': - __argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP); + __argp_state_help (&help_state, state->out_stream, ARGP_HELP_STD_HELP); break; case OPT_USAGE: - __argp_state_help (state, state->out_stream, + __argp_state_help (&help_state, state->out_stream, ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK); break; diff --git a/util/grub-mkrescue.c b/util/grub-mkrescue.c index e719839..8decb4e 100644 --- a/util/grub-mkrescue.c +++ b/util/grub-mkrescue.c @@ -70,6 +70,19 @@ xorriso_push (const char *val) } static void +xorriso_push_tail (const char *val) +{ + if (xorriso_tail_arg_alloc <= xorriso_tail_argc) + { + xorriso_tail_arg_alloc = 2 * (4 + xorriso_tail_argc); + xorriso_tail_argv = xrealloc (xorriso_tail_argv, + sizeof (xorriso_tail_argv[0]) + * xorriso_tail_arg_alloc); + } + xorriso_tail_argv[xorriso_tail_argc++] = xstrdup (val); +} + +static void xorriso_link (const char *from, const char *to) { char *tof = grub_util_path_concat (2, iso9660_dir, to); @@ -156,6 +169,12 @@ enum { static error_t argp_parser (int key, char *arg, struct argp_state *state) { + if (state->quoted && !(int *)state->input) + { + *(int *)state->input = 1; + xorriso_push_tail ("--"); + } + if (grub_install_parse (key, arg)) return 0; switch (key) @@ -216,14 +235,7 @@ argp_parser (int key, char *arg, struct argp_state *state) return 0; case ARGP_KEY_ARG: - if (xorriso_tail_arg_alloc <= xorriso_tail_argc) - { - xorriso_tail_arg_alloc = 2 * (4 + xorriso_tail_argc); - xorriso_tail_argv = xrealloc (xorriso_tail_argv, - sizeof (xorriso_tail_argv[0]) - * xorriso_tail_arg_alloc); - } - xorriso_tail_argv[xorriso_tail_argc++] = xstrdup (arg); + xorriso_push_tail (arg); return 0; default: return ARGP_ERR_UNKNOWN; @@ -380,6 +392,8 @@ main (int argc, char *argv[]) char *romdir; char *sysarea_img = NULL; const char *pkgdatadir; + int quote_seen = 0; + int unknown; grub_util_host_init (&argc, &argv); grub_util_disable_fd_syncs (); @@ -391,7 +405,12 @@ main (int argc, char *argv[]) xorriso = xstrdup ("xorriso"); label_font = grub_util_path_concat (2, pkgdatadir, "unicode.pf2"); - argp_parse (&argp, argc, argv, 0, 0, 0); + while (argc > 0 && argp_parse (&argp, argc, argv, ARGP_NO_ERRS, &unknown, "e_seen)) + { + xorriso_push_tail (argv[unknown]); + argv += unknown; + argc -= unknown; + } if (!output_image) grub_util_error ("%s", _("output file must be specified")); -- tg: (77063f4..) u/grub-mkrescue-options (depends on: master) _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel