--- ext4_utils/ext4_utils.c.orig	2012-12-18 23:27:26 UTC
+++ ext4_utils/ext4_utils.c
@@ -36,8 +36,16 @@
 
 #if defined(__linux__)
 #include <linux/fs.h>
-#elif defined(__APPLE__) && defined(__MACH__)
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
+  || (defined(__APPLE__) && defined(__MACH__))
 #include <sys/disk.h>
+#elif defined(__sun)
+#include <sys/dkio.h>
+#elif defined(__Bitrig__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#include <sys/disklabel.h>
+#include <sys/dkio.h>
+#elif defined(__DragonFly__)
+#include <sys/diskslice.h>
 #endif
 
 #include "ext4.h"
@@ -53,6 +61,8 @@ struct sparse_file *ext4_sparse_file;
 jmp_buf setjmp_env;
 
 /* Definition from RFC-4122 */
+/* XXX <sys/uuid.h> defines slightly different |struct uuid| */
+#define uuid ext4_uuid
 struct uuid {
     u32 time_low;
     u16 time_mid;
@@ -383,10 +391,24 @@ static u64 get_block_device_size(int fd)
 	u64 size = 0;
 	int ret;
 
-#if defined(__linux__)
+#if defined(BLKGETSIZE64)
 	ret = ioctl(fd, BLKGETSIZE64, &size);
-#elif defined(__APPLE__) && defined(__MACH__)
+#elif defined(DKIOCGETBLOCKCOUNT)
 	ret = ioctl(fd, DKIOCGETBLOCKCOUNT, &size);
+#elif defined(DIOCGMEDIASIZE)
+	ret = ioctl(fd, DIOCGMEDIASIZE, &size);
+#elif defined(DKIOCGMEDIAINFO)
+	struct dk_minfo minfo;
+	ret = ioctl(fd, DKIOCGMEDIAINFO, &minfo);
+	size = minfo.dki_lbsize * minfo.dki_capacity;
+#elif defined(DIOCGDINFO)
+	struct disklabel dl;
+	ret = ioctl(fd, DIOCGDINFO, &dl);
+	size = dl.d_secsize * dl.d_nsectors * dl.d_ntracks * dl.d_ncylinders;
+#elif defined(DIOCGPART)
+	struct partinfo pi;
+	ret = ioctl(fd, DIOCGPART, &pi);
+	size = pi.media_size;
 #else
 	close(fd);
 	return 0;