Hi!
I made a patch with some *BSD related fixes:
- Add compatibility for non-BSD systems using *BSD kernels (such as
GNU/FreeBSD). These don't define __*BSD__, but do define __*BSD_kernel__,
so i added compatibility defines in lib/device.c and then switch
from __*BSD__ to __*BSD_kernel__ (see the patch, it's self-explanatory)
- Devices for FreeBSD's kernel are outdated. Recent 5.x versions don't
add a "r" prefix to the device name, so it is now "fd%d", "ad%d", etc.
I'm adding a detection for __FreeBSD_kernel__'s version number.
My patch differed against pristine sources would conflict with my dynamic
allocation one sent a while ago, so I'm differing against my patched version.
You need to apply my previous patch [1] before this one. If this is a problem
tell me and i'll adapt my changes.
[1] http://mail.gnu.org/archive/html/bug-grub/2003-07/msg00055.html
--
Robert Millan
diff -ur grub.old/lib/device.c grub/lib/device.c
--- grub.old/lib/device.c 2003-07-22 05:40:40.000000000 +0200
+++ grub/lib/device.c 2003-07-22 05:52:46.000000000 +0200
@@ -35,6 +35,15 @@
#include <errno.h>
#include <limits.h>
+/* compatibility for non-BSD systems using *BSD kernels */
+#if defined(__FreeBSD__) && !defined(__FreeBSD_kernel__)
+# define __FreeBSD_kernel__ __FreeBSD__
+#elif defined(__NetBSD__) && !defined(__NetBSD_kernel__)
+# define __NetBSD_kernel__ __NetBSD__
+#elif defined(__OpenBSD__) && !defined(__OpenBSD_kernel__)
+# define __OpenBSD_kernel__ __OpenBSD__
+#endif
+
#ifdef __linux__
# if !defined(__GLIBC__) || \
((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))
@@ -71,11 +80,11 @@
# endif /* ! BLKGETSIZE */
#endif /* __linux__ */
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#if defined(__FreeBSD_kernel__) || defined(__NetBSD_kernel__) ||
defined(__OpenBSD_kernel__)
# include <sys/ioctl.h> /* ioctl */
# include <sys/disklabel.h>
# include <sys/cdio.h> /* CDIOCCLRDEBUG */
-#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
+#endif /* __FreeBSD_kernel__ || __NetBSD_kernel__ || __OpenBSD_kernel__ */
#ifdef HAVE_OPENDISK
# include <util.h>
@@ -116,8 +125,8 @@
return;
}
-#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
- /* FreeBSD, NetBSD or OpenBSD */
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD_kernel__) ||
defined(__OpenBSD_kernel__)
+ /* kernel of FreeBSD, NetBSD or OpenBSD */
{
struct disklabel hdg;
if (ioctl (fd, DIOCGDINFO, &hdg))
@@ -199,15 +208,19 @@
#elif defined(__GNU__)
/* GNU/Hurd */
asprintf (&name, "/dev/fd%d", unit);
-#elif defined(__FreeBSD__)
- /* FreeBSD */
+#elif defined(__FreeBSD_kernel__)
+ /* kernel of FreeBSD */
+# if __FreeBSD_kernel__ >= 5
+ asprintf (&name, "/dev/fd%d", unit);
+# else /* __FreeBSD_kernel__ <= 4 */
asprintf (&name, "/dev/rfd%d", unit);
-#elif defined(__NetBSD__)
- /* NetBSD */
+# endif /* __FreeBSD_kernel__ <= 4 */
+#elif defined(__NetBSD_kernel__)
+ /* kernel of NetBSD */
/* opendisk() doesn't work for floppies. */
asprintf (&name, "/dev/rfd%da", unit);
-#elif defined(__OpenBSD__)
- /* OpenBSD */
+#elif defined(__OpenBSD_kernel__)
+ /* kernel of OpenBSD */
asprintf (&name, "/dev/rfd%dc", unit);
#elif defined(__QNXNTO__)
/* QNX RTP */
@@ -230,15 +243,17 @@
#elif defined(__GNU__)
/* GNU/Hurd */
asprintf (&name, "/dev/hd%d", unit);
-#elif defined(__FreeBSD__)
- /* FreeBSD */
-# if __FreeBSD__ >= 4
+#elif defined(__FreeBSD_kernel__)
+ /* kernel of FreeBSD */
+# if __FreeBSD_kernel__ >= 5
+ asprintf (&name, "/dev/ad%d", unit);
+# elif __FreeBSD_kernel__ >= 4
asprintf (&name, "/dev/rad%d", unit);
-# else /* __FreeBSD__ <= 3 */
+# else /* __FreeBSD_kernel__ <= 3 */
asprintf (&name, "/dev/rwd%d", unit);
-# endif /* __FreeBSD__ <= 3 */
-#elif defined(__NetBSD__) && defined(HAVE_OPENDISK)
- /* NetBSD */
+# endif /* __FreeBSD_kernel__ <= 3 */
+#elif defined(__NetBSD_kernel__) && defined(HAVE_OPENDISK)
+ /* kernel of NetBSD */
char shortname[16];
int fd;
name = malloc (16); // FIXME: can opendisk deal with dynamic buffers?
@@ -249,8 +264,8 @@
0 /* char device */
);
close (fd);
-#elif defined(__OpenBSD__)
- /* OpenBSD */
+#elif defined(__OpenBSD_kernel__)
+ /* kernel of OpenBSD */
asprintf (&name, "/dev/rwd%dc", unit);
#elif defined(__QNXNTO__)
/* QNX RTP */
@@ -275,11 +290,15 @@
#elif defined(__GNU__)
/* GNU/Hurd */
asprintf (&name, "/dev/sd%d", unit);
-#elif defined(__FreeBSD__)
- /* FreeBSD */
+#elif defined(__FreeBSD_kernel__)
+ /* kernel of FreeBSD */
+# if __FreeBSD_kernel__ >= 5
+ asprintf (&name, "/dev/da%d", unit);
+# else /* __FreeBSD_kernel__ <= 4 */
asprintf (&name, "/dev/rda%d", unit);
-#elif defined(__NetBSD__) && defined(HAVE_OPENDISK)
- /* NetBSD */
+# endif /* __FreeBSD_kernel__ <= 4 */
+#elif defined(__NetBSD_kernel__) && defined(HAVE_OPENDISK)
+ /* kernel of NetBSD */
char shortname[16];
int fd;
name = malloc (16); // FIXME: can opendisk deal with dynamic buffers?
@@ -290,8 +309,8 @@
0 /* char device */
);
close (fd);
-#elif defined(__OpenBSD__)
- /* OpenBSD */
+#elif defined(__OpenBSD_kernel__)
+ /* kernel of OpenBSD */
asprintf (&name, "/dev/rsd%dc", unit);
#elif defined(__QNXNTO__)
/* QNX RTP */
@@ -378,12 +397,12 @@
# endif /* ! CDROM_GET_CAPABILITY */
#endif /* __linux__ */
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#if defined(__FreeBSD_kernel__) || defined(__NetBSD_kernel__) ||
defined(__OpenBSD_kernel__)
# ifdef CDIOCCLRDEBUG
if (ioctl (fileno (fp), CDIOCCLRDEBUG, 0) >= 0)
return 0;
# endif /* CDIOCCLRDEBUG */
-#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
+#endif /* __FreeBSD_kernel__ || __NetBSD_kernel__ || __OpenBSD_kernel__ */
/* Attempt to read the first sector. */
if (fread (buf, 1, 512, fp) != 512)
_______________________________________________
Bug-grub mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-grub