Use argp in grub-fstest.

* util/grub-fstest.c: Don't include getopt.h.
	Include argp.h.
	(root): New variable.
	(args_count): Likewise.
	(nparm): Likewise.
	(num_disks): Likewise.
	(images): Likewise.
	(cmd): Likewise.
	(debug_str): Likewise.
	(args): Likewise.
	(options): Transformed to argp.
	(usage): Removed.
	(main): Split argument parsing into ...
	(argp_parser): ... this. Changed to argp format.
	(argp): New variable.
	(main): Use argp_parse.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-09-20 18:38:38 +02:00
parent 3dccbe4bbb
commit 3286a4b4c2
2 changed files with 170 additions and 167 deletions

View File

@ -1,3 +1,24 @@
2010-09-20 Vladimir Serbinenko <phcoder@gmail.com>
Use argp in grub-fstest.
* util/grub-fstest.c: Don't include getopt.h.
Include argp.h.
(root): New variable.
(args_count): Likewise.
(nparm): Likewise.
(num_disks): Likewise.
(images): Likewise.
(cmd): Likewise.
(debug_str): Likewise.
(args): Likewise.
(options): Transformed to argp.
(usage): Removed.
(main): Split argument parsing into ...
(argp_parser): ... this. Changed to argp format.
(argp): New variable.
(main): Use argp_parse.
2010-09-20 Tristan Gingold <gingold@free.fr>
2010-09-20 Robert Millan <rmh.grub@aybabtu.com>
2010-09-20 Vladimir Serbinenko <phcoder@gmail.com>

View File

