From 79ca2d78d4101857c62f69fc77f51da25c818cd2 Mon Sep 17 00:00:00 2001 From: robertmh Date: Thu, 28 Feb 2008 10:11:06 +0000 Subject: [PATCH] 2008-02-28 Fabian Greffrath * 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. --- ChangeLog | 16 +++++++++++++++ include/grub/util/getroot.h | 1 + util/getroot.c | 14 +++++++++++++ util/grub-probe.c | 39 +++++++++++++++++++++++++------------ 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 16cc6ed2d..f0dee54e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-02-28 Fabian Greffrath + + * 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 * fs/iso9660.c (GRUB_ISO9660_VOLDESC_BOOT): New macro. diff --git a/include/grub/util/getroot.h b/include/grub/util/getroot.h index 45b66880b..0d78538df 100644 --- a/include/grub/util/getroot.h +++ b/include/grub/util/getroot.h @@ -29,5 +29,6 @@ char *grub_guess_root_device (const char *dir); char *grub_get_prefix (const char *dir); int grub_util_get_dev_abstraction (const char *os_dev); char *grub_util_get_grub_dev (const char *os_dev); +char *grub_util_check_block_device (const char *blk_dev); #endif /* ! GRUB_UTIL_GETROOT_HEADER */ diff --git a/util/getroot.c b/util/getroot.c index a591dc81f..0c4b376e7 100644 --- a/util/getroot.c +++ b/util/getroot.c @@ -332,3 +332,17 @@ grub_util_get_grub_dev (const char *os_dev) return grub_dev; } + +char * +grub_util_check_block_device (const char *blk_dev) +{ + struct stat st; + + if (stat (blk_dev, &st) < 0) + grub_util_error ("Cannot stat `%s'", blk_dev); + + if (S_ISBLK (st.st_mode)) + return (blk_dev); + else + return 0; +} diff --git a/util/grub-probe.c b/util/grub-probe.c index 3635d74a4..dabd76822 100644 --- a/util/grub-probe.c +++ b/util/grub-probe.c @@ -50,6 +50,7 @@ enum { }; int print = PRINT_FS; +static unsigned int argument_is_device = 0; void grub_putchar (int c) @@ -100,16 +101,22 @@ probe_partmap (grub_disk_t disk) } 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); @@ -220,12 +227,12 @@ probe (const char *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'}, @@ -242,10 +249,11 @@ usage (int status) "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\ @@ -264,20 +272,24 @@ int 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); @@ -321,10 +333,10 @@ main (int argc, char *argv[]) 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); } @@ -334,7 +346,7 @@ main (int argc, char *argv[]) usage (1); } - path = argv[optind]; + argument = argv[optind]; /* Initialize the emulated biosdisk driver. */ grub_util_biosdisk_init (dev_map ? : DEFAULT_DEVICE_MAP); @@ -343,7 +355,10 @@ main (int argc, char *argv[]) grub_init_all (); /* Do it. */ - probe (path); + if (argument_is_device) + probe (NULL, argument); + else + probe (argument, NULL); /* Free resources. */ grub_fini_all ();