]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Fixes for kernel of FreeBSD:
authorrobertmh <robertmh@localhost>
Thu, 20 Apr 2006 13:46:46 +0000 (13:46 +0000)
committerrobertmh <robertmh@localhost>
Thu, 20 Apr 2006 13:46:46 +0000 (13:46 +0000)
        * 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.

ChangeLog
grub/asmstub.c
util/grub-install.in

index d61cabc9b1b3709679ce7c5768e2a6b08e2535bf..c7eedd910c7b271a738a81ee2e15a08b477e90f2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-04-20  Robert Millan  <robertmh@gnu.org>
+
+       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.
+
 2006-04-16  Yoshinori K. Okuji  <okuji@enbug.org>
 
        * docs/multiboot.texi: Correct the offset of address
index ab95b4b6f3911232809a51c78d11d26ff82cb202..0ded179cafa8c1f3cdbb9177283c27a9fb37cb31 100644 (file)
@@ -55,6 +55,10 @@ int grub_stage2 (void);
 # endif /* ! BLKFLSBUF */
 #endif /* __linux__ */
 
+#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
+# include <sys/sysctl.h>
+#endif
+
 /* We want to prevent any circularararity in our stubs, as well as
    libc name clashes. */
 #define WITHOUT_LIBC_STUBS 1
@@ -777,7 +781,34 @@ get_diskinfo (int drive, struct geometry *geometry)
 
       /* 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 */
+#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
+#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);
+#if defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
+         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 2e598b05f5b79259c699610b659ad09b35641fba..39d6cb0f38dd6bd789e6df25af1f9d09d0999322 100644 (file)
@@ -112,8 +112,8 @@ convert () {
        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%"`