2008-09-04 Felix Zielcke <fzielcke@z-51.de>

* util/getroot.c: Include <config.h>.
        (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.
This commit is contained in:
fzielcke 2008-09-04 19:54:59 +00:00
parent 58b6645a8f
commit 4ee5592137
2 changed files with 36 additions and 39 deletions

View file

@ -1,7 +1,13 @@
2008-09-04 Felix Zielcke <fzielcke@z-51.de> 2008-09-04 Felix Zielcke <fzielcke@z-51.de>
* config.guess: Update to latest version from config.git. * util/getroot.c: Include <config.h>.
* config.sub: Likewise. (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 <fzielcke@z-51.de>
* config.guess: Update to latest version from config git.
* config.sub: Likewise.
2008-09-03 Robert Millan <rmh@aybabtu.com> 2008-09-03 Robert Millan <rmh@aybabtu.com>

View file

@ -17,6 +17,7 @@
* along with GRUB. If not, see <http://www.gnu.org/licenses/>. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <config.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@ -417,62 +418,52 @@ grub_util_get_grub_dev (const char *os_dev)
switch (grub_util_get_dev_abstraction (os_dev)) switch (grub_util_get_dev_abstraction (os_dev))
{ {
case GRUB_DEV_ABSTRACTION_LVM: 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; break;
case GRUB_DEV_ABSTRACTION_RAID: case GRUB_DEV_ABSTRACTION_RAID:
grub_dev = xmalloc (20);
if (os_dev[7] == '_' && os_dev[8] == 'd') if (os_dev[7] == '_' && os_dev[8] == 'd')
{ {
const char *p;
/* This a partitionable RAID device of the form /dev/md_dNNpMM. */ /* 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; char *p , *q;
while (*p >= '0' && *p <= '9')
{
grub_dev[i] = *p;
i++;
p++;
}
if (*p == '\0') p = strdup (os_dev + sizeof ("/dev/md_d") - 1);
grub_dev[i] = '\0';
else if (*p == 'p')
{
p++;
grub_dev[i] = ',';
i++;
while (*p >= '0' && *p <= '9') q = strchr (p, 'p');
{ if (q)
grub_dev[i] = *p; *q = ',';
i++;
p++;
}
grub_dev[i] = '\0'; asprintf (&grub_dev, "md%s", p);
} free (p);
else
grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
} }
else if (os_dev[7] >= '0' && os_dev[7] <= '9') else if (os_dev[7] >= '0' && os_dev[7] <= '9')
{ {
memcpy (grub_dev, os_dev + 5, 7); asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md") - 1);
grub_dev[7] = '\0'; }
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 else
grub_util_error ("Unknown kind of RAID device `%s'", os_dev); grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
break; break;
default: /* GRUB_DEV_ABSTRACTION_NONE */ default: /* GRUB_DEV_ABSTRACTION_NONE */