Am Donnerstag, den 14.08.2008, 22:38 +0200 schrieb Robert Millan:

> Okay, but please send the patch without indentation first, so your changes can
> be reviewed.


svn diff --diff-cmd diff -x -upw

That way it works, the attached getroot_w.diff is made with it.
But I think it doestn't look that good to review it, with wrong
indentation.
So I made now the getroot.diff new without indenting the whole switch
block by 2 spaces.
Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1807)
+++ 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>
@@ -407,58 +408,47 @@ grub_util_get_grub_dev (const char *os_d
   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 char i, j, k, l;
 
-      break;
+	grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
+
+	j = sizeof ("/dev/mapper/") -1;
+	l = strlen (os_dev) - j + 1;
+	  
+	for (i = 0, k = 0; i < l; i++)
+	  {
+	    grub_dev[k] = os_dev[j + i];
+	    k++;
+	    if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-')
+	      i++;
+	  }
+      }
+
+    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++;
-	    }
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
+	  char *p;
 
-	      while (*p >= '0' && *p <= '9')
-		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	  p = strchr (os_dev, 'p');
+	  if (p)
+	    *p = ',';
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	  asprintf (&grub_dev, "md%s", os_dev + sizeof ("/dev/md_d") - 1);
 	}
       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);
Index: util/getroot.c
===================================================================
--- util/getroot.c	(Revision 1807)
+++ 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>
@@ -407,58 +408,47 @@ grub_util_get_grub_dev (const char *os_d
   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')
 	{
-	  const char *p;
+	  unsigned char i, j, k, l;
 
-	  /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
-	  int i;
+	  grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1);
 
-	  grub_dev[0] = 'm';
-	  grub_dev[1] = 'd';
-	  i = 2;
+	  j = sizeof ("/dev/mapper/") -1;
+	  l = strlen (os_dev) - j + 1;
 	  
-	  p = os_dev + 9;
-	  while (*p >= '0' && *p <= '9')
+	  for (i = 0, k = 0; i < l; i++)
 	    {
-	      grub_dev[i] = *p;
+	      grub_dev[k] = os_dev[j + i];
+	      k++;
+	      if (os_dev[j + i] == '-' && os_dev[j + i + 1] == '-')
 	      i++;
-	      p++;
+	    }
 	    }
 
-	  if (*p == '\0')
-	    grub_dev[i] = '\0';
-	  else if (*p == 'p')
-	    {
-	      p++;
-	      grub_dev[i] = ',';
-	      i++;
+	break;
 
-	      while (*p >= '0' && *p <= '9')
+      case GRUB_DEV_ABSTRACTION_RAID:
+
+	if (os_dev[7] == '_' && os_dev[8] == 'd')
 		{
-		  grub_dev[i] = *p;
-		  i++;
-		  p++;
-		}
+	    /* This a partitionable RAID device of the form /dev/md_dNNpMM. */
 
-	      grub_dev[i] = '\0';
-	    }
-	  else
-	    grub_util_error ("Unknown kind of RAID device `%s'", os_dev);
+	    char *p;
+
+	    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')
 	{
-	  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