* util/grub-editenv.c: Use argp instead of getopt.
This commit is contained in:
parent
c5930ec832
commit
6439b8ee81
2 changed files with 90 additions and 70 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
2010-09-20 Yves Blusseau <blusseau@zetam.org>
|
||||||
|
|
||||||
|
* util/grub-editenv.c: Use argp instead of getopt.
|
||||||
|
|
||||||
2010-09-20 Yves Blusseau <blusseau@zetam.org>
|
2010-09-20 Yves Blusseau <blusseau@zetam.org>
|
||||||
|
|
||||||
* util/grub-setup.c: Use argp instead of getopt.
|
* util/grub-setup.c: Use argp instead of getopt.
|
||||||
|
|
|
@ -28,46 +28,82 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <getopt.h>
|
#include <argp.h>
|
||||||
|
|
||||||
#include "progname.h"
|
#include "progname.h"
|
||||||
|
|
||||||
#define DEFAULT_ENVBLK_SIZE 1024
|
#define DEFAULT_ENVBLK_SIZE 1024
|
||||||
|
#define DEFAULT_ENVBLK_PATH DEFAULT_DIRECTORY "/" GRUB_ENVBLK_DEFCFG
|
||||||
|
|
||||||
static struct option options[] = {
|
static struct argp_option options[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{0, 0, 0, OPTION_DOC, N_("Commands:"), 1},
|
||||||
{"version", no_argument, 0, 'V'},
|
{"create", 0, 0, OPTION_DOC|OPTION_NO_USAGE,
|
||||||
{"verbose", no_argument, 0, 'v'},
|
N_("Create a blank environment block file."), 0},
|
||||||
{0, 0, 0, 0}
|
{"list", 0, 0, OPTION_DOC|OPTION_NO_USAGE,
|
||||||
|
N_("List the current variables."), 0},
|
||||||
|
{"set [name=value ...]", 0, 0, OPTION_DOC|OPTION_NO_USAGE,
|
||||||
|
N_("Set variables."), 0},
|
||||||
|
{"unset [name ....]", 0, 0, OPTION_DOC|OPTION_NO_USAGE,
|
||||||
|
N_("Delete variables."), 0},
|
||||||
|
|
||||||
|
{0, 0, 0, OPTION_DOC, N_("Options:"), -1},
|
||||||
|
{"verbose", 'v', 0, 0, N_("Print verbose messages."), 0},
|
||||||
|
|
||||||
|
{ 0, 0, 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Print the version information. */
|
||||||
static void
|
static void
|
||||||
usage (int status)
|
print_version (FILE *stream, struct argp_state *state)
|
||||||
{
|
{
|
||||||
if (status)
|
fprintf (stream, "%s (%s) %s\n", program_name, PACKAGE_NAME, PACKAGE_VERSION);
|
||||||
fprintf (stderr, "Try `%s --help' for more information.\n", program_name);
|
|
||||||
else
|
|
||||||
printf ("\
|
|
||||||
Usage: %s [OPTIONS] [FILENAME] COMMAND\n\
|
|
||||||
\n\
|
|
||||||
Tool to edit environment block.\n\
|
|
||||||
\nCommands:\n\
|
|
||||||
create create a blank environment block file\n\
|
|
||||||
list list the current variables\n\
|
|
||||||
set [name=value ...] set variables\n\
|
|
||||||
unset [name ....] delete variables\n\
|
|
||||||
\nOptions:\n\
|
|
||||||
-h, --help display this message and exit\n\
|
|
||||||
-V, --version print version information and exit\n\
|
|
||||||
-v, --verbose print verbose messages\n\
|
|
||||||
\n\
|
|
||||||
If not given explicitly, FILENAME defaults to %s.\n\
|
|
||||||
\n\
|
|
||||||
Report bugs to <%s>.\n",
|
|
||||||
program_name, DEFAULT_DIRECTORY "/" GRUB_ENVBLK_DEFCFG, PACKAGE_BUGREPORT);
|
|
||||||
|
|
||||||
exit (status);
|
|
||||||
}
|
}
|
||||||
|
void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
|
||||||
|
|
||||||
|
/* Set the bug report address */
|
||||||
|
const char *argp_program_bug_address = "<"PACKAGE_BUGREPORT">";
|
||||||
|
|
||||||
|
error_t argp_parser (int key, char *arg, struct argp_state *state)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'v':
|
||||||
|
verbosity++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARGP_KEY_NO_ARGS:
|
||||||
|
fprintf (stderr, _("You need to specify at least one command.\n"));
|
||||||
|
argp_usage (state);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return ARGP_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
help_filter (int key, const char *text, void *input __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case ARGP_KEY_HELP_POST_DOC:
|
||||||
|
return xasprintf(text, DEFAULT_ENVBLK_PATH);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return (char *) text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct argp argp = {
|
||||||
|
options, argp_parser, N_("FILENAME COMMAND"),
|
||||||
|
N_("\n\
|
||||||
|
Tool to edit environment block.\n\
|
||||||
|
\v\
|
||||||
|
If FILENAME is '-', the default value %s is used.\n"),
|
||||||
|
NULL, help_filter, NULL
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_envblk_file (const char *name)
|
create_envblk_file (const char *name)
|
||||||
|
@ -227,55 +263,32 @@ main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char *filename;
|
char *filename;
|
||||||
char *command;
|
char *command;
|
||||||
|
int index, arg_count;
|
||||||
|
|
||||||
set_program_name (argv[0]);
|
set_program_name (argv[0]);
|
||||||
|
|
||||||
grub_util_init_nls ();
|
grub_util_init_nls ();
|
||||||
|
|
||||||
/* Check for options. */
|
/* Parse our arguments */
|
||||||
while (1)
|
if (argp_parse (&argp, argc, argv, 0, &index, 0) != 0)
|
||||||
{
|
{
|
||||||
int c = getopt_long (argc, argv, "hVv", options, 0);
|
fprintf (stderr, _("Error in parsing command line arguments\n"));
|
||||||
|
exit(1);
|
||||||
if (c == -1)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case 'h':
|
|
||||||
usage (0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'V':
|
|
||||||
printf ("%s (%s) %s\n", program_name, PACKAGE_NAME, PACKAGE_VERSION);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 'v':
|
|
||||||
verbosity++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
usage (1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Obtain the filename. */
|
arg_count = argc - index;
|
||||||
if (optind >= argc)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "no filename specified\n");
|
|
||||||
usage (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind + 1 >= argc)
|
if (arg_count == 1)
|
||||||
{
|
{
|
||||||
filename = DEFAULT_DIRECTORY "/" GRUB_ENVBLK_DEFCFG;
|
filename = DEFAULT_ENVBLK_PATH;
|
||||||
command = argv[optind];
|
command = argv[index++];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
filename = argv[optind];
|
filename = argv[index++];
|
||||||
command = argv[optind + 1];
|
if (strcmp (filename, "-") == 0)
|
||||||
|
filename = DEFAULT_ENVBLK_PATH;
|
||||||
|
command = argv[index++];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp (command, "create") == 0)
|
if (strcmp (command, "create") == 0)
|
||||||
|
@ -283,13 +296,16 @@ main (int argc, char *argv[])
|
||||||
else if (strcmp (command, "list") == 0)
|
else if (strcmp (command, "list") == 0)
|
||||||
list_variables (filename);
|
list_variables (filename);
|
||||||
else if (strcmp (command, "set") == 0)
|
else if (strcmp (command, "set") == 0)
|
||||||
set_variables (filename, argc - optind - 2, argv + optind + 2);
|
set_variables (filename, argc - index, argv + index);
|
||||||
else if (strcmp (command, "unset") == 0)
|
else if (strcmp (command, "unset") == 0)
|
||||||
unset_variables (filename, argc - optind - 2, argv + optind + 2);
|
unset_variables (filename, argc - index, argv + index);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf (stderr, "unknown command %s\n", command);
|
char *program = xstrdup(program_name);
|
||||||
usage (1);
|
fprintf (stderr, _("Unknown command `%s'.\n"), command);
|
||||||
|
argp_help (&argp, stderr, ARGP_HELP_STD_USAGE, program);
|
||||||
|
free(program);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue