aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libzfs
diff options
context:
space:
mode:
authorGunnar Beutner <[email protected]>2011-07-02 21:34:05 +0200
committerBrian Behlendorf <[email protected]>2011-07-06 09:20:28 -0700
commit46e18b3f0fc13aa0859d0fef7dc829db20491ab6 (patch)
treef9815556b8493b9c9a6266a4428d74ba546b999d /lib/libzfs
parentdc2a4a9136ab5f6e56f9ca8581ec1535adce6c36 (diff)
Implemented sharing datasets via NFS using libshare.
The sharenfs and sharesmb properties depend on the libshare library to export datasets via NFS and SMB. This commit implements the base libshare functionality as well as support for managing NFS shares. Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'lib/libzfs')
-rw-r--r--lib/libzfs/libzfs_mount.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/lib/libzfs/libzfs_mount.c b/lib/libzfs/libzfs_mount.c
index 6b70cbbec..7b9cd8078 100644
--- a/lib/libzfs/libzfs_mount.c
+++ b/lib/libzfs/libzfs_mount.c
@@ -117,21 +117,20 @@ zfs_share_proto_t share_all_proto[] = {
};
/*
- * Search for NFS and SMB exports for the given mountpoint and protocol, returning
+ * Search the sharetab for the given mountpoint and protocol, returning
* a zfs_share_type_t value.
*/
static zfs_share_type_t
is_shared(libzfs_handle_t *hdl, const char *mountpoint, zfs_share_proto_t proto)
{
char buf[MAXPATHLEN], *tab;
+ char *ptr;
if (hdl->libzfs_sharetab == NULL)
return (SHARED_NOT_SHARED);
(void) fseek(hdl->libzfs_sharetab, 0, SEEK_SET);
- /* Search /etc/exports for NFS exports */
- /* FIXME: Assumes the file is tab delimited. */
while (fgets(buf, sizeof (buf), hdl->libzfs_sharetab) != NULL) {
/* the mountpoint is the first entry on each line */
@@ -140,15 +139,31 @@ is_shared(libzfs_handle_t *hdl, const char *mountpoint, zfs_share_proto_t proto)
*tab = '\0';
if (strcmp(buf, mountpoint) == 0) {
- if (proto == PROTO_NFS)
- return (SHARED_NFS);
- else
- return (SHARED_NOT_SHARED);
+ /*
+ * the protocol field is the third field
+ * skip over second field
+ */
+ ptr = ++tab;
+ if ((tab = strchr(ptr, '\t')) == NULL)
+ continue;
+ ptr = ++tab;
+ if ((tab = strchr(ptr, '\t')) == NULL)
+ continue;
+ *tab = '\0';
+ if (strcmp(ptr,
+ proto_table[proto].p_name) == 0) {
+ switch (proto) {
+ case PROTO_NFS:
+ return (SHARED_NFS);
+ case PROTO_SMB:
+ return (SHARED_SMB);
+ default:
+ return (0);
+ }
+ }
}
}
- /* XXX: Search /etc/samba/smb.conf for SMB exports, return SHARED_SMB */
-
return (SHARED_NOT_SHARED);
}
@@ -665,12 +680,12 @@ _zfs_init_libshare(void)
char path[MAXPATHLEN];
char isa[MAXISALEN];
-#if defined(_LP64)
+/*#if defined(_LP64)
if (sysinfo(SI_ARCHITECTURE_64, isa, MAXISALEN) == -1)
isa[0] = '\0';
-#else
+#else*/
isa[0] = '\0';
-#endif
+/*#endif*/
(void) snprintf(path, MAXPATHLEN,
"/usr/lib/%s/libshare.so.1", isa);
@@ -854,14 +869,11 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
return (0);
if ((ret = zfs_init_libshare(hdl, SA_INIT_SHARE_API)) != SA_OK) {
-#ifdef HAVE_SHARE
(void) zfs_error_fmt(hdl, EZFS_SHARENFSFAILED,
dgettext(TEXT_DOMAIN, "cannot share '%s': %s"),
zfs_get_name(zhp), _sa_errorstr != NULL ?
_sa_errorstr(ret) : "");
return (-1);
-#endif /* HAVE_SHARE */
- return (0);
}
for (curr_proto = proto; *curr_proto != PROTO_END; curr_proto++) {