* disk/ieee1275/ofdisk.c (compute_dev_path): New.
(grub_ofdisk_open): Use it to un-escape "," characters. * kern/disk.c (find_part_sep): New. (grub_disk_open): Use it to find the first non-escaped ',' character in the disk name. * util/ieee1275/devicemap.c (escape_of_path): New. (grub_util_emit_devicemap_entry): Use it. * util/sparc64/ieee1275/grub-install.in: Update script to strip partition specifiers properly by not triggering on '\' escaped ',' characters.
This commit is contained in:
parent
9554b15eac
commit
67e23c9004
6 changed files with 130 additions and 14 deletions
11
ChangeLog
11
ChangeLog
|
@ -8,6 +8,17 @@
|
||||||
* disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Bypass cdrom
|
* disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Bypass cdrom
|
||||||
devices, and do not traverse down under controller nodes.
|
devices, and do not traverse down under controller nodes.
|
||||||
|
|
||||||
|
* disk/ieee1275/ofdisk.c (compute_dev_path): New.
|
||||||
|
(grub_ofdisk_open): Use it to un-escape "," characters.
|
||||||
|
* kern/disk.c (find_part_sep): New.
|
||||||
|
(grub_disk_open): Use it to find the first non-escaped ','
|
||||||
|
character in the disk name.
|
||||||
|
* util/ieee1275/devicemap.c (escape_of_path): New.
|
||||||
|
(grub_util_emit_devicemap_entry): Use it.
|
||||||
|
* util/sparc64/ieee1275/grub-install.in: Update script to
|
||||||
|
strip partition specifiers properly by not triggering on
|
||||||
|
'\' escaped ',' characters.
|
||||||
|
|
||||||
2009-05-04 Robert Millan <rmh.grub@aybabtu.com>
|
2009-05-04 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
* include/grub/i386/linux.h (GRUB_LINUX_VID_MODE_VESA_START): Set
|
* include/grub/i386/linux.h (GRUB_LINUX_VID_MODE_VESA_START): Set
|
||||||
|
|
|
@ -115,6 +115,38 @@ grub_ofdisk_iterate (int (*hook) (const char *name))
|
||||||
return grub_devalias_iterate (dev_iterate);
|
return grub_devalias_iterate (dev_iterate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
compute_dev_path (const char *name)
|
||||||
|
{
|
||||||
|
char *devpath = grub_malloc (grub_strlen (name) + 2);
|
||||||
|
char *p, c;
|
||||||
|
|
||||||
|
if (!devpath)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Un-escape commas. */
|
||||||
|
p = devpath;
|
||||||
|
while ((c = *name++) != '\0')
|
||||||
|
{
|
||||||
|
if (c == '\\' && *name == ',')
|
||||||
|
{
|
||||||
|
*p++ = ',';
|
||||||
|
name++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*p++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0))
|
||||||
|
{
|
||||||
|
*p++ = ':';
|
||||||
|
*p++ = '0';
|
||||||
|
}
|
||||||
|
*p++ = '\0';
|
||||||
|
|
||||||
|
return devpath;
|
||||||
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_ofdisk_open (const char *name, grub_disk_t disk)
|
grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||||
{
|
{
|
||||||
|
@ -126,14 +158,10 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||||
char prop[64];
|
char prop[64];
|
||||||
grub_ssize_t actual;
|
grub_ssize_t actual;
|
||||||
|
|
||||||
devpath = grub_strndup (name, grub_strlen (name) + 2);
|
devpath = compute_dev_path (name);
|
||||||
if (! devpath)
|
if (! devpath)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
/* To access the complete disk add `:0'. */
|
|
||||||
if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0))
|
|
||||||
grub_strcat (devpath, ":0");
|
|
||||||
|
|
||||||
op = ofdisk_hash_find (devpath);
|
op = ofdisk_hash_find (devpath);
|
||||||
if (!op)
|
if (!op)
|
||||||
op = ofdisk_hash_add (devpath);
|
op = ofdisk_hash_add (devpath);
|
||||||
|
|
22
kern/disk.c
22
kern/disk.c
|
@ -215,10 +215,28 @@ grub_disk_dev_iterate (int (*hook) (const char *name))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the location of the first ',', if any, which is not
|
||||||
|
escaped by a '\'. */
|
||||||
|
static const char *
|
||||||
|
find_part_sep (const char *name)
|
||||||
|
{
|
||||||
|
const char *p = name;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
while ((c = *p++) != '\0')
|
||||||
|
{
|
||||||
|
if (c == '\\' && *p == ',')
|
||||||
|
p++;
|
||||||
|
else if (c == ',')
|
||||||
|
return p - 1;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
grub_disk_t
|
grub_disk_t
|
||||||
grub_disk_open (const char *name)
|
grub_disk_open (const char *name)
|
||||||
{
|
{
|
||||||
char *p;
|
const char *p;
|
||||||
grub_disk_t disk;
|
grub_disk_t disk;
|
||||||
grub_disk_dev_t dev;
|
grub_disk_dev_t dev;
|
||||||
char *raw = (char *) name;
|
char *raw = (char *) name;
|
||||||
|
@ -238,7 +256,7 @@ grub_disk_open (const char *name)
|
||||||
if (! disk->name)
|
if (! disk->name)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
p = grub_strchr (name, ',');
|
p = find_part_sep (name);
|
||||||
if (p)
|
if (p)
|
||||||
{
|
{
|
||||||
grub_size_t len = p - name;
|
grub_size_t len = p - name;
|
||||||
|
|
|
@ -1,13 +1,47 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
#include <grub/util/deviceiter.h>
|
#include <grub/util/deviceiter.h>
|
||||||
#include <grub/util/ofpath.h>
|
#include <grub/util/ofpath.h>
|
||||||
|
#include <grub/util/misc.h>
|
||||||
|
|
||||||
|
/* Since OF path names can have "," characters in them, and GRUB
|
||||||
|
internally uses "," to indicate partitions (unlike OF which uses
|
||||||
|
":" for this purpose) we escape such commas. */
|
||||||
|
|
||||||
|
static char *
|
||||||
|
escape_of_path (const char *orig_path)
|
||||||
|
{
|
||||||
|
char *new_path, *d, c;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
if (!strchr (orig_path, ','))
|
||||||
|
return (char *) orig_path;
|
||||||
|
|
||||||
|
new_path = xmalloc (strlen (orig_path) * 2);
|
||||||
|
|
||||||
|
p = orig_path;
|
||||||
|
d = new_path;
|
||||||
|
while ((c = *p++) != '\0')
|
||||||
|
{
|
||||||
|
if (c == ',')
|
||||||
|
*d++ = '\\';
|
||||||
|
*d++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
free ((char *) orig_path);
|
||||||
|
|
||||||
|
return new_path;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_util_emit_devicemap_entry (FILE *fp, char *name, int is_floppy UNUSED,
|
grub_util_emit_devicemap_entry (FILE *fp, char *name, int is_floppy UNUSED,
|
||||||
int *num_fd UNUSED, int *num_hd UNUSED)
|
int *num_fd UNUSED, int *num_hd UNUSED)
|
||||||
{
|
{
|
||||||
const char *ofpath = grub_util_devname_to_ofpath (name);
|
const char *orig_path = grub_util_devname_to_ofpath (name);
|
||||||
|
char *ofpath = escape_of_path (orig_path);
|
||||||
|
|
||||||
fprintf(fp, "(%s)\t%s\n", ofpath, name);
|
fprintf(fp, "(%s)\t%s\n", ofpath, name);
|
||||||
|
|
||||||
|
free (ofpath);
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,8 +237,8 @@ if [ "x${devabstraction_module}" = "x" ] ; then
|
||||||
grub_drive="`$grub_probe --target=drive --device ${grub_device}`"
|
grub_drive="`$grub_probe --target=drive --device ${grub_device}`"
|
||||||
|
|
||||||
# Strip partition number
|
# Strip partition number
|
||||||
install_drive="`echo ${install_drive} | sed -e s/,[0-9]*//g`"
|
install_drive="`echo ${install_drive} | sed -e s/\([^\]\),[0-9]*/\1/g`"
|
||||||
grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*//g`"
|
grub_drive="`echo ${grub_drive} | sed -e s/\([^\]\),[0-9]*/\1/g`"
|
||||||
if [ "x${grub_drive}" != "x${install_drive}" ] ; then
|
if [ "x${grub_drive}" != "x${install_drive}" ] ; then
|
||||||
uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
|
uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
|
||||||
if [ "x${uuid}" = "x" ] ; then
|
if [ "x${uuid}" = "x" ] ; then
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
* device. It also needs to know the initial block number of
|
* device. It also needs to know the initial block number of
|
||||||
* 'core' (which is 'diskboot' concatenated with 'kernel' and
|
* 'core' (which is 'diskboot' concatenated with 'kernel' and
|
||||||
* all the modules, this is created by grub-mkimage). This resulting
|
* all the modules, this is created by grub-mkimage). This resulting
|
||||||
* 'boot' image is 512 bytes in size and is placed in the first block
|
* 'boot' image is 512 bytes in size and is placed in the second block
|
||||||
* of a partition.
|
* of a partition.
|
||||||
*
|
*
|
||||||
* The initial 'diskboot' block acts as a loader for the actual GRUB
|
* The initial 'diskboot' block acts as a loader for the actual GRUB
|
||||||
|
@ -100,6 +100,28 @@ grub_refresh (void)
|
||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *compute_dest_ofpath (const char *dest)
|
||||||
|
{
|
||||||
|
int len = strlen (dest);
|
||||||
|
char *res, *p, c;
|
||||||
|
|
||||||
|
res = xmalloc (len);
|
||||||
|
p = res;
|
||||||
|
while ((c = *dest++) != '\0')
|
||||||
|
{
|
||||||
|
if (c == '\\' && *dest == ',')
|
||||||
|
{
|
||||||
|
*p++ = ',';
|
||||||
|
dest++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*p++ = c;
|
||||||
|
}
|
||||||
|
*p++ = '\0';
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup (const char *prefix, const char *dir,
|
setup (const char *prefix, const char *dir,
|
||||||
const char *boot_file, const char *core_file,
|
const char *boot_file, const char *core_file,
|
||||||
|
@ -110,7 +132,7 @@ setup (const char *prefix, const char *dir,
|
||||||
size_t boot_size, core_size;
|
size_t boot_size, core_size;
|
||||||
grub_uint16_t core_sectors;
|
grub_uint16_t core_sectors;
|
||||||
grub_device_t root_dev, dest_dev;
|
grub_device_t root_dev, dest_dev;
|
||||||
char *boot_devpath;
|
char *boot_devpath, *dest_ofpath;
|
||||||
grub_disk_addr_t *kernel_sector;
|
grub_disk_addr_t *kernel_sector;
|
||||||
struct boot_blocklist *first_block, *block;
|
struct boot_blocklist *first_block, *block;
|
||||||
char *tmp_img;
|
char *tmp_img;
|
||||||
|
@ -170,6 +192,8 @@ setup (const char *prefix, const char *dir,
|
||||||
last_length = length;
|
last_length = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dest_ofpath = compute_dest_ofpath (dest);
|
||||||
|
|
||||||
/* Read the boot image by the OS service. */
|
/* Read the boot image by the OS service. */
|
||||||
boot_path = grub_util_get_path (dir, boot_file);
|
boot_path = grub_util_get_path (dir, boot_file);
|
||||||
boot_size = grub_util_get_image_size (boot_path);
|
boot_size = grub_util_get_image_size (boot_path);
|
||||||
|
@ -202,7 +226,8 @@ setup (const char *prefix, const char *dir,
|
||||||
+ GRUB_DISK_SECTOR_SIZE
|
+ GRUB_DISK_SECTOR_SIZE
|
||||||
- sizeof (*block));
|
- sizeof (*block));
|
||||||
|
|
||||||
grub_util_info ("root is '%s' and dest is '%s'", root, dest);
|
grub_util_info ("root is '%s', dest is '%s', and dest_ofpath is '%s'",
|
||||||
|
root, dest, dest_ofpath);
|
||||||
|
|
||||||
/* Open the root device and the destination device. */
|
/* Open the root device and the destination device. */
|
||||||
grub_util_info ("Opening root");
|
grub_util_info ("Opening root");
|
||||||
|
@ -330,7 +355,7 @@ setup (const char *prefix, const char *dir,
|
||||||
|
|
||||||
*kernel_sector = grub_cpu_to_be64 (first_sector);
|
*kernel_sector = grub_cpu_to_be64 (first_sector);
|
||||||
|
|
||||||
strcpy(boot_devpath, dest);
|
strcpy(boot_devpath, dest_ofpath);
|
||||||
|
|
||||||
grub_util_info ("boot device path %s, prefix is %s, dest is %s",
|
grub_util_info ("boot device path %s, prefix is %s, dest is %s",
|
||||||
boot_devpath, prefix, dest);
|
boot_devpath, prefix, dest);
|
||||||
|
|
Loading…
Reference in a new issue