From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1KTgi5-0003PO-3P for mharc-grub-devel@gnu.org; Thu, 14 Aug 2008 13:34:05 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KTgi2-0003PH-9x for grub-devel@gnu.org; Thu, 14 Aug 2008 13:34:02 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KTgi1-0003Ou-I5 for grub-devel@gnu.org; Thu, 14 Aug 2008 13:34:01 -0400 Received: from [199.232.76.173] (port=54676 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KTgi1-0003Or-Eb for grub-devel@gnu.org; Thu, 14 Aug 2008 13:34:01 -0400 Received: from moutng.kundenserver.de ([212.227.126.171]:61710) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KTgi0-0005aU-W8 for grub-devel@gnu.org; Thu, 14 Aug 2008 13:34:01 -0400 Received: from [85.180.28.246] (e180028246.adsl.alicedsl.de [85.180.28.246]) by mrelayeu.kundenserver.de (node=mrelayeu8) with ESMTP (Nemesis) id 0ML31I-1KTghz3gIr-0006f8; Thu, 14 Aug 2008 19:34:00 +0200 From: Felix Zielcke To: The development of GRUB 2 In-Reply-To: <1218471512.6939.19.camel@fz.local> References: <20080808202337.3440.57502.reportbug@sylvester.jejik.com.jejik.com> <1218277583.9301.6.camel@fz.local> <489EEAC5.4080209@jejik.com> <1218471512.6939.19.camel@fz.local> Content-Type: multipart/mixed; boundary="=-5KzSgpDgOhDt1VrI9iUs" Date: Thu, 14 Aug 2008 19:34:05 +0200 Message-Id: <1218735245.8950.10.camel@fz.local> Mime-Version: 1.0 X-Mailer: Evolution 2.22.3.1 X-Provags-ID: V01U2FsdGVkX1/tR8hHfwPGmdlF2dzsK38nUSJaCtZAtjk0l0H 6w7DqubQmiwzDEwyA8sIPS3U9++6v2XCwmctX1FVWkdRj0cm+T l5Z7kp+x7b/BbuCeQKhU9UdvQUrRJIG X-detected-kernel: by monty-python.gnu.org: Linux 2.6? (barebone, rare!) Subject: Re: [PATCH] Grub2 cannot find LVM volume groups with a dash (-) in the name X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Aug 2008 17:34:02 -0000 --=-5KzSgpDgOhDt1VrI9iUs Content-Type: text/plain Content-Transfer-Encoding: 7bit Am Montag, den 11.08.2008, 18:18 +0200 schrieb Felix Zielcke: > > 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 :( > Now that a bit time has passed, I think it isn't that ugly. But I still don't like it. I still haven't yet an idea how to make it better, I don't think it's that great to introduce 4 variables just to remove every 2nd dash. Unfortunately nobody commented on this new LVM part. Idention was still not that right I think and I moved the `grub_dev = xmalloc ()' line above the 2 `j = ..' and `l = ..'. Marco, I know that you think this is a bit lazy, but I think mentioning the double dash escaping and that it now uses asprintf for the RAID cases would be a bit too verbose. 2008-08-14 Felix Zielcke * util/getroot.c: Include . (grub_util_get_grub_dev): Rewritten. --=-5KzSgpDgOhDt1VrI9iUs Content-Disposition: attachment; filename=getroot.diff Content-Type: text/x-patch; name=getroot.diff; charset=UTF-8 Content-Transfer-Encoding: 7bit Index: util/getroot.c =================================================================== --- util/getroot.c (Revision 1804) +++ util/getroot.c (Arbeitskopie) @@ -17,6 +17,7 @@ * along with GRUB. If not, see . */ +#include #include #include #include @@ -406,67 +407,56 @@ 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); + case GRUB_DEV_ABSTRACTION_LVM: - strcpy (grub_dev, os_dev + 12); + { + unsigned char i, j, k, l; - break; + grub_dev = xmalloc (strlen (os_dev) - strlen ("/dev/mapper/") + 1); - 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') + j = sizeof ("/dev/mapper/") -1; + l = strlen (os_dev) - j + 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++; - - while (*p >= '0' && *p <= '9') - { - grub_dev[i] = *p; - i++; - p++; - } + break; - 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); + case GRUB_DEV_ABSTRACTION_RAID: + + if (os_dev[7] == '_' && os_dev[8] == 'd') + { + /* This a partitionable RAID device of the form /dev/md_dNNpMM. */ + + 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') + { + 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; + break; - default: /* GRUB_DEV_ABSTRACTION_NONE */ - grub_dev = grub_util_biosdisk_get_grub_dev (os_dev); + default: /* GRUB_DEV_ABSTRACTION_NONE */ + grub_dev = grub_util_biosdisk_get_grub_dev (os_dev); } return grub_dev; --=-5KzSgpDgOhDt1VrI9iUs--