+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.
# 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
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 ()
# include <malloc.h>
#endif
+#ifdef __CYGWIN__
+# include <sys/cygwin.h>
+# define DEV_CYGDRIVE_MAJOR 98
+#endif
+
#ifdef __MINGW32__
#include <windows.h>
#include <winioctl.h>
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 *
/* 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--;