grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [NEW PATCH] Add option to grub-probe to accept system devices as arg


From: Fabian Greffrath
Subject: Re: [NEW PATCH] Add option to grub-probe to accept system devices as arguments
Date: Mon, 25 Feb 2008 10:49:01 +0100
User-agent: Thunderbird 2.0.0.9 (Windows/20071031)

Hello!

Robert Millan schrieb:
It looks good to me.  Just a pair of minor details (simply for consistency with
code style in grub):
[...]

done.

If you fix those, include a ChangeLog entry and noone else objects, I'll commit
it.  Feel free to ping me with a direct mail if I stale for too long.

You are CCed. ;)

Robert Millan schrieb:
> Is this solved now?  If not, you could send a gdb backtrace to give us an idea
> on what's wrong.

Yes, it's fixed in the second patch that you reviewed (and in the one that's attached, too).

Cheers,
Fabian

--
Dipl.-Phys. Fabian Greffrath

Ruhr-Universität Bochum
Lehrstuhl für Energieanlagen und Energieprozesstechnik (LEAT)
Universitätsstr. 150, IB 3/134
D-44780 Bochum

Telefon: +49 (0)234 / 32-26334
Fax:     +49 (0)234 / 32-14227
E-Mail:  address@hidden
2008-02-25  Fabian Greffrath  <address@hidden>

        * 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.


diff -Naru grub2-1.96+20080219~/include/grub/util/getroot.h 
grub2-1.96+20080219/include/grub/util/getroot.h
--- grub2-1.96+20080219~/include/grub/util/getroot.h    2008-01-12 
16:11:56.000000000 +0100
+++ grub2-1.96+20080219/include/grub/util/getroot.h     2008-02-22 
14:40:41.000000000 +0100
@@ -29,5 +29,6 @@
 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 -Naru grub2-1.96+20080219~/util/getroot.c 
grub2-1.96+20080219/util/getroot.c
--- grub2-1.96+20080219~/util/getroot.c 2008-02-12 23:45:58.000000000 +0100
+++ grub2-1.96+20080219/util/getroot.c  2008-02-22 14:45:52.000000000 +0100
@@ -332,3 +332,17 @@
 
   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 -Naru grub2-1.96+20080219~/util/grub-probe.c 
grub2-1.96+20080219/util/grub-probe.c
--- grub2-1.96+20080219~/util/grub-probe.c      2008-02-09 11:49:29.000000000 
+0100
+++ grub2-1.96+20080219/util/grub-probe.c       2008-02-22 16:00:01.000000000 
+0100
@@ -50,6 +50,7 @@
 };
 
 int print = PRINT_FS;
+static unsigned int argument_is_device = 0;
 
 void
 grub_putchar (int c)
@@ -100,16 +101,22 @@
 }
 
 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 @@
   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 @@
             "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 @@
 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 @@
   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 @@
       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 @@
   grub_init_all ();
 
   /* Do it.  */
-  probe (path);
+  if (argument_is_device)
+    probe (NULL, argument);
+  else
+    probe (argument, NULL);
   
   /* Free resources.  */
   grub_fini_all ();

reply via email to

[Prev in Thread] Current Thread [Next in Thread]