2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A/*
2N/A * basic declarations for implementation of the share management
2N/A * libraries.
2N/A */
2N/A
2N/A#ifndef _LIBSHARE_IMPL_H
2N/A#define _LIBSHARE_IMPL_H
2N/A
2N/A#include <dirent.h>
2N/A#include <libshare.h>
2N/A#include <sharefs/share.h>
2N/A#include <libscf.h>
2N/A
2N/A#ifdef __cplusplus
2N/Aextern "C" {
2N/A#endif
2N/A
2N/A#ifdef NDEBUG
2N/A#define sa_verify(x) ((void)(x))
2N/A#else
2N/A#define sa_verify(x) assert(x)
2N/A#endif
2N/A
2N/A#ifdef VERIFY
2N/A#undef VERIFY
2N/A#endif
2N/A#define VERIFY sa_verify
2N/A
2N/A#define SA_LIBSHARE_VERSION 200
2N/A
2N/A/* directory to find plugin modules in */
2N/A
2N/A#define SA_PLUGIN_ROOT_PROTO "/lib/share/proto"
2N/A#define SA_PLUGIN_ROOT_FS "/lib/share/fs"
2N/A#define SA_PLUGIN_ROOT_CACHE "/lib/share/cache"
2N/A
2N/A#define PLUGIN_LIB_PREFIX "libshare_"
2N/A
2N/A#define MAXISALEN 257 /* based on sysinfo(2) man page */
2N/A
2N/A#define MAX_MANGLE_NUMBER 10000
2N/A
2N/A/* SMF information for legacy shares */
2N/A
2N/A#define LEGACY_FMRI "svc:/network/shares"
2N/A#define LEGACY_PG "shares"
2N/A
2N/A/*
2N/A * handle used by share read routines
2N/A */
2N/Atypedef struct sa_read_hdl_s {
2N/A sa_proto_t srh_proto; /* protocol to find */
2N/A char *srh_mntpnt; /* active fs mntpnt */
2N/A FILE *srh_mnttab_fp; /* file pointer for mnttab */
2N/A void *srh_handle; /* fs-specific data pointer */
2N/A scf_iter_t *srh_smf_iter;
2N/A scf_value_t *srh_smf_value;
2N/A scf_property_t *srh_smf_prop;
2N/A scf_propertygroup_t *srh_smf_pg;
2N/A boolean_t srh_include_invalid_shares;
2N/A} sa_read_hdl_t;
2N/A
2N/A/*
2N/A * Conversions between sa_fs_t and plugin handle index
2N/A */
2N/A#define SAFS_INDEX(_safs) ((_safs) >= SA_FS_NOTFOUND ? -1 : (_safs) - 1)
2N/A#define SAFS_N (SA_FS_NOTFOUND - 1)
2N/A#define SAFS_TYPE(_i) \
2N/A ((_i) >= 0 && (_i) < SAFS_N ? (_i) + 1 : SA_FS_NOTFOUND)
2N/A
2N/A/*
2N/A * FS plugin flags
2N/A */
2N/A#define SAFS_CLOSE_NEEDED 0x1 /* FS handle initialized by plugin */
2N/A
2N/A/*
2N/A * Handle passed between libshare and the FS plugins.
2N/A */
2N/Astruct libshare_handle {
2N/A void *safs_plugin_handles[SAFS_N];
2N/A uint8_t safs_flags[SAFS_N];
2N/A};
2N/A
2N/A/*
2N/A * libshare plugin library types
2N/A */
2N/Atypedef enum {
2N/A SA_PLUGIN_FS = 0,
2N/A SA_PLUGIN_PROTO,
2N/A SA_PLUGIN_CACHE
2N/A} sa_plugin_type_t;
2N/A
2N/Atypedef enum {
2N/A SA_NOTIFY_OP_PUBLISH,
2N/A SA_NOTIFY_OP_UNPUBLISH
2N/A} sa_notify_op_t;
2N/A
2N/A/*
2N/A * nvlist tags
2N/A */
2N/A#define SA_PROTO_TAG_NFS "nfs"
2N/A#define SA_PROTO_TAG_SMB "smb"
2N/A#define SA_PROTO_TAG_ANY "any"
2N/A
2N/A/*
2N/A * plugin library common ops
2N/A */
2N/Atypedef struct {
2N/A sa_plugin_type_t pi_ptype; /* plugin type */
2N/A uint32_t pi_type; /* instance type */
2N/A char *pi_name; /* instance name */
2N/A uint32_t pi_version; /* plugin version */
2N/A uint32_t pi_flags; /* Informational flags */
2N/A int (*pi_init)(void);
2N/A void (*pi_fini)(void);
2N/A} sa_plugin_ops_t;
2N/A
2N/A/*
2N/A * Each plugin library is maintained in a list
2N/A * of sa_plugin_t structures. There is a list
2N/A * for each plugin type.
2N/A */
2N/Atypedef struct sa_plugin_s {
2N/A struct sa_plugin_s *pi_next;
2N/A sa_plugin_ops_t *pi_ops;
2N/A void *pi_hdl;
2N/A} sa_plugin_t;
2N/A
2N/A/*
2N/A * Specific plugin library type ops tables
2N/A * Each contains a sa_plugin_ops_t as first member.
2N/A */
2N/A
2N/A/*
2N/A * File system plugin type ops table
2N/A */
2N/Atypedef struct {
2N/A sa_plugin_ops_t saf_hdr;
2N/A void *(*saf_open)(libshare_handle_t *);
2N/A void (*saf_close)(void *);
2N/A void (*saf_reset)(libshare_handle_t *);
2N/A int (*saf_share_write)(libshare_handle_t *, nvlist_t *, boolean_t);
2N/A int (*saf_share_read)(libshare_handle_t *, const char *, const char *,
2N/A nvlist_t **);
2N/A int (*saf_share_read_init)(libshare_handle_t *, sa_read_hdl_t *);
2N/A int (*saf_share_read_next)(libshare_handle_t *, sa_read_hdl_t *,
2N/A nvlist_t **);
2N/A int (*saf_share_read_fini)(libshare_handle_t *, sa_read_hdl_t *);
2N/A int (*saf_share_remove)(libshare_handle_t *, const char *,
2N/A const char *, boolean_t);
2N/A int (*saf_share_get_acl)(libshare_handle_t *, const char *,
2N/A const char *, acl_t **);
2N/A int (*saf_share_set_acl)(libshare_handle_t *, const char *,
2N/A const char *, acl_t *);
2N/A int (*saf_get_mntpnt_for_path)(libshare_handle_t *, const char *,
2N/A char *, size_t, char *, size_t, char *, size_t);
2N/A int (*saf_sharing_enabled)(libshare_handle_t *, const char *,
2N/A const char *, sa_proto_t *);
2N/A int (*saf_sharing_get_prop)(libshare_handle_t *, const char *,
2N/A const char *, sa_proto_t, char **);
2N/A int (*saf_sharing_set_prop)(libshare_handle_t *, const char *,
2N/A const char *, sa_proto_t, const char *);
2N/A int (*saf_is_legacy)(libshare_handle_t *, const char *, boolean_t *);
2N/A int (*saf_is_zoned)(libshare_handle_t *, const char *, boolean_t *);
2N/A void (*saf_share_notify)(libshare_handle_t *, const char *,
2N/A sa_notify_op_t, nvlist_t *);
2N/A} sa_fs_ops_t;
2N/A
2N/A/*
2N/A * Protocol plugin type ops table
2N/A */
2N/Atypedef struct {
2N/A sa_plugin_ops_t sap_hdr;
2N/A int (*sap_share_parse)(const char *, int, nvlist_t **, char *, size_t);
2N/A int (*sap_share_merge)(nvlist_t *, nvlist_t *, int, char *, size_t);
2N/A int (*sap_share_set_def_proto)(nvlist_t *);
2N/A int (*sap_share_validate_name)(const char *, sa_validate_flags_t,
2N/A char *, size_t);
2N/A int (*sap_share_validate)(libshare_handle_t *, nvlist_t *,
2N/A sa_validate_flags_t, char *, size_t);
2N/A int (*sap_share_publish)(nvlist_t *, int);
2N/A int (*sap_share_unpublish)(nvlist_t *, int);
2N/A int (*sap_share_unpublish_byname)(const char *, const char *, int);
2N/A int (*sap_share_publish_admin)(const char *);
2N/A int (*sap_fs_publish)(nvlist_t *, int);
2N/A int (*sap_fs_unpublish)(nvlist_t *, int);
2N/A int (*sap_share_prop_format)(nvlist_t *, char **);
2N/A int (*sap_share_proplist_from_share)(nvlist_t *, sa_share_props_t *);
2N/A int (*sap_proto_get_propdefs)(nvlist_t **, nvlist_t **);
2N/A int (*sap_proto_parse_proplist)(nvlist_t *, nvlist_t **, char *,
2N/A size_t);
2N/A
2N/A /* sharectl protocol property management routines */
2N/A int (*sap_proto_get_features)(uint64_t *);
2N/A int (*sap_proto_get_proplist)(nvlist_t **);
2N/A int (*sap_proto_get_status)(char **);
2N/A int (*sap_proto_get_property)(const char *, const char *, char **);
2N/A int (*sap_proto_set_property)(const char *, const char *, const char *);
2N/A int (*sap_proto_rem_section)(const char *);
2N/A} sa_proto_ops_t;
2N/A
2N/A/*
2N/A * Share cache plugin type ops table
2N/A */
2N/Atypedef struct {
2N/A sa_plugin_ops_t sac_hdr;
2N/A int (*sac_init)(void *);
2N/A void (*sac_fini)(void *);
2N/A int (*sac_share_add)(nvlist_t *);
2N/A int (*sac_share_update)(nvlist_t *);
2N/A int (*sac_share_remove)(const char *);
2N/A int (*sac_flush)(void);
2N/A int (*sac_share_lookup)(const char *, const char *, sa_proto_t,
2N/A nvlist_t **);
2N/A int (*sac_share_find_init)(const char *, sa_proto_t, void **);
2N/A int (*sac_share_find_next)(void *, nvlist_t **);
2N/A int (*sac_share_find_fini)(void *);
2N/A int (*sac_share_ds_find_init)(const char *, sa_proto_t, void **);
2N/A int (*sac_share_ds_find_get)(void *, nvlist_t **);
2N/A int (*sac_share_ds_find_fini)(void *);
2N/A
2N/A int (*sac_share_validate_name)(const char *, sa_validate_flags_t);
2N/A} sa_cache_ops_t;
2N/A
2N/A/*
2N/A * libshare_plugin.c
2N/A */
2N/Aextern void saplugin_unload_all(void);
2N/Aextern sa_plugin_ops_t *saplugin_find_ops(sa_plugin_type_t, uint32_t);
2N/Aextern sa_plugin_ops_t *saplugin_next_ops(sa_plugin_type_t, sa_plugin_ops_t *);
2N/Aextern int saplugin_get_protos(sa_proto_t **);
2N/A
2N/A/*
2N/A * libshare_util.c
2N/A */
2N/Aextern int sa_fstype(const char *, char **);
2N/Aextern void sa_free_fstype(char *);
2N/Aextern char *sa_fixup_path(char *);
2N/Aextern int sa_resolve_share_name_conflict(libshare_handle_t *, nvlist_t *,
2N/A nvlist_t **, int);
2N/Aextern int sa_share_from_path(libshare_handle_t *, const char *, nvlist_t **,
2N/A boolean_t *);
2N/Aextern char *sa_strchr_escape(char *, char);
2N/Aextern char *sa_strip_escape(char *);
2N/Aextern boolean_t sa_fstype_is_shareable(const char *);
2N/A
2N/A/*
2N/A * libshare_cache.c
2N/A */
2N/Aextern int sacache_init(void *);
2N/Aextern void sacache_fini(void *);
2N/Aextern int sacache_share_add(nvlist_t *);
2N/Aextern int sacache_share_update(nvlist_t *);
2N/Aextern int sacache_share_remove(const char *);
2N/Aextern int sacache_flush(void);
2N/Aextern int sacache_share_lookup(const char *, const char *, sa_proto_t,
2N/A nvlist_t **);
2N/Aextern int sacache_share_find_init(const char *, sa_proto_t, void **);
2N/Aextern int sacache_share_find_next(void *, nvlist_t **);
2N/Aextern int sacache_share_find_fini(void *);
2N/Aextern int sacache_share_ds_find_init(const char *, sa_proto_t, void **);
2N/Aextern int sacache_share_ds_find_get(void *, nvlist_t **);
2N/Aextern int sacache_share_ds_find_fini(void *);
2N/Aextern int sacache_share_validate_name(const char *, sa_validate_flags_t);
2N/A
2N/A/*
2N/A * libshare_proto.c
2N/A */
2N/Aextern int saproto_init(void);
2N/Aextern int saproto_fini(void);
2N/Aextern int saproto_share_parse(sa_proto_t, const char *, int, nvlist_t **,
2N/A char *, size_t);
2N/A
2N/Aextern int saproto_share_merge(sa_proto_t, nvlist_t *, nvlist_t *, int,
2N/A char *, size_t);
2N/Aextern int saproto_share_set_def_proto(sa_proto_t, nvlist_t *);
2N/Aextern int saproto_share_validate_name(const char *, sa_proto_t,
2N/A sa_validate_flags_t, char *, size_t);
2N/Aextern int saproto_share_validate(libshare_handle_t *, nvlist_t *, sa_proto_t,
2N/A sa_validate_flags_t, char *, size_t);
2N/Aextern int saproto_share_format_props(nvlist_t *, sa_proto_t, char **);
2N/A
2N/Aextern int saproto_share_publish(nvlist_t *, sa_proto_t, int);
2N/Aextern int saproto_share_unpublish(nvlist_t *, sa_proto_t, int);
2N/Aextern int saproto_share_unpublish_byname(const char *, const char *,
2N/A sa_proto_t, int);
2N/Aextern int saproto_share_publish_admin(const char *, sa_proto_t);
2N/Aextern int saproto_fs_publish(nvlist_t *, sa_proto_t, int);
2N/Aextern int saproto_fs_unpublish(nvlist_t *, sa_proto_t, int);
2N/A
2N/Aextern int sa_proto_count(void);
2N/Aextern sa_proto_t sa_proto_get_type(int);
2N/Aextern char *sa_proto_get_name(int);
2N/Aextern int sa_proto_get_index(sa_proto_t);
2N/A
2N/Aextern int saproto_get_propdefs(nvlist_t **, nvlist_t **, sa_proto_t);
2N/Aextern int saproto_parse_proplist(sa_proto_t, nvlist_t *, nvlist_t **, char *,
2N/A size_t);
2N/Aextern int saproto_share_proplist_from_share(sa_proto_t, nvlist_t *,
2N/A sa_share_props_t *);
2N/A
2N/A/*
2N/A * libshare_fs.c
2N/A */
2N/Aextern int safs_init(void);
2N/Aextern int safs_fini(void);
2N/Aextern int safs_init_fs_handle(libshare_handle_t *, sa_fs_t, void *);
2N/Aextern int safs_get_fs_handle(libshare_handle_t *, sa_fs_t, void **);
2N/Aextern void safs_close(libshare_handle_t *, sa_fs_t);
2N/Aextern void safs_reset(libshare_handle_t *, sa_fs_t);
2N/Aextern int safs_share_write(libshare_handle_t *, nvlist_t *, boolean_t);
2N/Aextern int safs_share_read(libshare_handle_t *, const char *, const char *,
2N/A nvlist_t **);
2N/Aextern int safs_share_read_init(libshare_handle_t *, sa_read_hdl_t *);
2N/Aextern int safs_share_read_next(libshare_handle_t *, sa_read_hdl_t *,
2N/A nvlist_t **);
2N/Aextern int safs_share_read_fini(libshare_handle_t *, sa_read_hdl_t *);
2N/Aextern int safs_share_remove(libshare_handle_t *, const char *, const char *,
2N/A boolean_t);
2N/Aextern boolean_t safs_is_zoned(libshare_handle_t *, const char *);
2N/Aextern int safs_share_get_acl(libshare_handle_t *, const char *, const char *,
2N/A acl_t **);
2N/Aextern int safs_share_set_acl(libshare_handle_t *, const char *, const char *,
2N/A acl_t *);
2N/Aextern int safs_get_mntpnt_for_path(libshare_handle_t *, const char *, char *,
2N/A size_t, sa_fs_t *, char *, size_t, char *, size_t);
2N/Aextern int safs_sharing_get_prop(libshare_handle_t *, const char *,
2N/A const char *, sa_proto_t, char **);
2N/Aextern int safs_sharing_set_prop(libshare_handle_t *, const char *,
2N/A const char *, sa_proto_t, const char *);
2N/Aextern int safs_sharing_enabled(libshare_handle_t *, const char *,
2N/A const char *, sa_proto_t *);
2N/Aextern void safs_share_notify(libshare_handle_t *, sa_fs_t, const char *,
2N/A sa_notify_op_t, nvlist_t *);
2N/A
2N/Aextern sa_fs_t safs_path_to_fstype(libshare_handle_t *, const char *);
2N/Aextern const char *safs_get_name(sa_fs_t fstype);
2N/A
2N/A#ifdef __cplusplus
2N/A}
2N/A#endif
2N/A
2N/A#endif /* _LIBSHARE_IMPL_H */