]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* util/grub-mkconfig_lib.in (make_system_path_relative_to_its_root):
authorChristian Franke <franke@computer.org>
Sat, 1 May 2010 19:39:32 +0000 (21:39 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 1 May 2010 19:39:32 +0000 (21:39 +0200)
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.
Include "/" case in trailing slash removal.

ChangeLog
util/grub-mkconfig_lib.in
util/misc.c

index 62252fcfc9cb5e48ca1d632d9d1738a81df47e46..dadecec8673c602bdf245f6c3cdf6b44cceac447 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2010-05-01  Christian Franke  <franke@computer.org>
+
+       * 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.
+       Include "/" case in trailing slash removal.
+
 2010-05-01  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * kern/main.c (grub_load_config): Fix copy-pasted comment.
index 831bef8466a6f416905c194c607a661d144d45da..f4674b257509088ca0706f17a5ed7630998e999c 100644 (file)
@@ -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
@@ -44,21 +44,7 @@ grub_warn ()
 
 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 ()
index 17fa6d5e4de7696b6bc77ba018fc747ffc5fb67b..f9d860d9adf28d5743fb65821d4e607df11893c4 100644 (file)
 # include <malloc.h>
 #endif
 
+#ifdef __CYGWIN__
+# include <sys/cygwin.h>
+# define DEV_CYGDRIVE_MAJOR 98
+#endif
+
 #ifdef __MINGW32__
 #include <windows.h>
 #include <winioctl.h>
@@ -456,6 +461,27 @@ canonicalize_file_name (const char *path)
   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);
+  int offs = (len > 2 && winpath[1] == ':' ? 2 : 0);
+
+  int i;
+  for (i = offs; i < len; i++)
+    if (winpath[i] == '\\')
+      winpath[i] = '/';
+  return xstrdup (winpath + offs);
+}
+#endif
+
 /* This function never prints trailing slashes (so that its output
    can be appended a slash unconditionally).  */
 char *
@@ -521,30 +547,31 @@ make_system_path_relative_to_its_root (const char *path)
       /* 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
+
+  /* Remove trailing slashes, return empty string if root directory.  */
   len = strlen (buf3);
-  while (buf3[len - 1] == '/' && len > 1)
+  while (len > 0 && buf3[len - 1] == '/')
     {
       buf3[len - 1] = '\0';
       len--;