Index: util/i386/pc/grub-mkimage.c =================================================================== RCS file: /sources/grub/grub2/util/i386/pc/grub-mkimage.c,v retrieving revision 1.11 diff -u -p -r1.11 grub-mkimage.c --- util/i386/pc/grub-mkimage.c 25 Nov 2006 03:21:29 -0000 1.11 +++ util/i386/pc/grub-mkimage.c 25 Jan 2007 11:18:41 -0000 @@ -1,7 +1,7 @@ /* grub-mkimage.c - make a bootable image */ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2002,2003,2004,2005,2006 Free Software Foundation, Inc. + * Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. * * GRUB is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ #include #define _GNU_SOURCE 1 -#include +#include #if defined(HAVE_LZO_LZO1X_H) # include @@ -179,102 +179,79 @@ generate_image (const char *dir, FILE *o -static struct option options[] = - { - {"directory", required_argument, 0, 'd'}, - {"output", required_argument, 0, 'o'}, - {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'V'}, - {"verbose", no_argument, 0, 'v'}, - {0, 0, 0, 0} - }; +const char *argp_program_version = PACKAGE_STRING; +const char *argp_program_bug_address = PACKAGE_BUGREPORT; +static char doc[] = "Make a bootable image of GRUB"; + +static struct argp_option options[] = { + {"directory", 'd', "DIR", 0, "use images and modules under DIR [default="GRUB_DATADIR"]", 0}, + {"output", 'o', "FILE", 0, "output a generated image to FILE [default=stdout]", 0}, + {"verbose", 'v', 0, 0, "print verbose messages", 0}, + { 0, 0, 0, 0, 0, 0 } +}; -static void -usage (int status) +struct arguments { - if (status) - fprintf (stderr, "Try ``grub-mkimage --help'' for more information.\n"); - else - printf ("\ -Usage: grub-mkimage [OPTION]... [MODULES]\n\ -\n\ -Make a bootable image of GRUB.\n\ -\n\ - -d, --directory=DIR use images and modules under DIR [default=%s]\n\ - -o, --output=FILE output a generated image to FILE [default=stdout]\n\ - -h, --help display this message and exit\n\ - -V, --version print version information and exit\n\ - -v, --verbose print verbose messages\n\ -\n\ -Report bugs to <%s>.\n\ -", GRUB_LIBDIR, PACKAGE_BUGREPORT); + char *dir; + char *output; + char **modules; +}; - exit (status); -} +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + struct arguments *args = state->input; + + switch (key) + { + case 'd': + args->dir = arg; + break; + case 'o': + args->output = arg; + break; + case 'v': + verbosity++; + break; + case ARGP_KEY_ARGS: + args->modules = state->argv + state->next; + break; + case ARGP_KEY_END: + if (! args->modules) + { args->modules = state->argv + state->next; } + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static struct argp argp = {options, parse_opt, "[MODULE...]", doc, 0, 0, 0}; + int main (int argc, char *argv[]) { - char *output = 0; - char *dir = 0; FILE *fp = stdout; + struct arguments args = + { + .dir = GRUB_DATADIR, + .output = 0 + }; progname = "grub-mkimage"; - - while (1) - { - int c = getopt_long (argc, argv, "d:o:hVv", options, 0); - if (c == -1) - break; - else - switch (c) - { - case 'o': - if (output) - free (output); - - output = xstrdup (optarg); - break; - - case 'd': - if (dir) - free (dir); - - dir = xstrdup (optarg); - break; - - case 'h': - usage (0); - break; - - case 'V': - printf ("grub-mkimage (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION); - return 0; - - case 'v': - verbosity++; - break; - - default: - usage (1); - break; - } - } + argp_parse (&argp, argc, argv, 0, 0, &args); - if (output) + if (args.output) { - fp = fopen (output, "wb"); + fp = fopen (args.output, "wb"); if (! fp) - grub_util_error ("cannot open %s", output); + grub_util_error ("cannot open %s", args.output); } - generate_image (dir ? : GRUB_LIBDIR, fp, argv + optind); + generate_image (args.dir ? : GRUB_LIBDIR, fp, args.modules); fclose (fp); - - if (dir) - free (dir); - return 0; }