I still can't see any use in this `escape a dash with a dash because we use a dash to seperate the vg part from the lv one' from LVM. As I already wrote, grub-probe works fine if you remove that double escaping from the file name and remount it. LVM (lv* vg* commands) shouldn't use the filename to get the vg and lv part ...
fz-vm:/dev# lvdisplay --- Logical volume --- LV Name /dev/m-y--vg/l-vol--0 VG Name m-y--vg lvdisplay is even showing the unescaped directory + symlink Well attached is now my cute little asprintf patch with a very ugly LVM part. It works for volumegroup: linuxvg logicalvolume: lvol0 /dev/mapper/linuxvg-lvol0 volume group: m-y--vg logical volume: l-vol--0 /dev/mapper/m--y----vg-l--vol----0 Please comment this, please give me hints how to make it better. I don't like the code myself but it seems like we should handle this double dash problem :(
Index: util/getroot.c =================================================================== --- util/getroot.c (Revision 1799) +++ util/getroot.c (Arbeitskopie) @@ -17,6 +17,7 @@ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. */ +#include <config.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> @@ -406,67 +407,56 @@ 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); - - break; - - case GRUB_DEV_ABSTRACTION_RAID: - grub_dev = xmalloc (20); - - if (os_dev[7] == '_' && os_dev[8] == 'd') + case GRUB_DEV_ABSTRACTION_LVM: + { - const char *p; + unsigned char i, j, k, l; - /* This a partitionable RAID device of the form /dev/md_dNNpMM. */ - int i; + j = sizeof ("/dev/mapper/") -1; + l = strlen (os_dev) - j + 1; - grub_dev[0] = 'm'; - grub_dev[1] = 'd'; - i = 2; - - p = os_dev + 9; - while (*p >= '0' && *p <= '9') + grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1); + + for (i = 0, k = 0; i < l; i++) { - grub_dev[i] = *p; - i++; - p++; + grub_dev[k] = os_dev[j + i]; + k++; + if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-') + i++; } + } - if (*p == '\0') - grub_dev[i] = '\0'; - else if (*p == 'p') - { - p++; - grub_dev[i] = ','; - i++; + break; - while (*p >= '0' && *p <= '9') - { - grub_dev[i] = *p; - i++; - p++; - } + case GRUB_DEV_ABSTRACTION_RAID: - grub_dev[i] = '\0'; - } - else - grub_util_error ("Unknown kind of RAID device `%s'", os_dev); - } - else if (os_dev[7] >= '0' && os_dev[7] <= '9') - { - memcpy (grub_dev, os_dev + 5, 7); - grub_dev[7] = '\0'; - } - else - grub_util_error ("Unknown kind of RAID device `%s'", os_dev); + if (os_dev[7] == '_' && os_dev[8] == 'd') + { + /* This a partitionable RAID device of the form /dev/md_dNNpMM. */ - break; + char *p; - default: /* GRUB_DEV_ABSTRACTION_NONE */ - grub_dev = grub_util_biosdisk_get_grub_dev (os_dev); + p = strchr (os_dev, 'p'); + if (p) + *p = ','; + + asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1); + } + else if (os_dev[7] >= '0' && os_dev[7] <= '9') + { + 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 */ + grub_dev = grub_util_biosdisk_get_grub_dev (os_dev); } return grub_dev;
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel