+2008-02-28 Fabian Greffrath <greffrath@leat.rub.de>
+
+ * include/grub/util/getroot.h (grub_util_check_block_device): Export new
+ function.
+ * util/getroot.c (grub_util_check_block_device): New function that
+ returns the given argument if it is a block device and returns NULL else.
+ * util/grub-probe.c (argument_is_device): New variable.
+ (probe): Promote device_name from a variable to an argument. Receive
+ device_name from grub_util_check_block_device() if path is NULL and from
+ grub_guess_root_device() else. Do not free() device_name anymore.
+ (options): Introduce new parameter '-d, --device'.
+ (main): Add description of the new parameter to the help screen.
+ Rename path variable to argument. Set argument_is_device if the '-d'
+ option is given. Pass argument to probe() depending on
+ argument_is_device.
+
2008-02-24 Bean <bean123ch@gmail.com>
* fs/iso9660.c (GRUB_ISO9660_VOLDESC_BOOT): New macro.
};
int print = PRINT_FS;
+static unsigned int argument_is_device = 0;
void
grub_putchar (int c)
}
static void
-probe (const char *path)
+probe (const char *path, char *device_name)
{
- char *device_name;
char *drive_name = NULL;
char *grub_path = NULL;
char *filebuf_via_grub = NULL, *filebuf_via_sys = NULL;
int abstraction_type;
grub_device_t dev = NULL;
- device_name = grub_guess_root_device (path);
+ if (path == NULL)
+ {
+ if (! grub_util_check_block_device (device_name))
+ grub_util_error ("%s is not a block device.\n", device_name);
+ }
+ else
+ device_name = grub_guess_root_device (path);
+
if (! device_name)
grub_util_error ("cannot find a device for %s.\n", path);
free (grub_path);
free (filebuf_via_grub);
free (filebuf_via_sys);
- free (device_name);
free (drive_name);
}
static struct option options[] =
{
+ {"device", no_argument, 0, 'd'},
{"device-map", required_argument, 0, 'm'},
{"target", required_argument, 0, 't'},
{"help", no_argument, 0, 'h'},
"Try ``grub-probe --help'' for more information.\n");
else
printf ("\
-Usage: grub-probe [OPTION]... PATH\n\
+Usage: grub-probe [OPTION]... [PATH|DEVICE]\n\
\n\
-Probe device information for a given path.\n\
+Probe device information for a given path (or device, if the -d option is given).\n\
\n\
+ -d, --device given argument is a system device, not a path\n\
-m, --device-map=FILE use FILE as the device map [default=%s]\n\
-t, --target=(fs|drive|device|partmap|abstraction)\n\
print filesystem module, GRUB drive, system device, partition map module or abstraction module [default=fs]\n\
main (int argc, char *argv[])
{
char *dev_map = 0;
- char *path;
+ char *argument;
progname = "grub-probe";
/* Check for options. */
while (1)
{
- int c = getopt_long (argc, argv, "m:t:hVv", options, 0);
+ int c = getopt_long (argc, argv, "dm:t:hVv", options, 0);
if (c == -1)
break;
else
switch (c)
{
+ case 'd':
+ argument_is_device = 1;
+ break;
+
case 'm':
if (dev_map)
free (dev_map);
if (verbosity > 1)
grub_env_set ("debug", "all");
- /* Obtain PATH. */
+ /* Obtain ARGUMENT. */
if (optind >= argc)
{
- fprintf (stderr, "No path is specified.\n");
+ fprintf (stderr, "No path or device is specified.\n");
usage (1);
}
usage (1);
}
- path = argv[optind];
+ argument = argv[optind];
/* Initialize the emulated biosdisk driver. */
grub_util_biosdisk_init (dev_map ? : DEFAULT_DEVICE_MAP);
grub_init_all ();
/* Do it. */
- probe (path);
+ if (argument_is_device)
+ probe (NULL, argument);
+ else
+ probe (argument, NULL);
/* Free resources. */
grub_fini_all ();