1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7eda14cbcSMatt Macy * 8eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 10eda14cbcSMatt Macy * See the License for the specific language governing permissions 11eda14cbcSMatt Macy * and limitations under the License. 12eda14cbcSMatt Macy * 13eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18eda14cbcSMatt Macy * 19eda14cbcSMatt Macy * CDDL HEADER END 20eda14cbcSMatt Macy */ 21eda14cbcSMatt Macy 22eda14cbcSMatt Macy /* 23eda14cbcSMatt Macy * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. 24eda14cbcSMatt Macy * Copyright (c) 2011 Gunnar Beutner 25eda14cbcSMatt Macy * Copyright (c) 2018, 2020 by Delphix. All rights reserved. 26eda14cbcSMatt Macy */ 27eda14cbcSMatt Macy 28eda14cbcSMatt Macy #include <stdio.h> 29eda14cbcSMatt Macy #include <stdlib.h> 30716fd348SMartin Matuska #include <stddef.h> 31da5137abSMartin Matuska #include <string.h> 32eda14cbcSMatt Macy #include <errno.h> 33eda14cbcSMatt Macy #include <libintl.h> 34eda14cbcSMatt Macy #include <sys/file.h> 35eda14cbcSMatt Macy #include <sys/types.h> 36eda14cbcSMatt Macy #include <sys/stat.h> 37eda14cbcSMatt Macy #include <unistd.h> 38eda14cbcSMatt Macy #include <libzfs.h> 39eda14cbcSMatt Macy #include <libshare.h> 40eda14cbcSMatt Macy #include "libshare_impl.h" 41eda14cbcSMatt Macy 42716fd348SMartin Matuska #define init_share(zfsname, path, shareopts) \ 43716fd348SMartin Matuska { \ 44716fd348SMartin Matuska .sa_zfsname = zfsname, \ 45716fd348SMartin Matuska .sa_mountpoint = path, \ 46716fd348SMartin Matuska .sa_shareopts = shareopts, \ 47eda14cbcSMatt Macy } 48eda14cbcSMatt Macy 49716fd348SMartin Matuska #define VALIDATE_PROTOCOL(proto, ...) \ 50716fd348SMartin Matuska if ((proto) < 0 || (proto) >= SA_PROTOCOL_COUNT) \ 51716fd348SMartin Matuska return __VA_ARGS__ 52716fd348SMartin Matuska 53716fd348SMartin Matuska const char *const sa_protocol_names[SA_PROTOCOL_COUNT] = { 54716fd348SMartin Matuska [SA_PROTOCOL_NFS] = "nfs", 55716fd348SMartin Matuska [SA_PROTOCOL_SMB] = "smb", 56716fd348SMartin Matuska }; 57716fd348SMartin Matuska 58716fd348SMartin Matuska static const sa_fstype_t *fstypes[SA_PROTOCOL_COUNT] = 59716fd348SMartin Matuska {&libshare_nfs_type, &libshare_smb_type}; 60eda14cbcSMatt Macy 61eda14cbcSMatt Macy int 62eda14cbcSMatt Macy sa_enable_share(const char *zfsname, const char *mountpoint, 63716fd348SMartin Matuska const char *shareopts, enum sa_protocol protocol) 64eda14cbcSMatt Macy { 65716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); 66eda14cbcSMatt Macy 67716fd348SMartin Matuska const struct sa_share_impl args = 68716fd348SMartin Matuska init_share(zfsname, mountpoint, shareopts); 69716fd348SMartin Matuska return (fstypes[protocol]->enable_share(&args)); 70eda14cbcSMatt Macy } 71eda14cbcSMatt Macy 72eda14cbcSMatt Macy int 73716fd348SMartin Matuska sa_disable_share(const char *mountpoint, enum sa_protocol protocol) 74eda14cbcSMatt Macy { 75716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); 76eda14cbcSMatt Macy 77716fd348SMartin Matuska const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); 78716fd348SMartin Matuska return (fstypes[protocol]->disable_share(&args)); 79eda14cbcSMatt Macy } 80eda14cbcSMatt Macy 81eda14cbcSMatt Macy boolean_t 82716fd348SMartin Matuska sa_is_shared(const char *mountpoint, enum sa_protocol protocol) 83eda14cbcSMatt Macy { 84716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, B_FALSE); 85eda14cbcSMatt Macy 86716fd348SMartin Matuska const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); 87716fd348SMartin Matuska return (fstypes[protocol]->is_shared(&args)); 88eda14cbcSMatt Macy } 89eda14cbcSMatt Macy 90eda14cbcSMatt Macy void 91716fd348SMartin Matuska sa_commit_shares(enum sa_protocol protocol) 92eda14cbcSMatt Macy { 93716fd348SMartin Matuska /* CSTYLED */ 94716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, ); 95716fd348SMartin Matuska 96716fd348SMartin Matuska fstypes[protocol]->commit_shares(); 97eda14cbcSMatt Macy } 98716fd348SMartin Matuska 99716fd348SMartin Matuska int 100716fd348SMartin Matuska sa_validate_shareopts(const char *options, enum sa_protocol protocol) 101716fd348SMartin Matuska { 102716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); 103716fd348SMartin Matuska 104716fd348SMartin Matuska return (fstypes[protocol]->validate_shareopts(options)); 105eda14cbcSMatt Macy } 106eda14cbcSMatt Macy 107eda14cbcSMatt Macy /* 108eda14cbcSMatt Macy * sa_errorstr(err) 109eda14cbcSMatt Macy * 110eda14cbcSMatt Macy * convert an error value to an error string 111eda14cbcSMatt Macy */ 112716fd348SMartin Matuska const char * 113eda14cbcSMatt Macy sa_errorstr(int err) 114eda14cbcSMatt Macy { 115eda14cbcSMatt Macy static char errstr[32]; 116eda14cbcSMatt Macy 117eda14cbcSMatt Macy switch (err) { 118eda14cbcSMatt Macy case SA_OK: 119716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "ok")); 120eda14cbcSMatt Macy case SA_NO_SUCH_PATH: 121716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path doesn't exist")); 122eda14cbcSMatt Macy case SA_NO_MEMORY: 123716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no memory")); 124eda14cbcSMatt Macy case SA_DUPLICATE_NAME: 125716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "name in use")); 126eda14cbcSMatt Macy case SA_BAD_PATH: 127716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "bad path")); 128eda14cbcSMatt Macy case SA_NO_SUCH_GROUP: 129716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such group")); 130eda14cbcSMatt Macy case SA_CONFIG_ERR: 131716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "configuration error")); 132eda14cbcSMatt Macy case SA_SYSTEM_ERR: 133716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "system error")); 134eda14cbcSMatt Macy case SA_SYNTAX_ERR: 135716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "syntax error")); 136eda14cbcSMatt Macy case SA_NO_PERMISSION: 137716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no permission")); 138eda14cbcSMatt Macy case SA_BUSY: 139716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "busy")); 140eda14cbcSMatt Macy case SA_NO_SUCH_PROP: 141716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such property")); 142eda14cbcSMatt Macy case SA_INVALID_NAME: 143716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid name")); 144eda14cbcSMatt Macy case SA_INVALID_PROTOCOL: 145716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid protocol")); 146eda14cbcSMatt Macy case SA_NOT_ALLOWED: 147716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "operation not allowed")); 148eda14cbcSMatt Macy case SA_BAD_VALUE: 149716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "bad property value")); 150eda14cbcSMatt Macy case SA_INVALID_SECURITY: 151716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid security type")); 152eda14cbcSMatt Macy case SA_NO_SUCH_SECURITY: 153716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "security type not found")); 154eda14cbcSMatt Macy case SA_VALUE_CONFLICT: 155716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "property value conflict")); 156eda14cbcSMatt Macy case SA_NOT_IMPLEMENTED: 157716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "not implemented")); 158eda14cbcSMatt Macy case SA_INVALID_PATH: 159716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid path")); 160eda14cbcSMatt Macy case SA_NOT_SUPPORTED: 161716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "operation not supported")); 162eda14cbcSMatt Macy case SA_PROP_SHARE_ONLY: 163716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "property not valid for group")); 164eda14cbcSMatt Macy case SA_NOT_SHARED: 165716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "not shared")); 166eda14cbcSMatt Macy case SA_NO_SUCH_RESOURCE: 167716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such resource")); 168eda14cbcSMatt Macy case SA_RESOURCE_REQUIRED: 169716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "resource name required")); 170eda14cbcSMatt Macy case SA_MULTIPLE_ERROR: 171716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, 172716fd348SMartin Matuska "errors from multiple protocols")); 173eda14cbcSMatt Macy case SA_PATH_IS_SUBDIR: 174716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path is a subpath of share")); 175eda14cbcSMatt Macy case SA_PATH_IS_PARENTDIR: 176716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path is parent of a share")); 177eda14cbcSMatt Macy case SA_NO_SECTION: 178716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "protocol requires a section")); 179eda14cbcSMatt Macy case SA_NO_PROPERTIES: 180716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "properties not found")); 181eda14cbcSMatt Macy case SA_NO_SUCH_SECTION: 182716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "section not found")); 183eda14cbcSMatt Macy case SA_PASSWORD_ENC: 184716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "passwords must be encrypted")); 185eda14cbcSMatt Macy case SA_SHARE_EXISTS: 186716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, 187716fd348SMartin Matuska "path or file is already shared")); 188eda14cbcSMatt Macy default: 189eda14cbcSMatt Macy (void) snprintf(errstr, sizeof (errstr), 190eda14cbcSMatt Macy dgettext(TEXT_DOMAIN, "unknown %d"), err); 191716fd348SMartin Matuska return (errstr); 192eda14cbcSMatt Macy } 193eda14cbcSMatt Macy } 194