1*61145dc2SMartin Matuska // SPDX-License-Identifier: CDDL-1.0
2eda14cbcSMatt Macy /*
3eda14cbcSMatt Macy * CDDL HEADER START
4eda14cbcSMatt Macy *
5eda14cbcSMatt Macy * The contents of this file are subject to the terms of the
6eda14cbcSMatt Macy * Common Development and Distribution License (the "License").
7eda14cbcSMatt Macy * You may not use this file except in compliance with the License.
8eda14cbcSMatt Macy *
9eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0.
11eda14cbcSMatt Macy * See the License for the specific language governing permissions
12eda14cbcSMatt Macy * and limitations under the License.
13eda14cbcSMatt Macy *
14eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each
15eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the
17eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying
18eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner]
19eda14cbcSMatt Macy *
20eda14cbcSMatt Macy * CDDL HEADER END
21eda14cbcSMatt Macy */
22eda14cbcSMatt Macy
23eda14cbcSMatt Macy /*
24eda14cbcSMatt Macy * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
25eda14cbcSMatt Macy * Copyright (c) 2011 Gunnar Beutner
26c7046f76SMartin Matuska * Copyright (c) 2018, 2022 by Delphix. All rights reserved.
27eda14cbcSMatt Macy */
28eda14cbcSMatt Macy
29eda14cbcSMatt Macy #include <stdio.h>
30eda14cbcSMatt Macy #include <stdlib.h>
31716fd348SMartin Matuska #include <stddef.h>
32da5137abSMartin Matuska #include <string.h>
33eda14cbcSMatt Macy #include <errno.h>
34eda14cbcSMatt Macy #include <libintl.h>
35eda14cbcSMatt Macy #include <sys/file.h>
36eda14cbcSMatt Macy #include <sys/types.h>
37eda14cbcSMatt Macy #include <sys/stat.h>
38eda14cbcSMatt Macy #include <unistd.h>
39eda14cbcSMatt Macy #include <libzfs.h>
40eda14cbcSMatt Macy #include <libshare.h>
41eda14cbcSMatt Macy #include "libshare_impl.h"
42eda14cbcSMatt Macy
43716fd348SMartin Matuska #define init_share(zfsname, path, shareopts) \
44716fd348SMartin Matuska { \
45716fd348SMartin Matuska .sa_zfsname = zfsname, \
46716fd348SMartin Matuska .sa_mountpoint = path, \
47716fd348SMartin Matuska .sa_shareopts = shareopts, \
48eda14cbcSMatt Macy }
49eda14cbcSMatt Macy
50716fd348SMartin Matuska #define VALIDATE_PROTOCOL(proto, ...) \
51716fd348SMartin Matuska if ((proto) < 0 || (proto) >= SA_PROTOCOL_COUNT) \
52716fd348SMartin Matuska return __VA_ARGS__
53716fd348SMartin Matuska
54716fd348SMartin Matuska const char *const sa_protocol_names[SA_PROTOCOL_COUNT] = {
55716fd348SMartin Matuska [SA_PROTOCOL_NFS] = "nfs",
56716fd348SMartin Matuska [SA_PROTOCOL_SMB] = "smb",
57716fd348SMartin Matuska };
58716fd348SMartin Matuska
59716fd348SMartin Matuska static const sa_fstype_t *fstypes[SA_PROTOCOL_COUNT] =
60716fd348SMartin Matuska {&libshare_nfs_type, &libshare_smb_type};
61eda14cbcSMatt Macy
62eda14cbcSMatt Macy int
sa_enable_share(const char * zfsname,const char * mountpoint,const char * shareopts,enum sa_protocol protocol)63eda14cbcSMatt Macy sa_enable_share(const char *zfsname, const char *mountpoint,
64716fd348SMartin Matuska const char *shareopts, enum sa_protocol protocol)
65eda14cbcSMatt Macy {
66716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL);
67eda14cbcSMatt Macy
68716fd348SMartin Matuska const struct sa_share_impl args =
69716fd348SMartin Matuska init_share(zfsname, mountpoint, shareopts);
70716fd348SMartin Matuska return (fstypes[protocol]->enable_share(&args));
71eda14cbcSMatt Macy }
72eda14cbcSMatt Macy
73eda14cbcSMatt Macy int
sa_disable_share(const char * mountpoint,enum sa_protocol protocol)74716fd348SMartin Matuska sa_disable_share(const char *mountpoint, enum sa_protocol protocol)
75eda14cbcSMatt Macy {
76716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL);
77eda14cbcSMatt Macy
78716fd348SMartin Matuska const struct sa_share_impl args = init_share(NULL, mountpoint, NULL);
79716fd348SMartin Matuska return (fstypes[protocol]->disable_share(&args));
80eda14cbcSMatt Macy }
81eda14cbcSMatt Macy
82eda14cbcSMatt Macy boolean_t
sa_is_shared(const char * mountpoint,enum sa_protocol protocol)83716fd348SMartin Matuska sa_is_shared(const char *mountpoint, enum sa_protocol protocol)
84eda14cbcSMatt Macy {
85716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, B_FALSE);
86eda14cbcSMatt Macy
87716fd348SMartin Matuska const struct sa_share_impl args = init_share(NULL, mountpoint, NULL);
88716fd348SMartin Matuska return (fstypes[protocol]->is_shared(&args));
89eda14cbcSMatt Macy }
90eda14cbcSMatt Macy
91eda14cbcSMatt Macy void
sa_commit_shares(enum sa_protocol protocol)92716fd348SMartin Matuska sa_commit_shares(enum sa_protocol protocol)
93eda14cbcSMatt Macy {
94716fd348SMartin Matuska /* CSTYLED */
95716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, );
96716fd348SMartin Matuska
97716fd348SMartin Matuska fstypes[protocol]->commit_shares();
98eda14cbcSMatt Macy }
99716fd348SMartin Matuska
100c7046f76SMartin Matuska void
sa_truncate_shares(enum sa_protocol protocol)101c7046f76SMartin Matuska sa_truncate_shares(enum sa_protocol protocol)
102c7046f76SMartin Matuska {
103c7046f76SMartin Matuska /* CSTYLED */
104c7046f76SMartin Matuska VALIDATE_PROTOCOL(protocol, );
105c7046f76SMartin Matuska
106c7046f76SMartin Matuska if (fstypes[protocol]->truncate_shares != NULL)
107c7046f76SMartin Matuska fstypes[protocol]->truncate_shares();
108c7046f76SMartin Matuska }
109c7046f76SMartin Matuska
110716fd348SMartin Matuska int
sa_validate_shareopts(const char * options,enum sa_protocol protocol)111716fd348SMartin Matuska sa_validate_shareopts(const char *options, enum sa_protocol protocol)
112716fd348SMartin Matuska {
113716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL);
114716fd348SMartin Matuska
115716fd348SMartin Matuska return (fstypes[protocol]->validate_shareopts(options));
116eda14cbcSMatt Macy }
117eda14cbcSMatt Macy
118eda14cbcSMatt Macy /*
119eda14cbcSMatt Macy * sa_errorstr(err)
120eda14cbcSMatt Macy *
121eda14cbcSMatt Macy * convert an error value to an error string
122eda14cbcSMatt Macy */
123716fd348SMartin Matuska const char *
sa_errorstr(int err)124eda14cbcSMatt Macy sa_errorstr(int err)
125eda14cbcSMatt Macy {
126eda14cbcSMatt Macy static char errstr[32];
127eda14cbcSMatt Macy
128eda14cbcSMatt Macy switch (err) {
129eda14cbcSMatt Macy case SA_OK:
130716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "ok"));
131eda14cbcSMatt Macy case SA_NO_SUCH_PATH:
132716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path doesn't exist"));
133eda14cbcSMatt Macy case SA_NO_MEMORY:
134716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no memory"));
135eda14cbcSMatt Macy case SA_DUPLICATE_NAME:
136716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "name in use"));
137eda14cbcSMatt Macy case SA_BAD_PATH:
138716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "bad path"));
139eda14cbcSMatt Macy case SA_NO_SUCH_GROUP:
140716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such group"));
141eda14cbcSMatt Macy case SA_CONFIG_ERR:
142716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "configuration error"));
143eda14cbcSMatt Macy case SA_SYSTEM_ERR:
144716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "system error"));
145eda14cbcSMatt Macy case SA_SYNTAX_ERR:
146716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "syntax error"));
147eda14cbcSMatt Macy case SA_NO_PERMISSION:
148716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no permission"));
149eda14cbcSMatt Macy case SA_BUSY:
150716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "busy"));
151eda14cbcSMatt Macy case SA_NO_SUCH_PROP:
152716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such property"));
153eda14cbcSMatt Macy case SA_INVALID_NAME:
154716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid name"));
155eda14cbcSMatt Macy case SA_INVALID_PROTOCOL:
156716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid protocol"));
157eda14cbcSMatt Macy case SA_NOT_ALLOWED:
158716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "operation not allowed"));
159eda14cbcSMatt Macy case SA_BAD_VALUE:
160716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "bad property value"));
161eda14cbcSMatt Macy case SA_INVALID_SECURITY:
162716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid security type"));
163eda14cbcSMatt Macy case SA_NO_SUCH_SECURITY:
164716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "security type not found"));
165eda14cbcSMatt Macy case SA_VALUE_CONFLICT:
166716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "property value conflict"));
167eda14cbcSMatt Macy case SA_NOT_IMPLEMENTED:
168716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "not implemented"));
169eda14cbcSMatt Macy case SA_INVALID_PATH:
170716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid path"));
171eda14cbcSMatt Macy case SA_NOT_SUPPORTED:
172716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "operation not supported"));
173eda14cbcSMatt Macy case SA_PROP_SHARE_ONLY:
174716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "property not valid for group"));
175eda14cbcSMatt Macy case SA_NOT_SHARED:
176716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "not shared"));
177eda14cbcSMatt Macy case SA_NO_SUCH_RESOURCE:
178716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such resource"));
179eda14cbcSMatt Macy case SA_RESOURCE_REQUIRED:
180716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "resource name required"));
181eda14cbcSMatt Macy case SA_MULTIPLE_ERROR:
182716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN,
183716fd348SMartin Matuska "errors from multiple protocols"));
184eda14cbcSMatt Macy case SA_PATH_IS_SUBDIR:
185716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path is a subpath of share"));
186eda14cbcSMatt Macy case SA_PATH_IS_PARENTDIR:
187716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path is parent of a share"));
188eda14cbcSMatt Macy case SA_NO_SECTION:
189716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "protocol requires a section"));
190eda14cbcSMatt Macy case SA_NO_PROPERTIES:
191716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "properties not found"));
192eda14cbcSMatt Macy case SA_NO_SUCH_SECTION:
193716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "section not found"));
194eda14cbcSMatt Macy case SA_PASSWORD_ENC:
195716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "passwords must be encrypted"));
196eda14cbcSMatt Macy case SA_SHARE_EXISTS:
197716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN,
198716fd348SMartin Matuska "path or file is already shared"));
199eda14cbcSMatt Macy default:
200eda14cbcSMatt Macy (void) snprintf(errstr, sizeof (errstr),
201eda14cbcSMatt Macy dgettext(TEXT_DOMAIN, "unknown %d"), err);
202716fd348SMartin Matuska return (errstr);
203eda14cbcSMatt Macy }
204eda14cbcSMatt Macy }
205