xref: /freebsd/sys/contrib/openzfs/lib/libzfs/libzfs_share.h (revision 8a62a2a5659d1839d8799b4274c04469d7f17c78)
1*8a62a2a5SMartin Matuska // SPDX-License-Identifier: CDDL-1.0
2*8a62a2a5SMartin Matuska /*
3*8a62a2a5SMartin Matuska  * CDDL HEADER START
4*8a62a2a5SMartin Matuska  *
5*8a62a2a5SMartin Matuska  * The contents of this file are subject to the terms of the
6*8a62a2a5SMartin Matuska  * Common Development and Distribution License (the "License").
7*8a62a2a5SMartin Matuska  * You may not use this file except in compliance with the License.
8*8a62a2a5SMartin Matuska  *
9*8a62a2a5SMartin Matuska  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*8a62a2a5SMartin Matuska  * or https://opensource.org/licenses/CDDL-1.0.
11*8a62a2a5SMartin Matuska  * See the License for the specific language governing permissions
12*8a62a2a5SMartin Matuska  * and limitations under the License.
13*8a62a2a5SMartin Matuska  *
14*8a62a2a5SMartin Matuska  * When distributing Covered Code, include this CDDL HEADER in each
15*8a62a2a5SMartin Matuska  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*8a62a2a5SMartin Matuska  * If applicable, add the following below this CDDL HEADER, with the
17*8a62a2a5SMartin Matuska  * fields enclosed by brackets "[]" replaced with your own identifying
18*8a62a2a5SMartin Matuska  * information: Portions Copyright [yyyy] [name of copyright owner]
19*8a62a2a5SMartin Matuska  *
20*8a62a2a5SMartin Matuska  * CDDL HEADER END
21*8a62a2a5SMartin Matuska  */
22*8a62a2a5SMartin Matuska 
23*8a62a2a5SMartin Matuska /*
24*8a62a2a5SMartin Matuska  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
25*8a62a2a5SMartin Matuska  * Use is subject to license terms.
26*8a62a2a5SMartin Matuska  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
27*8a62a2a5SMartin Matuska  * Copyright (c) 2011 Gunnar Beutner
28*8a62a2a5SMartin Matuska  * Copyright (c) 2019, 2022 by Delphix. All rights reserved.
29*8a62a2a5SMartin Matuska  */
30*8a62a2a5SMartin Matuska 
31*8a62a2a5SMartin Matuska #ifndef _LIBZFS_SHARE_H
32*8a62a2a5SMartin Matuska #define	_LIBZFS_SHARE_H
33*8a62a2a5SMartin Matuska 
34*8a62a2a5SMartin Matuska #include <sys/types.h>
35*8a62a2a5SMartin Matuska 
36*8a62a2a5SMartin Matuska /*
37*8a62a2a5SMartin Matuska  * defined error values
38*8a62a2a5SMartin Matuska  */
39*8a62a2a5SMartin Matuska #define	SA_OK			0
40*8a62a2a5SMartin Matuska #define	SA_SYSTEM_ERR		7	/* system error, use errno */
41*8a62a2a5SMartin Matuska #define	SA_SYNTAX_ERR		8	/* syntax error on command line */
42*8a62a2a5SMartin Matuska #define	SA_NO_MEMORY		2	/* no memory for data structures */
43*8a62a2a5SMartin Matuska #define	SA_INVALID_PROTOCOL	13	/* specified protocol not valid */
44*8a62a2a5SMartin Matuska #define	SA_NOT_SUPPORTED	21	/* operation not supported for proto */
45*8a62a2a5SMartin Matuska 
46*8a62a2a5SMartin Matuska /* The following errors are never returned by libshare */
47*8a62a2a5SMartin Matuska #define	SA_NO_SUCH_PATH		1	/* provided path doesn't exist */
48*8a62a2a5SMartin Matuska #define	SA_DUPLICATE_NAME	3	/* object name is already in use */
49*8a62a2a5SMartin Matuska #define	SA_BAD_PATH		4	/* not a full path */
50*8a62a2a5SMartin Matuska #define	SA_NO_SUCH_GROUP	5	/* group is not defined */
51*8a62a2a5SMartin Matuska #define	SA_CONFIG_ERR		6	/* system configuration error */
52*8a62a2a5SMartin Matuska #define	SA_NO_PERMISSION	9	/* no permission for operation */
53*8a62a2a5SMartin Matuska #define	SA_BUSY			10	/* resource is busy */
54*8a62a2a5SMartin Matuska #define	SA_NO_SUCH_PROP		11	/* property doesn't exist */
55*8a62a2a5SMartin Matuska #define	SA_INVALID_NAME		12	/* name of object is invalid */
56*8a62a2a5SMartin Matuska #define	SA_NOT_ALLOWED		14	/* operation not allowed */
57*8a62a2a5SMartin Matuska #define	SA_BAD_VALUE		15	/* bad value for property */
58*8a62a2a5SMartin Matuska #define	SA_INVALID_SECURITY	16	/* invalid security type */
59*8a62a2a5SMartin Matuska #define	SA_NO_SUCH_SECURITY	17	/* security set not found */
60*8a62a2a5SMartin Matuska #define	SA_VALUE_CONFLICT	18	/* property value conflict */
61*8a62a2a5SMartin Matuska #define	SA_NOT_IMPLEMENTED	19	/* plugin interface not implemented */
62*8a62a2a5SMartin Matuska #define	SA_INVALID_PATH		20	/* path is sub-dir of existing share */
63*8a62a2a5SMartin Matuska #define	SA_PROP_SHARE_ONLY	22	/* property valid on share only */
64*8a62a2a5SMartin Matuska #define	SA_NOT_SHARED		23	/* path is not shared */
65*8a62a2a5SMartin Matuska #define	SA_NO_SUCH_RESOURCE	24	/* resource not found */
66*8a62a2a5SMartin Matuska #define	SA_RESOURCE_REQUIRED	25	/* resource name is required  */
67*8a62a2a5SMartin Matuska #define	SA_MULTIPLE_ERROR	26	/* multiple protocols reported error */
68*8a62a2a5SMartin Matuska #define	SA_PATH_IS_SUBDIR	27	/* check_path found path is subdir */
69*8a62a2a5SMartin Matuska #define	SA_PATH_IS_PARENTDIR	28	/* check_path found path is parent */
70*8a62a2a5SMartin Matuska #define	SA_NO_SECTION		29	/* protocol requires section info */
71*8a62a2a5SMartin Matuska #define	SA_NO_SUCH_SECTION	30	/* no section found */
72*8a62a2a5SMartin Matuska #define	SA_NO_PROPERTIES	31	/* no properties found */
73*8a62a2a5SMartin Matuska #define	SA_PASSWORD_ENC		32	/* passwords must be encrypted */
74*8a62a2a5SMartin Matuska #define	SA_SHARE_EXISTS		33	/* path or file is already shared */
75*8a62a2a5SMartin Matuska 
76*8a62a2a5SMartin Matuska /* initialization */
77*8a62a2a5SMartin Matuska extern const char *sa_errorstr(int);
78*8a62a2a5SMartin Matuska 
79*8a62a2a5SMartin Matuska /* lower-case */
80*8a62a2a5SMartin Matuska extern const char *const sa_protocol_names[SA_PROTOCOL_COUNT];
81*8a62a2a5SMartin Matuska 
82*8a62a2a5SMartin Matuska /* share control */
83*8a62a2a5SMartin Matuska extern int sa_enable_share(const char *, const char *, const char *,
84*8a62a2a5SMartin Matuska     enum sa_protocol);
85*8a62a2a5SMartin Matuska extern int sa_disable_share(const char *, enum sa_protocol);
86*8a62a2a5SMartin Matuska extern boolean_t sa_is_shared(const char *, enum sa_protocol);
87*8a62a2a5SMartin Matuska extern void sa_commit_shares(enum sa_protocol);
88*8a62a2a5SMartin Matuska extern void sa_truncate_shares(enum sa_protocol);
89*8a62a2a5SMartin Matuska 
90*8a62a2a5SMartin Matuska /* protocol specific interfaces */
91*8a62a2a5SMartin Matuska extern int sa_validate_shareopts(const char *, enum sa_protocol);
92*8a62a2a5SMartin Matuska 
93*8a62a2a5SMartin Matuska 
94*8a62a2a5SMartin Matuska /* internal definitions */
95*8a62a2a5SMartin Matuska typedef const struct sa_share_impl {
96*8a62a2a5SMartin Matuska 	const char *sa_zfsname;
97*8a62a2a5SMartin Matuska 	const char *sa_mountpoint;
98*8a62a2a5SMartin Matuska 	const char *sa_shareopts;
99*8a62a2a5SMartin Matuska } *sa_share_impl_t;
100*8a62a2a5SMartin Matuska 
101*8a62a2a5SMartin Matuska typedef struct {
102*8a62a2a5SMartin Matuska 	int (*const enable_share)(sa_share_impl_t share);
103*8a62a2a5SMartin Matuska 	int (*const disable_share)(sa_share_impl_t share);
104*8a62a2a5SMartin Matuska 	boolean_t (*const is_shared)(sa_share_impl_t share);
105*8a62a2a5SMartin Matuska 	int (*const validate_shareopts)(const char *shareopts);
106*8a62a2a5SMartin Matuska 	int (*const commit_shares)(void);
107*8a62a2a5SMartin Matuska 	void (*const truncate_shares)(void);
108*8a62a2a5SMartin Matuska } sa_fstype_t;
109*8a62a2a5SMartin Matuska 
110*8a62a2a5SMartin Matuska extern const sa_fstype_t libshare_nfs_type, libshare_smb_type;
111*8a62a2a5SMartin Matuska 
112*8a62a2a5SMartin Matuska /* internal NFS definitions */
113*8a62a2a5SMartin Matuska #define	NFS_FILE_HEADER		"# !!! DO NOT EDIT THIS FILE MANUALLY !!!\n\n"
114*8a62a2a5SMartin Matuska 
115*8a62a2a5SMartin Matuska extern int nfs_escape_mountpoint(const char *mp, char **out,
116*8a62a2a5SMartin Matuska     boolean_t *need_free);
117*8a62a2a5SMartin Matuska extern boolean_t nfs_is_shared_impl(const char *exports,
118*8a62a2a5SMartin Matuska     sa_share_impl_t impl_share);
119*8a62a2a5SMartin Matuska extern int nfs_toggle_share(const char *lockfile, const char *exports,
120*8a62a2a5SMartin Matuska     const char *expdir, sa_share_impl_t impl_share,
121*8a62a2a5SMartin Matuska     int(*cbk)(sa_share_impl_t impl_share, FILE *tmpfile));
122*8a62a2a5SMartin Matuska extern void nfs_reset_shares(const char *lockfile, const char *exports);
123*8a62a2a5SMartin Matuska 
124*8a62a2a5SMartin Matuska /* internal SMB definitions */
125*8a62a2a5SMartin Matuska #define	SMB_NAME_MAX		255
126*8a62a2a5SMartin Matuska #define	SMB_COMMENT_MAX		255
127*8a62a2a5SMartin Matuska 
128*8a62a2a5SMartin Matuska #define	SMB_SHARE_DIR		"/var/lib/samba/usershares"
129*8a62a2a5SMartin Matuska #define	SMB_NET_CMD_PATH	"/usr/bin/net"
130*8a62a2a5SMartin Matuska #define	SMB_NET_CMD_ARG_HOST	"127.0.0.1"
131*8a62a2a5SMartin Matuska 
132*8a62a2a5SMartin Matuska typedef struct smb_share_s {
133*8a62a2a5SMartin Matuska 	char name[SMB_NAME_MAX];	/* Share name */
134*8a62a2a5SMartin Matuska 	char path[PATH_MAX];		/* Share path */
135*8a62a2a5SMartin Matuska 	char comment[SMB_COMMENT_MAX];	/* Share's comment */
136*8a62a2a5SMartin Matuska 	boolean_t guest_ok;		/* 'y' or 'n' */
137*8a62a2a5SMartin Matuska 
138*8a62a2a5SMartin Matuska 	struct smb_share_s *next;
139*8a62a2a5SMartin Matuska } smb_share_t;
140*8a62a2a5SMartin Matuska 
141*8a62a2a5SMartin Matuska #endif /* _LIBZFS_SHARE_H */
142