Hi!

Please consider:

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.

-- 
Robert Millan
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%"`
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to