--- /dev/null
+dnl #
+dnl # Check for ZFS support in libblkid. This test needs to check
+dnl # more than if the library exists because we expect there are
+dnl # at least 3 flavors of the library out in the wild:
+dnl #
+dnl # 1) blkid which has no ZFS support
+dnl # 2) blkid with ZFS support and a flawed method of probing
+dnl # 3) blkid with ZFS support and a working method of probing
+dnl #
+dnl # To handle this the check first validates that there is a version
+dnl # of the library installed. If there is it creates a simulated
+dnl # ZFS filesystem and then links a small test app which attempts
+dnl # to detect the simualated filesystem type. If it correctly
+dnl # identifies the filesystem as ZFS we can safely assume case 3).
+dnl # Otherwise we disable blkid support and resort to manual probing.
+dnl #
+AC_DEFUN([ZFS_AC_CONFIG_USER_LIBBLKID], [
+ AC_ARG_WITH([blkid],
+ [AS_HELP_STRING([--with-blkid],
+ [support blkid caching @<:@default=check@:>@])],
+ [],
+ [with_blkid=check])
+
+ LIBBLKID=
+ AS_IF([test "x$with_blkid" != xno],
+ [
+ AC_CHECK_LIB([blkid], [blkid_get_cache],
+ [
+ AC_MSG_CHECKING([for blkid zfs support])
+
+ ZFS_DEV=`mktemp`
+ dd if=/dev/zero of=$ZFS_DEV bs=1024k count=8 \
+ >/dev/null 2>/dev/null
+ echo -en "\x0c\xb1\xba\0\0\0\0\0" | \
+ dd of=$ZFS_DEV bs=1k count=8 \
+ seek=132 conv=notrunc &>/dev/null \
+ >/dev/null 2>/dev/null
+
+ saved_LDFLAGS="$LDFLAGS"
+ LDFLAGS="-lblkid"
+
+ AC_RUN_IFELSE(AC_LANG_PROGRAM(
+ [
+ #include <stdio.h>
+ #include <blkid/blkid.h>
+ ],
+ [
+ blkid_cache cache;
+ char *value;
+
+ if (blkid_get_cache(&cache, NULL) < 0)
+ return 1;
+
+ value = blkid_get_tag_value(cache, "TYPE",
+ "$ZFS_DEV");
+ if (!value) {
+ blkid_put_cache(cache);
+ return 2;
+ }
+
+ if (strcmp(value, "zfs")) {
+ free(value);
+ blkid_put_cache(cache);
+ return 3;
+ }
+
+ free(value);
+ blkid_put_cache(cache);
+ ]),
+ [
+ rm -f $ZFS_DEV
+ AC_MSG_RESULT([yes])
+ AC_SUBST([LIBBLKID], ["-lblkid"])
+ AC_DEFINE([HAVE_LIBBLKID], 1,
+ [Define if you have libblkid])
+ ],
+ [
+ rm -f $ZFS_DEV
+ AC_MSG_RESULT([no])
+ AS_IF([test "x$with_blkid" != xcheck],
+ [AC_MSG_FAILURE(
+ [--with-blkid given but unavailable])])
+ ])
+
+ LDFLAGS="$saved_LDFLAGS"
+ ],
+ [
+ AS_IF([test "x$with_blkid" != xcheck],
+ [AC_MSG_FAILURE(
+ [--with-blkid given but unavailable])])
+ ]
+ [])
+ ])
+])