2006-04-20 Robert Millan 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%"`