From 4ee559213787de1156fd794d890dec1ff3bc45d8 Mon Sep 17 00:00:00 2001 From: fzielcke Date: Thu, 4 Sep 2008 19:54:59 +0000 Subject: [PATCH] 2008-09-04 Felix Zielcke * util/getroot.c: Include . (grub_util_get_grub_dev): Rewrite to use asprintf for mdraid devices, add support for /dev/md/N devices and handle LVM double dash escaping. --- ChangeLog | 10 ++++++-- util/getroot.c | 65 ++++++++++++++++++++++---------------------------- 2 files changed, 36 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b8b46d10..571472959 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,13 @@ 2008-09-04 Felix Zielcke - * config.guess: Update to latest version from config.git. - * config.sub: Likewise. + * util/getroot.c: Include . + (grub_util_get_grub_dev): Rewrite to use asprintf for mdraid devices, + add support for /dev/md/N devices and handle LVM double dash escaping. + +2008-09-04 Felix Zielcke + + * config.guess: Update to latest version from config git. + * config.sub: Likewise. 2008-09-03 Robert Millan diff --git a/util/getroot.c b/util/getroot.c index f721e7fc3..07d4580a3 100644 --- a/util/getroot.c +++ b/util/getroot.c @@ -17,6 +17,7 @@ * along with GRUB. If not, see . */ +#include #include #include #include @@ -417,62 +418,52 @@ grub_util_get_grub_dev (const char *os_dev) switch (grub_util_get_dev_abstraction (os_dev)) { case GRUB_DEV_ABSTRACTION_LVM: - grub_dev = xmalloc (strlen (os_dev) - 12 + 1); - strcpy (grub_dev, os_dev + 12); + { + unsigned short i, len; + grub_size_t offset = sizeof ("/dev/mapper/") - 1; + len = strlen (os_dev) - offset + 1; + grub_dev = xmalloc (len); + + for (i = 0; i < len; i++, offset++) + { + grub_dev[i] = os_dev[offset]; + if (os_dev[offset] == '-' && os_dev[offset + 1] == '-') + offset++; + } + } + break; case GRUB_DEV_ABSTRACTION_RAID: - grub_dev = xmalloc (20); if (os_dev[7] == '_' && os_dev[8] == 'd') { - const char *p; - /* This a partitionable RAID device of the form /dev/md_dNNpMM. */ - int i; - - grub_dev[0] = 'm'; - grub_dev[1] = 'd'; - i = 2; - p = os_dev + 9; - while (*p >= '0' && *p <= '9') - { - grub_dev[i] = *p; - i++; - p++; - } + char *p , *q; - if (*p == '\0') - grub_dev[i] = '\0'; - else if (*p == 'p') - { - p++; - grub_dev[i] = ','; - i++; + p = strdup (os_dev + sizeof ("/dev/md_d") - 1); - while (*p >= '0' && *p <= '9') - { - grub_dev[i] = *p; - i++; - p++; - } + q = strchr (p, 'p'); + if (q) + *q = ','; - grub_dev[i] = '\0'; - } - else - grub_util_error ("Unknown kind of RAID device `%s'", os_dev); + asprintf (&grub_dev, "md%s", p); + free (p); } else if (os_dev[7] >= '0' && os_dev[7] <= '9') { - memcpy (grub_dev, os_dev + 5, 7); - grub_dev[7] = '\0'; + asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1); + } + else if (os_dev[7] == '/' && os_dev[8] >= '0' && os_dev[8] <= '9') + { + asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md/") - 1); } else grub_util_error ("Unknown kind of RAID device `%s'", os_dev); - + break; default: /* GRUB_DEV_ABSTRACTION_NONE */