Add linux user util support
[zfs.git] / lib / libzfs / libzfs_util.c
index 8277bdb..3c4fae5 100644 (file)
@@ -36,6 +36,7 @@
 #include <unistd.h>
 #include <ctype.h>
 #include <math.h>
+#include <sys/stat.h>
 #include <sys/mnttab.h>
 #include <sys/mntent.h>
 #include <sys/types.h>
@@ -613,11 +614,22 @@ libzfs_init(void)
        }
 
        if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
+               (void) fprintf(stderr, gettext("Unable to open %s: %s.\n"),
+                              ZFS_DEV, strerror(errno));
+               if (errno == ENOENT)
+                       (void) fprintf(stderr,
+                            gettext("Verify the ZFS module stack is "
+                            "loaded by running '/sbin/modprobe zfs'.\n"));
+
                free(hdl);
                return (NULL);
        }
 
+#ifdef HAVE_SETMNTENT
+       if ((hdl->libzfs_mnttab = setmntent(MNTTAB, "r")) == NULL) {
+#else
        if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
+#endif
                (void) close(hdl->libzfs_fd);
                free(hdl);
                return (NULL);
@@ -637,10 +649,16 @@ libzfs_fini(libzfs_handle_t *hdl)
 {
        (void) close(hdl->libzfs_fd);
        if (hdl->libzfs_mnttab)
+#ifdef HAVE_SETMNTENT
+               (void) endmntent(hdl->libzfs_mnttab);
+#else
                (void) fclose(hdl->libzfs_mnttab);
+#endif
        if (hdl->libzfs_sharetab)
                (void) fclose(hdl->libzfs_sharetab);
+#ifdef HAVE_ZPL
        zfs_uninit_libshare(hdl);
+#endif
        if (hdl->libzfs_log_str)
                (void) free(hdl->libzfs_log_str);
        zpool_free_handles(hdl);