Am Freitag, den 01.08.2008, 17:09 +0200 schrieb Felix Zielcke:

> Maybe there's a way to make it even better so please comment all of you
> grub-devels :)

Thanks to Robert who suggested asprintf

I hope the #define _GNU_SOURCE which is needed for it isn't a problem,
you use anyway gcc specific extentions and GRUB is a GNU project :)

I hadn't yet an idea how to solve that md_dNNpNN case with it, so I just
moved the xmalloc() call down to that.

Please comment which way you mostly like.
Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1757)
+++ util/getroot.c	(Arbeitskopie)
@@ -17,6 +17,7 @@
  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#define _GNU_SOURCE
 #include <sys/stat.h>
 #include <unistd.h>
 #include <string.h>
@@ -407,17 +408,16 @@
   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);
-
+      asprintf(&grub_dev,"%s",os_dev + strlen("/dev/mapper/") -1);
       break;
 
     case GRUB_DEV_ABSTRACTION_RAID:
-      grub_dev = xmalloc (20);
 
       if (os_dev[7] == '_' && os_dev[8] == 'd')
 	{
+	  grub_dev = xmalloc (20);
+
 	  const char *p;
 
 	  /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
@@ -457,9 +457,12 @@
 	}
       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);
 
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to