@ -38,9 +38,9 @@
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
#include "progname.h"
#include "argp.h"
static grub_err_t
execute_command (char *name, int n, char **args)
@ -49,7 +49,7 @@ execute_command (char *name, int n, char **args)
cmd = grub_command_find (name);
if (! cmd)
grub_util_error ("can\'t find command %s", name);
grub_util_error (_("can\'t find command %s"), name);
return (cmd->func) (cmd, n, args);
}
@ -78,7 +78,7 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len))
dev = grub_device_open (0);
if ((! dev) || (! dev->disk))
grub_util_error ("can\'t open device");
grub_util_error (_("can\'t open device"));
grub_util_info ("total sectors : %lld",
(unsigned long long) dev->disk->total_sectors);
@ -93,7 +93,7 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len))
len = (leng > BUF_SIZE) ? BUF_SIZE : leng;
if (grub_disk_read (dev->disk, 0, skip, len, buf))
grub_util_error ("disk read fails at offset %lld, length %d",
grub_util_error (_("disk read fails at offset %lld, length %d"),
skip, len);
if (hook (skip, buf, len))
@ -111,7 +111,7 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len))
file = grub_file_open (pathname);
if (!file)
{
grub_util_error ("cannot open file %s", pathname);
grub_util_error (_("cannot open file %s"), pathname);
return;
}
@ -119,7 +119,7 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len))
if (skip > file->size)
{
grub_util_error ("invalid skip value %lld", (unsigned long long) skip);
grub_util_error (_("invalid skip value %lld"), (unsigned long long) skip);
return;
}
@ -137,7 +137,8 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len))
sz = grub_file_read (file, buf, (len > BUF_SIZE) ? BUF_SIZE : len);
if (sz < 0)
{
grub_util_error ("read error at offset %llu: %s", ofs, grub_errmsg);
grub_util_error (_("read error at offset %llu: %s"), ofs,
grub_errmsg);
break;
}
@ -163,7 +164,7 @@ cmd_cp (char *src, char *dest)
if ((int) fwrite (buf, 1, len, ff) != len)
{
grub_util_error ("write error");
grub_util_error (_("write error"));
return 1;
}
@ -173,7 +174,7 @@ cmd_cp (char *src, char *dest)
ff = fopen (dest, "wb");
if (ff == NULL)
{
grub_util_error ("open error");
grub_util_error (_("open error"));
return;
}
read_file (src, cp_hook);
@ -191,7 +192,7 @@ cmd_cmp (char *src, char *dest)
{
if ((int) fread (buf_1, 1, len, ff) != len)
{
grub_util_error ("read error at offset %llu: %s", ofs, grub_errmsg);
grub_util_error (_("read error at offset %llu: %s"), ofs, grub_errmsg);
return 1;
}
@ -202,7 +203,7 @@ cmd_cmp (char *src, char *dest)
for (i = 0; i < len; i++, ofs++)
if (buf_1[i] != buf[i])
{
grub_util_error ("compare fail at offset %llu", ofs);
grub_util_error (_("compare fail at offset %llu"), ofs);
return 1;
}
}
@ -212,12 +213,12 @@ cmd_cmp (char *src, char *dest)
ff = fopen (dest, "rb");
if (ff == NULL)
{
grub_util_error ("open error");
grub_util_error (_("open error"));
return;
}
if ((skip) && (fseeko (ff, skip, SEEK_SET)))
grub_util_error ("seek error");
grub_util_error (_("seek error"));
read_file (src, cmp_hook);
fclose (ff);
@ -257,8 +258,17 @@ cmd_crc (char *pathname)
grub_be_to_cpu32(*(grub_uint32_t*)GRUB_MD_CRC32->read(crc32_context)));
}
static char *root = NULL;
static int args_count = 0;
static int nparm = 0;
static int num_disks = 1;
static char **images = NULL;
static int cmd = 0;
static char *debug_str = NULL;
static char **args = NULL;
static void
fstest (char **images, int num_disks, int cmd, int n, char **args)
fstest (int n, char **args)
{
char *host_file;
char *loop_name;
@ -279,7 +289,7 @@ fstest (char **images, int num_disks, int cmd, int n, char **args)
argv[1] = host_file;
if (execute_command ("loopback", 2, argv))
grub_util_error ("loopback command fails");
grub_util_error (_("loopback command fails"));
grub_free (loop_name);
grub_free (host_file);
@ -331,203 +341,175 @@ fstest (char **images, int num_disks, int cmd, int n, char **args)
}
}
static struct option options[] = {
{"root", required_argument, 0, 'r'},
{"skip", required_argument, 0, 's'},
{"length", required_argument, 0, 'n'},
{"diskcount", required_argument, 0, 'c'},
{"debug", required_argument, 0, 'd'},
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
{"verbose", no_argument, 0, 'v'},
{0, 0, 0, 0}
static struct argp_option options[] = {
{0, 0, 0 , OPTION_DOC, N_("Commands:"), 1},
{N_("ls PATH"), 0, 0 , OPTION_DOC, N_("List files in PATH."), 1},
{N_("cp FILE LOCAL"), 0, 0, OPTION_DOC, N_("Copy FILE to local file LOCAL."), 1},
{N_("cmp FILE LOCAL"), 0, 0, OPTION_DOC, N_("Compare FILE with local file LOCAL."), 1},
{N_("hex FILE"), 0, 0 , OPTION_DOC, N_("Hex dump FILE."), 1},
{N_("crc FILE"), 0, 0 , OPTION_DOC, N_("Get crc32 checksum of FILE."), 1},
{N_("blocklist FILE"), 0, 0, OPTION_DOC, N_("Display blocklist of FILE."), 1},
{"root", 'r', N_("DEVICE_NAME"), 0, N_("Set root device."), 2},
{"skip", 's', "N", 0, N_("Skip N bytes from output file."), 2},
{"length", 'n', "N", 0, N_("Handle N bytes in output file."), 2},
{"diskcount", 'c', "N", 0, N_("N input files."), 2},
{"debug", 'd', "S", 0, N_("Set debug environment variable."), 2},
{"verbose", 'v', NULL, OPTION_ARG_OPTIONAL, N_("Print verbose messages."), 2},
{0, 0, 0, 0, 0, 0}
};
/* Print the version information. */
static void
usage (int status)
print_version (FILE *stream, struct argp_state *state)
{
if (status)
fprintf (stderr, "Try `%s --help' for more information.\n", program_name);
else
printf ("\
Usage: %s [OPTION]... IMAGE_PATH COMMANDS\n\
\n\
Debug tool for filesystem driver.\n\
\nCommands:\n\
ls PATH list files in PATH\n\
cp FILE LOCAL copy FILE to local file LOCAL\n\
cmp FILE LOCAL compare FILE with local file LOCAL\n\
hex FILE Hex dump FILE\n\
crc FILE Get crc32 checksum of FILE\n\
blocklist FILE display blocklist of FILE\n\
\nOptions:\n\
-r, --root=DEVICE_NAME set root device\n\
-s, --skip=N skip N bytes from output file\n\
-n, --length=N handle N bytes in output file\n\
-c, --diskcount=N N input files\n\
-d, --debug=S Set debug environment variable\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", program_name, PACKAGE_BUGREPORT);
exit (status);
fprintf (stream, "%s (%s) %s\n", program_name, PACKAGE_NAME, PACKAGE_VERSION);
}
void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
int
main (int argc, char *argv[])
error_t
argp_parser (int key, char *arg, struct argp_state *state)
{
char *debug_str = NULL, *root = NULL, *default_root, *alloc_root;
int i, cmd, num_opts, image_index, num_disks = 1;
char *p;
set_program_name (argv[0]);
switch (key)
{
case 'r':
root = arg;
return 0;
grub_util_init_nls ();
case 's':
skip = grub_strtoul (arg, &p, 0);
if (*p == 's')
skip <<= GRUB_DISK_SECTOR_BITS;
return 0;
/* Find the first non option entry. */
for (num_opts = 1; num_opts < argc; num_opts++)
if (argv[num_opts][0] == '-')
{
if ((argv[num_opts][2] == 0) && (num_opts < argc - 1) &&
((argv[num_opts][1] == 'r') ||
(argv[num_opts][1] == 's') ||
(argv[num_opts][1] == 'n') ||
(argv[num_opts][1] == 'c') ||
(argv[num_opts][1] == 'd')))
num_opts++;
}
else
case 'n':
leng = grub_strtoul (arg, &p, 0);
if (*p == 's')
leng <<= GRUB_DISK_SECTOR_BITS;
return 0;
case 'c':
num_disks = grub_strtoul (arg, NULL, 0);
if (num_disks < 1)
{
fprintf (stderr, _("Invalid disk count.\n"));
argp_usage (state);
}
if (args_count != 0)
{
fprintf (stderr, _("Disk count must precede disks list.\n"));
argp_usage (state);
}
return 0;
case 'd':
debug_str = arg;
return 0;
case 'v':
verbosity++;
return 0;
case ARGP_KEY_END:
if (args_count < num_disks)
{
fprintf (stderr, _("No command is specified.\n"));
argp_usage (state);
}
if (args_count - 1 - num_disks < nparm)
{
fprintf (stderr, _("Not enough parameters to command.\n"));
argp_usage (state);
}
return 0;
case ARGP_KEY_ARG:
break;
/* Check for options. */
while (1)
{
int c = getopt_long (num_opts, argv, "r:s:n:c:d:hVv", options, 0);
char *p;
if (c == -1)
break;
else
switch (c)
{
case 'r':
root = optarg;
break;
case 's':
skip = grub_strtoul (optarg, &p, 0);
if (*p == 's')
skip <<= GRUB_DISK_SECTOR_BITS;
break;
case 'n':
leng = grub_strtoul (optarg, &p, 0);
if (*p == 's')
leng <<= GRUB_DISK_SECTOR_BITS;
break;
case 'c':
num_disks = grub_strtoul (optarg, NULL, 0);
if (num_disks < 1)
{
fprintf (stderr, "Invalid disk count.\n");
usage (1);
}
break;
case 'd':
debug_str = optarg;
break;
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;
}
default:
return ARGP_ERR_UNKNOWN;
}
/* Obtain PATH. */
if (optind + num_disks - 1 >= argc)
if (args_count < num_disks)
{
fprintf (stderr, "Not enough pathname.\n");
usage (1);
if (arg[0] != '/')
{
fprintf (stderr, _("Must use absolute path.\n"));
argp_usage (state);
}
if (args_count == 0)
images = xmalloc (num_disks * sizeof (images[0]));
images[args_count] = xstrdup (arg);
args_count++;
return 0;
}
image_index = optind;
for (i = 0; i < num_disks; i++, optind++)
if (argv[optind][0] != '/')
{
fprintf (stderr, "Must use absolute path.\n");
usage (1);
}
cmd = 0;
if (optind < argc)
if (args_count == num_disks)
{
int nparm = 0;
if (!grub_strcmp (argv[optind], "ls"))
if (!grub_strcmp (arg, "ls"))
{
cmd = CMD_LS;
}
else if (!grub_strcmp (argv[optind], "cp"))
else if (!grub_strcmp (arg, "cp"))
{
cmd = CMD_CP;
nparm = 2;
}
else if (!grub_strcmp (argv[optind], "cmp"))
else if (!grub_strcmp (arg, "cmp"))
{
cmd = CMD_CMP;
nparm = 2;
}
else if (!grub_strcmp (argv[optind], "hex"))
else if (!grub_strcmp (arg, "hex"))
{
cmd = CMD_HEX;
nparm = 1;
}
else if (!grub_strcmp (argv[optind], "crc"))
else if (!grub_strcmp (arg, "crc"))
{
cmd = CMD_CRC;
nparm = 1;
}
else if (!grub_strcmp (argv[optind], "blocklist"))
else if (!grub_strcmp (arg, "blocklist"))
{
cmd = CMD_BLOCKLIST;
nparm = 1;
}
else
{
fprintf (stderr, "Invalid command %s.\n", argv[optind]);
usage (1);
fprintf (stderr, _("Invalid command %s.\n"), arg);
argp_usage (state);
}
if (optind + 1 + nparm > argc)
{
fprintf (stderr, "Invalid parameter for command %s.\n",
argv[optind]);
usage (1);
}
optind++;
}
else
{
fprintf (stderr, "No command is specified.\n");
usage (1);
args_count++;
return 0;
}
args[args_count - 1 - num_disks] = xstrdup (arg);
args_count++;
return 0;
}
struct argp argp = {
options, argp_parser, N_("IMAGE_PATH COMMANDS"),
N_("Debug tool for filesystem driver."),
NULL, NULL, NULL
};
int
main (int argc, char *argv[])
{
char *default_root, *alloc_root;
set_program_name (argv[0]);
grub_util_init_nls ();
args = xmalloc (argc * sizeof (args[0]));
argp_parse (&argp, argc, argv, 0, 0, 0);
/* Initialize all modules. */
grub_init_all ();
@ -555,7 +537,7 @@ main (int argc, char *argv[])
free (alloc_root);
/* Do it. */
fstest (argv + image_index, num_disks, cmd, argc - optind, argv + optind);
fstest (args_count - 1 - num_disks, args);
/* Free resources. */
grub_fini_all ();