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)
next 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.