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

Reply via email to