2007-08-12 Robert Millan * util/i386/get_disk_name.c: New. Implement grub_util_get_disk_name() to tell grub-mkdevicemap how to name devices. * util/ieee1275/get_disk_name.c: Likewise (using "ofpathname -a" feature). * conf/i386-efi.rmk (grub_mkdevicemap_SOURCES): Add util/i386/get_disk_name.c. * conf/i386-pc.rmk (grub_mkdevicemap_SOURCES): Likewise. * conf/powerpc-ieee1275.rmk (grub_mkdevicemap_SOURCES): Add util/ieee1275/get_disk_name.c. * include/grub/util/misc.h: grub_util_get_disk_name() declaration. * DISTLIST: Add util/i386/get_disk_name.c and util/ieee1275/get_disk_name.c. * util/grub-mkdevicemap.c: Replace device naming logic with grub_util_get_disk_name() calls. diff -Nur grub2/conf/i386-efi.rmk grub2.mkdevicemap/conf/i386-efi.rmk --- grub2/conf/i386-efi.rmk 2007-08-02 22:42:19.000000000 +0200 +++ grub2.mkdevicemap/conf/i386-efi.rmk 2007-08-12 15:26:42.000000000 +0200 @@ -24,7 +24,8 @@ # kern/fs.c kern/env.c fs/fshelp.c # For grub-mkdevicemap. -grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c +grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c \ + util/i386/get_disk_name.c # For grub-probe. grub_probe_DEPENDENCIES = grub_probe_init.h diff -Nur grub2/conf/i386-pc.rmk grub2.mkdevicemap/conf/i386-pc.rmk --- grub2/conf/i386-pc.rmk 2007-08-02 22:42:19.000000000 +0200 +++ grub2.mkdevicemap/conf/i386-pc.rmk 2007-08-12 15:26:42.000000000 +0200 @@ -72,7 +72,8 @@ util/raid.c util/lvm.c grub_setup_init.c # For grub-mkdevicemap. -grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c +grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c \ + util/i386/get_disk_name.c # For grub-probe. grub_probe_DEPENDENCIES = grub_probe_init.h diff -Nur grub2/conf/powerpc-ieee1275.rmk grub2.mkdevicemap/conf/powerpc-ieee1275.rmk --- grub2/conf/powerpc-ieee1275.rmk 2007-08-02 22:42:19.000000000 +0200 +++ grub2.mkdevicemap/conf/powerpc-ieee1275.rmk 2007-08-12 15:26:42.000000000 +0200 @@ -36,7 +36,8 @@ util/resolve.c # For grub-mkdevicemap. -grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c +grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c \ + util/ieee1275/get_disk_name.c # For grub-probe. grub_probe_DEPENDENCIES = grub_probe_init.h diff -Nur grub2/include/grub/util/misc.h grub2.mkdevicemap/include/grub/util/misc.h --- grub2/include/grub/util/misc.h 2007-07-22 01:32:25.000000000 +0200 +++ grub2.mkdevicemap/include/grub/util/misc.h 2007-08-12 15:26:42.000000000 +0200 @@ -53,5 +53,6 @@ void grub_util_write_image (const char *img, size_t size, FILE *out); void grub_util_write_image_at (const void *img, size_t size, off_t offset, FILE *out); +char *grub_util_get_disk_name (int disk, char *name); #endif /* ! GRUB_UTIL_MISC_HEADER */ diff -Nur grub2/util/grub-mkdevicemap.c grub2.mkdevicemap/util/grub-mkdevicemap.c --- grub2/util/grub-mkdevicemap.c 2007-07-22 01:32:31.000000000 +0200 +++ grub2.mkdevicemap/util/grub-mkdevicemap.c 2007-08-12 15:26:42.000000000 +0200 @@ -402,8 +402,11 @@ if (realpath (discn, name)) { + char *p; strcat (name, "/disc"); - fprintf (fp, "(hd%d)\t%s\n", num_hd, name); + p = grub_util_get_disk_name (num_hd, name); + fprintf (fp, "(%s)\t%s\n", p, name); + free (p); } num_hd++; @@ -421,7 +424,10 @@ get_ide_disk_name (name, i); if (check_device (name)) { - fprintf (fp, "(hd%d)\t%s\n", num_hd, name); + char *p; + p = grub_util_get_disk_name (num_hd, name); + fprintf (fp, "(%s)\t%s\n", p, name); + free (p); num_hd++; } } @@ -435,7 +441,10 @@ get_ataraid_disk_name (name, i); if (check_device (name)) { - fprintf (fp, "(hd%d)\t%s\n", num_hd, name); + char *p; + p = grub_util_get_disk_name (num_hd, name); + fprintf (fp, "(%s)\t%s\n", p, name); + free (p); num_hd++; } } @@ -449,7 +458,10 @@ get_scsi_disk_name (name, i); if (check_device (name)) { - fprintf (fp, "(hd%d)\t%s\n", num_hd, name); + char *p; + p = grub_util_get_disk_name (num_hd, name); + fprintf (fp, "(%s)\t%s\n", p, name); + free (p); num_hd++; } } @@ -472,7 +484,10 @@ get_dac960_disk_name (name, controller, drive); if (check_device (name)) { - fprintf (fp, "(hd%d)\t%s\n", num_hd, name); + char *p; + p = grub_util_get_disk_name (num_hd, name); + fprintf (fp, "(%s)\t%s\n", p, name); + free (p); num_hd++; } } @@ -490,7 +505,10 @@ get_i2o_disk_name (name, unit); if (check_device (name)) { - fprintf (fp, "(hd%d)\t%s\n", num_hd, name); + char *p; + p = grub_util_get_disk_name (num_hd, name); + fprintf (fp, "(%s)\t%s\n", p, name); + free (p); num_hd++; } } diff -Nur grub2/util/i386/get_disk_name.c grub2.mkdevicemap/util/i386/get_disk_name.c --- grub2/util/i386/get_disk_name.c 1970-01-01 01:00:00.000000000 +0100 +++ grub2.mkdevicemap/util/i386/get_disk_name.c 2007-08-12 15:26:42.000000000 +0200 @@ -0,0 +1,31 @@ +/* get_disk_name.c */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2007 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include + +char * +grub_util_get_disk_name (int disk, char *name) +{ + char *p; + + p = xmalloc (16); + sprintf (p, "hd%d", disk); + + return p; +} diff -Nur grub2/util/ieee1275/get_disk_name.c grub2.mkdevicemap/util/ieee1275/get_disk_name.c --- grub2/util/ieee1275/get_disk_name.c 1970-01-01 01:00:00.000000000 +0100 +++ grub2.mkdevicemap/util/ieee1275/get_disk_name.c 2007-08-12 16:16:56.000000000 +0200 @@ -0,0 +1,60 @@ +/* get_disk_name.c */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2007 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include + +char * +grub_util_get_disk_name (int disk, char *name) +{ + int p[2]; + + char *line = NULL; + int zero = 0; + int len; + + pipe (p); + + switch (fork ()) + { + case -1: + perror ("fork"); + exit (1); + case 0: + close (1); + dup (p[1]); + close (p[0]); + close (p[1]); + execlp ("ofpathname", "ofpathname", "-a", name, NULL); + perror ("execlp"); + default: + close (0); + dup (p[0]); + close (p[0]); + close (p[1]); + } + + len = getline (&line, &zero, stdin); + if (len < 2) + grub_util_error ("ofpathname didn't print a meaningful alias name"); + + line[len - 1] = '\0'; + + return line; +} --- grub2/DISTLIST 2007-08-02 22:42:19.000000000 +0200 +++ grub2.mkdevicemap/DISTLIST 2007-08-12 16:33:22.000000000 +0200 @@ -285,11 +285,13 @@ util/grub.d/README util/i386/efi/grub-install.in util/i386/efi/grub-mkimage.c +util/i386/get_disk_name.c util/i386/pc/grub-install.in util/i386/pc/grub-mkimage.c util/i386/pc/grub-setup.c util/i386/pc/misc.c util/i386/pc/grub-mkrescue.in +util/ieee1275/get_disk_name.c util/powerpc/ieee1275/grub-install.in util/powerpc/ieee1275/grub-mkimage.c util/powerpc/ieee1275/misc.c