changeset 3134:59cd24b2b5d6

6494840 libzfs should dlopen libiscsitgt rather than linking to it
author ahl
date Fri, 17 Nov 2006 12:07:41 -0800
parents 63b5e3581eee
children 286b0dd13054
files usr/src/lib/libzfs/Makefile.com usr/src/lib/libzfs/common/libzfs_mount.c
diffstat 2 files changed, 31 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/lib/libzfs/Makefile.com	Fri Nov 17 11:05:03 2006 -0800
+++ b/usr/src/lib/libzfs/Makefile.com	Fri Nov 17 12:07:41 2006 -0800
@@ -49,7 +49,7 @@
 
 C99MODE=	-xc99=%all
 C99LMODE=	-Xc99=%all
-LDLIBS +=	-lc -lm -ldevinfo -ldevid -lgen -lnvpair -luutil -liscsitgt
+LDLIBS +=	-lc -lm -ldevinfo -ldevid -lgen -lnvpair -luutil
 CPPFLAGS +=	$(INCS) -D_REENTRANT
 
 SRCS=	$(OBJS_COMMON:%.o=$(SRCDIR)/%.c)	\
--- a/usr/src/lib/libzfs/common/libzfs_mount.c	Fri Nov 17 11:05:03 2006 -0800
+++ b/usr/src/lib/libzfs/common/libzfs_mount.c	Fri Nov 17 12:07:41 2006 -0800
@@ -60,10 +60,10 @@
  */
 
 #include <dirent.h>
+#include <dlfcn.h>
 #include <errno.h>
 #include <libgen.h>
 #include <libintl.h>
-#include <libiscsitgt.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <strings.h>
@@ -78,6 +78,30 @@
 
 #include "libzfs_impl.h"
 
+static int (*iscsitgt_zfs_share)(const char *);
+static int (*iscsitgt_zfs_unshare)(const char *);
+static int (*iscsitgt_zfs_is_shared)(const char *);
+
+#pragma init(zfs_iscsi_init)
+static void
+zfs_iscsi_init(void)
+{
+	void *libiscsitgt;
+
+	if ((libiscsitgt = dlopen("/lib/libiscsitgt.so.1",
+	    RTLD_LAZY | RTLD_GLOBAL)) == NULL ||
+	    (iscsitgt_zfs_share = (int (*)(const char *))dlsym(libiscsitgt,
+	    "iscsitgt_zfs_share")) == NULL ||
+	    (iscsitgt_zfs_unshare = (int (*)(const char *))dlsym(libiscsitgt,
+	    "iscsitgt_zfs_unshare")) == NULL ||
+	    (iscsitgt_zfs_is_shared = (int (*)(const char *))dlsym(libiscsitgt,
+	    "iscsitgt_zfs_is_shared")) == NULL) {
+		iscsitgt_zfs_share = NULL;
+		iscsitgt_zfs_unshare = NULL;
+		iscsitgt_zfs_is_shared = NULL;
+	}
+}
+
 /*
  * Search the sharetab for the given mountpoint, returning true if it is found.
  */
@@ -578,7 +602,8 @@
 boolean_t
 zfs_is_shared_iscsi(zfs_handle_t *zhp)
 {
-	return (iscsitgt_zfs_is_shared(zhp->zfs_name) != 0);
+	return (iscsitgt_zfs_is_shared != NULL &&
+	    iscsitgt_zfs_is_shared(zhp->zfs_name) != 0);
 }
 
 int
@@ -596,7 +621,7 @@
 	    strcmp(shareopts, "off") == 0)
 		return (0);
 
-	if (iscsitgt_zfs_share(dataset) != 0)
+	if (iscsitgt_zfs_share == NULL || iscsitgt_zfs_share(dataset) != 0)
 		return (zfs_error(hdl, EZFS_SHAREISCSIFAILED,
 		    dgettext(TEXT_DOMAIN, "cannot share '%s'"), dataset));
 
@@ -613,7 +638,8 @@
 	 * If this fails with ENODEV it indicates that zvol wasn't shared so
 	 * we should return success in that case.
 	 */
-	if (iscsitgt_zfs_unshare(dataset) != 0 && errno != ENODEV)
+	if (iscsitgt_zfs_unshare == NULL ||
+	    (iscsitgt_zfs_unshare(dataset) != 0 && errno != ENODEV))
 		return (zfs_error(hdl, EZFS_UNSHAREISCSIFAILED,
 		    dgettext(TEXT_DOMAIN, "cannot unshare '%s'"), dataset));