Mercurial > illumos > illumos-gate
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));