Package: grub
Version: 0.97-7.1+kbsd
Severity: normal
Tags: patch

Hi,

Here are a few GNU/kFreeBSD fixes.  The Debian-specific ones are in debian.diff,
the ones in kfreebsd.diff have been sent to upstream already (not committed
ATTOW).

-- System Information:
Debian Release: testing/unstable
Architecture: kfreebsd-i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: GNU/kFreeBSD 5.4-1-486
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ANSI_X3.4-1968) (ignored: LC_ALL 
set to C)

Versions of packages grub depends on:
ii  debconf                       1.4.72     Debian configuration management sy
ii  libc0.1                       2.3.6-7    GNU C Library: Shared libraries
ii  libncurses5                   5.5-1+kbsd Shared libraries for terminal hand

grub recommends no packages.

-- debconf information excluded
diff -ur grub-0.97.old/debian/README.Debian grub-0.97/debian/README.Debian
--- grub-0.97.old/debian/README.Debian  2006-04-20 12:28:18.000000000 +0200
+++ grub-0.97/debian/README.Debian      2006-04-20 12:30:36.000000000 +0200
@@ -28,11 +28,11 @@
 
 after installing the package:
 
-1) grub-install /dev/hda
+1) grub-install "(hd0)"
    or if /boot is a separate partition
-   grub-install --root-directory=/boot /dev/hda
+   grub-install --root-directory=/boot "(hd0)"
 
-   using in place of /dev/hda the device that you boot from
+   using in place of "(hd0)" the device that you boot from
 
 2) update-grub which will create a menu.lst for you if one does not exist
    or manually create one, and skip to step 4
diff -ur grub-0.97.old/debian/update-grub grub-0.97/debian/update-grub
--- grub-0.97.old/debian/update-grub    2006-04-20 12:28:18.000000000 +0200
+++ grub-0.97/debian/update-grub        2006-04-20 14:03:43.000000000 +0200
@@ -26,6 +26,8 @@
 # Abort on errors
 set -e
 
+host_os=`uname -s | tr '[A-Z]' '[a-z]'`
+
 abort() {
        message=$@
 
@@ -173,8 +175,8 @@
                tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
                tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;;
     freebsd|*/kfreebsd)
-               tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%r\1%' \
-                           | sed 's%r\{0,1\}\(da[0-9]*\).*$%r\1%'`
+               tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%\1%' \
+                           | sed 's%r\{0,1\}\(da[0-9]*\).*$%\1%'`
                tmp_part=`echo "$1" \
                        | sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \
                        | sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"`
@@ -292,7 +294,7 @@
 kopt="root=$root_device ro"
 
 # Title
-title="Debian GNU/Linux"
+title="Debian GNU/`uname -s | sed -e s,GNU/,,g`"
 
 # should update-grub remember the default entry
 updatedefaultentry="false"
@@ -586,7 +588,10 @@
        initrd=$8
        savedefault=$9
 
-       echo -n "title          $title, kernel $kernel_version" >> $buffer
+       echo -n "title          $title" >> $buffer
+       if [ -n "$kernel_version" ]; then
+               echo -n ", kernel $kernel_version" >> $buffer
+       fi
        if [ -n "$recovery_desc" ]; then
                echo -n " $recovery_desc" >> $buffer
        fi
@@ -598,7 +603,10 @@
        fi
 
        echo "root              $grub_root_device" >> $buffer
-       echo -n "kernel         $kernel $kernel_options"  >> $buffer
+       echo -n "kernel         $kernel"  >> $buffer
+       if [ -n "$kernel_options" ]; then
+               echo -n " $kernel_options"  >> $buffer
+       fi
        if [ -n "$recovery_desc" ]; then
                echo -n " $recovery_suffix"  >> $buffer
        fi
@@ -851,6 +859,17 @@
                notChangeDefault="yes"
 fi
 
+case "$host_os" in
+  freebsd|*/kfreebsd)
+    if test -e /boot/loader.gz ; then
+      kernel=/boot/loader.gz
+    else
+      kernel=/boot/loader
+    fi
+    write_kernel_entry "" "" "" "$grub_root_device" "$kernel" "" "" "" "true"
+  ;;
+esac
+
 ## heres where we start writing out the kernel entries
 counter=0
 for kern in $sortedKernels ; do
2006-04-20  Robert Millan  <[EMAIL PROTECTED]>

	Fixes for kernel of FreeBSD:
	* grub/asmstub.c (get_diskinfo): Toggle "kern.geom.debugflags" sysctl
	before opening a device for writing.
	* util/grub-install.in: Devices don't have this "r" prefix anymore.

Index: grub/asmstub.c
===================================================================
RCS file: /sources/grub/grub/grub/asmstub.c,v
retrieving revision 1.84
diff -u -r1.84 asmstub.c
--- grub/asmstub.c	16 Feb 2005 20:45:48 -0000	1.84
+++ grub/asmstub.c	20 Apr 2006 12:10:51 -0000
@@ -777,7 +777,34 @@
 
       /* Open read/write, or read-only if that failed. */
       if (! read_only)
-	disks[drive].flags = open (devname, O_RDWR);
+	{
+/* By default, kernel of FreeBSD does not allow overwriting MBR */
+#ifdef __FreeBSD_kernel__
+#define GEOM_SYSCTL	"kern.geom.debugflags"
+	  int old_flags, flags;
+	  size_t sizeof_int = sizeof (int);
+
+	  if (sysctlbyname (GEOM_SYSCTL, &old_flags, &sizeof_int, NULL, 0) != 0)
+	    grub_printf ("failed to get " GEOM_SYSCTL "sysctl: %s\n", strerror (errno));
+
+	  if ((old_flags & 0x10) == 0)
+	    {
+	      /* "allow foot shooting", see geom(4) */
+	      flags = old_flags | 0x10;
+
+	      if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &flags, sizeof (int)) != 0)
+	        grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n", strerror (errno));
+	    }
+#endif
+	  disks[drive].flags = open (devname, O_RDWR);
+#ifdef __FreeBSD_kernel__
+	  if (flags != old_flags)
+	    {
+	      if (sysctlbyname (GEOM_SYSCTL, NULL, NULL, &old_flags, sizeof (int)) != 0)
+	        grub_printf ("failed to set " GEOM_SYSCTL "sysctl: %s\n", strerror (errno));
+	    }
+#endif
+	}
 
       if (disks[drive].flags == -1)
 	{
Index: util/grub-install.in
===================================================================
RCS file: /sources/grub/grub/util/grub-install.in,v
retrieving revision 1.48
diff -u -r1.48 grub-install.in
--- util/grub-install.in	20 Jul 2004 19:30:24 -0000	1.48
+++ util/grub-install.in	20 Apr 2006 12:10:51 -0000
@@ -112,8 +112,8 @@
 	tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
 	tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;;
     freebsd* | kfreebsd*-gnu)
-	tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%r\1%' \
-			    | sed 's%r\{0,1\}\(da[0-9]*\).*$%r\1%'`
+	tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%\1%' \
+			    | sed 's%r\{0,1\}\(da[0-9]*\).*$%\1%'`
 	tmp_part=`echo "$1" \
 	    | sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \
        	    | sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"`

Reply via email to