All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrey Borzenkov <arvidjaar@gmail.com>
To: grub-devel@gnu.org
Subject: [PATCH] fix using grub device name as install device
Date: Fri, 29 Nov 2013 01:11:48 +0400	[thread overview]
Message-ID: <1385673108-13091-1-git-send-email-arvidjaar@gmail.com> (raw)

Shell version of grub-install called grub-setup which resolved
install device name and called main setup routine. C version of
grub-install calls main setup routine directly, which leads
to the error:

grub2-install: info: grub-bios-setup  --verbose  --force  --skip-fs-probe --directory='/boot/grub2/i386-pc' --device-map='/boot/grub2/device.map' '(hd2)'.
grub2-install: info: reading /boot/grub2/i386-pc/boot.img.
grub2-install: info: reading /boot/grub2/i386-pc/core.img.
grub2-install: info: root is `(null)', dest is `(hd2)'.
grub2-install: info: Opening dest.
grub2-install: info: drive = -1.
grub2-install: error: disk `(hd2)' not found.

Move resolving of destination device name into main setup routine
so it is done consistently in both cases.

---
 util/grub-setup.c | 41 +----------------------------------------
 util/setup.c      | 26 +++++++++++++++++++++++++-
 2 files changed, 26 insertions(+), 41 deletions(-)

diff --git a/util/grub-setup.c b/util/grub-setup.c
index 90b9de0..cc3af5d 100644
--- a/util/grub-setup.c
+++ b/util/grub-setup.c
@@ -209,23 +209,9 @@ DEVICE must be an OS device (e.g. /dev/sda)."),
   NULL, help_filter, NULL
 };
 
-static char *
-get_device_name (char *dev)
-{
-  size_t len = strlen (dev);
-
-  if (dev[0] != '(' || dev[len - 1] != ')')
-    return 0;
-
-  dev[len - 1] = '\0';
-  return dev + 1;
-}
-
 int
 main (int argc, char *argv[])
 {
-  char *root_dev = NULL;
-  char *dest_dev = NULL;
   struct arguments arguments;
 
   grub_util_host_init (&argc, &argv);
@@ -264,34 +250,11 @@ main (int argc, char *argv[])
   grub_mdraid1x_init ();
   grub_lvm_init ();
 
-  dest_dev = get_device_name (arguments.device);
-  if (! dest_dev)
-    {
-      /* Possibly, the user specified an OS device file.  */
-      dest_dev = grub_util_get_grub_dev (arguments.device);
-      if (! dest_dev)
-        {
-          char *program = xstrdup(program_name);
-          fprintf (stderr, _("Invalid device `%s'.\n"), arguments.device);
-          argp_help (&argp, stderr, ARGP_HELP_STD_USAGE, program);
-          free(program);
-          exit(1);
-        }
-      grub_util_info ("transformed OS device `%s' into GRUB device `%s'",
-                      arguments.device, dest_dev);
-    }
-  else
-    {
-      /* For simplicity.  */
-      dest_dev = xstrdup (dest_dev);
-      grub_util_info ("Using `%s' as GRUB device", dest_dev);
-    }
-
   /* Do the real work.  */
   GRUB_SETUP_FUNC (arguments.dir ? : DEFAULT_DIRECTORY,
 		   arguments.boot_file ? : DEFAULT_BOOT_FILE,
 		   arguments.core_file ? : DEFAULT_CORE_FILE,
-		   dest_dev, arguments.force,
+		   arguments.device, arguments.force,
 		   arguments.fs_probe, arguments.allow_floppy);
 
   /* Free resources.  */
@@ -303,8 +266,6 @@ main (int argc, char *argv[])
   free (arguments.dir);
   free (arguments.dev_map);
   free (arguments.device);
-  free (root_dev);
-  free (dest_dev);
 
   return 0;
 }
diff --git a/util/setup.c b/util/setup.c
index 337c304..c1de3d2 100644
--- a/util/setup.c
+++ b/util/setup.c
@@ -247,12 +247,13 @@ identify_partmap (grub_disk_t disk __attribute__ ((unused)),
 void
 SETUP (const char *dir,
        const char *boot_file, const char *core_file,
-       const char *dest, int force,
+       const char *dev, int force,
        int fs_probe, int allow_floppy)
 {
   char *core_path;
   char *boot_img, *core_img, *boot_path;
   char *root = 0;
+  char *dest = 0;
   size_t boot_size, core_size;
 #ifdef GRUB_SETUP_BIOS
   grub_uint16_t core_sectors;
@@ -269,6 +270,28 @@ SETUP (const char *dir,
 #endif
   bl.last_length = 0;
 
+  {
+    size_t len = strlen (dev);
+
+    if (len > 2 && dev[0] == '(' && dev[len - 1] == ')')
+      {
+	dest = xmalloc (len - 1);
+	strncpy (dest, dev + 1, len - 2);
+	dest[len - 2] = '\0';
+      }
+  }
+
+  if (! dest)
+    {
+      /* Possibly, the user specified an OS device file.  */
+      dest = grub_util_get_grub_dev (dev);
+      if (! dest)
+          grub_util_error (_("Invalid device `%s'.\n"), dev);
+      grub_util_info ("transformed OS device `%s' into GRUB device `%s'",
+                      dev, dest);
+    }
+
+
   /* Read the boot image by the OS service.  */
   boot_path = grub_util_get_path (dir, boot_file);
   boot_size = grub_util_get_image_size (boot_path);
@@ -303,6 +326,7 @@ SETUP (const char *dir,
   dest_dev = grub_device_open (dest);
   if (! dest_dev)
     grub_util_error ("%s", grub_errmsg);
+  free (dest);
 
   core_dev = dest_dev;
 
-- 
tg: (b67422d..) u/grub-setup-device (depends on: master)


             reply	other threads:[~2013-11-28 21:12 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-28 21:11 Andrey Borzenkov [this message]
2013-11-29  6:27 ` [PATCH] fix using grub device name as install device Vladimir 'φ-coder/phcoder' Serbinenko
2013-11-29  6:52   ` Andrey Borzenkov
2013-11-29  7:18     ` Vladimir 'φ-coder/phcoder' Serbinenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1385673108-13091-1-git-send-email-arvidjaar@gmail.com \
    --to=arvidjaar@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.