[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] fix using grub device name as install device
From: |
Vladimir 'φ-coder/phcoder' Serbinenko |
Subject: |
Re: [PATCH] fix using grub device name as install device |
Date: |
Fri, 29 Nov 2013 07:27:06 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131005 Icedove/17.0.9 |
On 28.11.2013 22:11, Andrey Borzenkov wrote:
> 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:
>
Do you have a reason for continuing accepting such input? It was
considered wrong way of doing things for quite some while.
> 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;
>
>
signature.asc
Description: OpenPGP digital signature