grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] update-grub for Cygwin


From: Christian Franke
Subject: Re: [PATCH] update-grub for Cygwin
Date: Mon, 04 Aug 2008 21:46:03 +0200
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080702 SeaMonkey/1.1.11

Christian Franke wrote:
Robert Millan wrote:
On Thu, Jul 24, 2008 at 10:39:04PM +0200, Christian Franke wrote:
+
+d="`${grub_probe} -t drive "$p" 2>/dev/null`" || exit 0

Please avoid reliing on '-t drive'.  It's based on device.map which just
contains guesswork.

prepare_grub_to_access_device() is a much better option.


Yes. Thanks for the info. New version below.

Christian

...


Here a more generic version which allows to specifiy windows system dirs by /etc/default/grub:GRUB_WINDOWS_DIRS.

Defaults to current SYSTEMDRIVE on Cygwin, and nothing on other OS.

Christian

2008-08-04  Christian Franke  <address@hidden>

        * conf/common.rmk: Add `10_windows' to `update-grub_SCRIPTS'.
        * util/grub.d/10_windows.in: New file.
        * util/update-grub.in: Add export of GRUB_WINDOWS_DIRS.


diff --git a/conf/common.rmk b/conf/common.rmk
index 3d3cd8a..3d674a6 100644
--- a/conf/common.rmk
+++ b/conf/common.rmk
@@ -120,7 +120,7 @@ CLEANFILES += update-grub_lib
 %: util/grub.d/%.in config.status
        ./config.status --file=$@:$<
        chmod +x $@
-update-grub_SCRIPTS = 00_header 10_linux 10_hurd 30_os-prober 40_custom
+update-grub_SCRIPTS = 00_header 10_linux 10_hurd 10_windows 30_os-prober 
40_custom
 CLEANFILES += $(update-grub_SCRIPTS)
 
 update-grub_DATA += util/grub.d/README
diff --git a/util/grub.d/10_windows.in b/util/grub.d/10_windows.in
new file mode 100644
index 0000000..0b0bce2
--- /dev/null
+++ b/util/grub.d/10_windows.in
@@ -0,0 +1,104 @@
+#! /bin/sh -e
+
+# update-grub helper script.
+# Copyright (C) 2008  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
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GRUB is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+
address@hidden@
address@hidden@
address@hidden@
+. ${libdir}/grub/update-grub_lib
+
+# List of directories to search for Windows can be specified
+# in @sysconfdir@/default/grub by GRUB_WINDOWS_DIRS, e.g:
+# GRUB_WINDOWS_DIRS="/boot /mnt/win*"
+
+dirlist="$GRUB_WINDOWS_DIRS"
+
+if [ -z "$dirlist" ] ; then
+  case "`uname 2>/dev/null`" in
+    CYGWIN*)
+      # Cygwin: try current system partition.
+      dirlist="$SYSTEMDRIVE" ;;
+    *)
+      # Other: do nothing to avoid collision with os-prober.
+      exit 0 ;;
+  esac
+fi
+
+# Test for a file, case-insensitive.
+test_nocase ()
+{
+  local p=""
+  if [ "$1" = "-p" ] ; then
+    p=t ; shift
+  fi
+  local f=`ls -1 "$1" 2>/dev/null | grep -i '^'"$2"'$' | sed 1q`
+  test -n "$f" || return 1
+  test -z "$p" || echo "$1/$f"
+}
+
+# Get OS name from boot.ini.
+get_os_name_from_boot_ini ()
+{
+  local ini=`test_nocase -p "$1" boot.ini` || return 1
+
+  # Fail if no or more than one partition.
+  test "`sed -n 's,^\(\(multi\|scsi\)[^=]*\)=.*$,\1,p' "$ini" 2>/dev/null | \
+    sort | uniq | wc -l`" = 1 || return 1
+
+  # Search 'default=PARTITION'
+  local part=`sed -n 's,^default=,,p' "$ini" | sed 's,\\\\,/,g;s,[ 
\t\r]*$,,;1q'`
+  test -n "$part" || return 1
+
+  # Search 'PARTITION="NAME" ...'
+  local name=`sed -n 's,\\\\,/,g;s,^'"$part"'="\([^"]*\)".*$,\1,p' "$ini" | 
sed 1q`
+  test -n "$name" || return 1
+
+  echo "$name"
+}
+
+
+for dir in $dirlist ; do
+
+  # Check for Vista Bootmgr.
+  if test_nocase "$dir" bootmgr && bootdir=`test_nocase -p "$dir" boot` &&
+     test_nocase "$bootdir" bcd ; then
+    OS="Windows Vista bootmgr"
+
+  # Check for NTLDR.
+  elif test_nocase "$dir" ntldr && test_nocase "$dir" ntdetect.com ; then
+    OS=`get_os_name_from_boot_ini "$dir"` || OS="Windows NT/2000/XP loader"
+
+  else
+    continue
+  fi
+
+  # Get boot /dev/ice.
+  dev=`${grub_probe} -t device "$dir" 2>/dev/null` || continue
+
+  echo "Found $OS on $dir ($dev)" >&2
+  cat << EOF
+menuentry "$OS" {
+EOF
+
+  prepare_grub_to_access_device "$dev" | sed 's,^,\t,'
+
+  cat << EOF
+       chainloader +1
+}
+EOF
+done
+
diff --git a/util/update-grub.in b/util/update-grub.in
index 8c60c41..eafaa91 100644
--- a/util/update-grub.in
+++ b/util/update-grub.in
@@ -163,7 +163,7 @@ esac
 export GRUB_DEVICE GRUB_DEVICE_UUID GRUB_DEVICE_BOOT GRUB_DEVICE_BOOT_UUID 
GRUB_FS GRUB_FONT_PATH GRUB_PRELOAD_MODULES
 
 # These are optional, user-defined variables.
-export GRUB_DEFAULT GRUB_TIMEOUT GRUB_DISTRIBUTOR GRUB_CMDLINE_LINUX 
GRUB_CMDLINE_LINUX_DEFAULT GRUB_TERMINAL GRUB_SERIAL_COMMAND 
GRUB_DISABLE_LINUX_UUID
+export GRUB_DEFAULT GRUB_TIMEOUT GRUB_DISTRIBUTOR GRUB_CMDLINE_LINUX 
GRUB_CMDLINE_LINUX_DEFAULT GRUB_TERMINAL GRUB_SERIAL_COMMAND 
GRUB_DISABLE_LINUX_UUID GRUB_WINDOWS_DIRS
 
 rm -f ${grub_cfg}.new
 exec > ${grub_cfg}.new

reply via email to

[Prev in Thread] Current Thread [Next in Thread]