From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1O27Ry-0004Ju-FG for mharc-grub-devel@gnu.org; Wed, 14 Apr 2010 14:36:34 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O27Rw-0004JJ-51 for grub-devel@gnu.org; Wed, 14 Apr 2010 14:36:32 -0400 Received: from [140.186.70.92] (port=46871 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O27Ru-0004Ib-KV for grub-devel@gnu.org; Wed, 14 Apr 2010 14:36:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O27Rt-0007vA-10 for grub-devel@gnu.org; Wed, 14 Apr 2010 14:36:30 -0400 Received: from mailout01.t-online.de ([194.25.134.80]:46403) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O27Rs-0007us-Ly for grub-devel@gnu.org; Wed, 14 Apr 2010 14:36:28 -0400 Received: from fwd05.aul.t-online.de (fwd05.aul.t-online.de ) by mailout01.t-online.de with smtp id 1O27Rq-0007ki-Dz; Wed, 14 Apr 2010 20:36:26 +0200 Received: from [192.168.2.100] (GQFToEZcrhSR-shh+dQr946FZVDEiqtH6XaRWuQblsA6bS+mrDRf6RdYNRB-iV2ZaD@[217.235.185.203]) by fwd05.aul.t-online.de with esmtp id 1O27Rd-0qrEsS0; Wed, 14 Apr 2010 20:36:13 +0200 Message-ID: <4BC60B1D.8080609@t-online.de> Date: Wed, 14 Apr 2010 20:36:13 +0200 From: Christian Franke User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.8) Gecko/20100205 SeaMonkey/2.0.3 MIME-Version: 1.0 To: grub-devel@gnu.org Content-Type: multipart/mixed; boundary="------------030509000909060805060903" X-ID: GQFToEZcrhSR-shh+dQr946FZVDEiqtH6XaRWuQblsA6bS+mrDRf6RdYNRB-iV2ZaD X-TOI-MSGID: 71e13464-bfb5-4af3-82ae-75103015e877 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) Subject: [PATCH] Fix Cygwin path handling X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Apr 2010 18:36:32 -0000 This is a multi-part message in MIME format. --------------030509000909060805060903 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit The Cywin path handling is broken since make_system_path_relative_to_its_root() functionality was moved from the lib script to misc.c. This patch should fix this. It reuses the Cygwin specific code from getroot.c:grub_get_prefix() which apparently is a different implementation of the same function. I would suggest to remove grub_get_prefix(), it is now only used in grub-emu.c and sparc64/ieee1275/grub-setup.c. Not included in the patch, should be done in a separate commit. 2010-04-14 Christian Franke * util/grub-mkconfig_lib.in (make_system_path_relative_to_its_root): Remove broken Cygwin path conversion. * util/misc.c: [__CYGWIN__] Add include and define. [__CYGWIN__] (get_win32_path): Copy function from getroot.c, modify for Cygwin 1.7. (make_system_path_relative_to_its_root): Simplify loop, replace early return by break. [__CYGWIN__] Add conversion to win32 path. -- Regards, Christian Franke --------------030509000909060805060903 Content-Type: text/x-diff; name="grub2-cygwin-path.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="grub2-cygwin-path.patch" === modified file 'util/grub-mkconfig_lib.in' --- util/grub-mkconfig_lib.in 2010-04-13 12:57:56 +0000 +++ util/grub-mkconfig_lib.in 2010-04-14 16:48:44 +0000 @@ -1,5 +1,5 @@ # Helper library for grub-mkconfig -# Copyright (C) 2007,2008,2009 Free Software Foundation, Inc. +# Copyright (C) 2007,2008,2009,2010 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 @@ -38,21 +38,7 @@ make_system_path_relative_to_its_root () { - path="`${grub_mkrelpath} $1`" - - case "`uname 2>/dev/null`" in - CYGWIN*) - # Cygwin: Check if regular or emulated mount. - if [ -z "$dir" ] || [ "`stat -c %D "$dir/.."`" != 620000 ] ; then - # Reached some mount point not below /cygdrive. - # GRUB does not know Cygwin's emulated mounts, - # convert to Win32 path and remove drive letter. - path=`cygpath -m "$path" | sed -n 's,^[A-Za-z]:,,p'` - test ! -z "$path" || return 1 - fi ;; - esac - - echo "$path" + ${grub_mkrelpath} $1 } is_path_readable_by_grub () === modified file 'util/misc.c' --- util/misc.c 2010-04-09 23:25:46 +0000 +++ util/misc.c 2010-04-14 16:48:44 +0000 @@ -53,6 +53,11 @@ # include #endif +#ifdef __CYGWIN__ +# include +# define DEV_CYGDRIVE_MAJOR 98 +#endif + #ifdef __MINGW32__ #include #include @@ -456,6 +461,31 @@ return ret; } +#ifdef __CYGWIN__ +/* Convert POSIX path to Win32 path, + remove drive letter, replace backslashes. */ +static char * +get_win32_path (const char *path) +{ + char winpath[PATH_MAX]; + if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, path, winpath, sizeof(winpath))) + grub_util_error ("cygwin_conv_path() failed"); + + int len = strlen (winpath); + if (len > 2 && winpath[1] == ':') + { + len -= 2; + memmove (winpath, winpath + 2, len + 1); + } + + int i; + for (i = 0; i < len; i++) + if (winpath[i] == '\\') + winpath[i] = '/'; + return xstrdup (winpath); +} +#endif + /* This function never prints trailing slashes (so that its output can be appended a slash unconditionally). */ char * @@ -521,28 +551,28 @@ /* offset == 1 means root directory. */ if (offset == 1) { - free (buf); - len = strlen (buf2); - while (buf2[len - 1] == '/' && len > 1) - { - buf2[len - 1] = '\0'; - len--; - } - if (len > 1) - return buf2; - else - { - /* This means path given is just a backslash. As above - we have to return an empty string. */ - free (buf2); - return xstrdup (""); - } + /* Include leading slash. */ + offset = 0; + break; } } free (buf); buf3 = xstrdup (buf2 + offset); free (buf2); +#ifdef __CYGWIN__ + if (st.st_dev != (DEV_CYGDRIVE_MAJOR << 16)) + { + /* Reached some mount point not below /cygdrive. + GRUB does not know Cygwin's emulated mounts, + convert to Win32 path. */ + grub_util_info ("Cygwin path = %s\n", buf3); + char * temp = get_win32_path (buf3); + free (buf3); + buf3 = temp; + } +#endif + len = strlen (buf3); while (buf3[len - 1] == '/' && len > 1) { --------------030509000909060805060903--