From 1cbb58ac6274c3fedde6914a4319a8f13f903ffb Mon Sep 17 00:00:00 2001 From: chrfranke Date: Wed, 6 Aug 2008 18:45:51 +0000 Subject: [PATCH] 2008-08-06 Christian Franke * conf/common.rmk: Build and install `10_windows'. * util/grub.d/10_windows.in: New script. --- .cvsignore | 1 + ChangeLog | 5 +++ conf/common.mk | 2 +- conf/common.rmk | 2 +- util/grub.d/10_windows.in | 83 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 util/grub.d/10_windows.in diff --git a/.cvsignore b/.cvsignore index 0742a73af..fdb992098 100644 --- a/.cvsignore +++ b/.cvsignore @@ -7,6 +7,7 @@ 00_header 10_hurd 10_linux +10_windows 30_os-prober 40_custom Makefile diff --git a/ChangeLog b/ChangeLog index 117dcf16e..d230805f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-08-06 Christian Franke + + * conf/common.rmk: Build and install `10_windows'. + * util/grub.d/10_windows.in: New script. + 2008-08-06 Pavel Roskin * kern/i386/pit.c: Include `'. diff --git a/conf/common.mk b/conf/common.mk index 4a8b72cff..e287542d4 100644 --- a/conf/common.mk +++ b/conf/common.mk @@ -493,7 +493,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/conf/common.rmk b/conf/common.rmk index 3d3cd8aec..3d674a68c 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 000000000..e8f3c3e14 --- /dev/null +++ b/util/grub.d/10_windows.in @@ -0,0 +1,83 @@ +#! /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 . + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +. ${libdir}/grub/update-grub_lib + +case "`uname 2>/dev/null`" in + CYGWIN*) ;; + *) exit 0 ;; +esac + +# Try C: even if current system is on other partition. +case "$SYSTEMDRIVE" in + [Cc]:) dirlist="C:" ;; + [D-Zd-z]:) dirlist="C: $SYSTEMDRIVE" ;; + *) exit 0 ;; +esac + +get_os_name_from_boot_ini () +{ + # Fail if no or more than one partition. + test "`sed -n 's,^\(\(multi\|scsi\)[^=]*\)=.*$,\1,p' "$1" 2>/dev/null | \ + sort | uniq | wc -l`" = 1 || return 1 + + # Search 'default=PARTITION' + local part=`sed -n 's,^default=,,p' "$1" | 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' "$1" | sed 1q` + test -n "$name" || return 1 + + echo "$name" +} + + +for dir in $dirlist ; do + + # Check for Vista bootmgr. + if [ -f "$dir"/bootmgr -a -f "$dir"/boot/bcd ] ; then + OS="Windows Vista bootmgr" + + # Check for NTLDR. + elif [ -f "$dir"/ntldr -a -f "$dir"/ntdetect.com -a -f "$dir"/boot.ini ] ; then + OS=`get_os_name_from_boot_ini "$dir"/boot.ini` || 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 +