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 9eda14cbcSMatt Macy * or http://www.opensolaris.org/os/licensing. 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> 30*716fd348SMartin 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 42*716fd348SMartin Matuska #define init_share(zfsname, path, shareopts) \ 43*716fd348SMartin Matuska { \ 44*716fd348SMartin Matuska .sa_zfsname = zfsname, \ 45*716fd348SMartin Matuska .sa_mountpoint = path, \ 46*716fd348SMartin Matuska .sa_shareopts = shareopts, \ 47eda14cbcSMatt Macy } 48eda14cbcSMatt Macy 49*716fd348SMartin Matuska #define VALIDATE_PROTOCOL(proto, ...) \ 50*716fd348SMartin Matuska if ((proto) < 0 || (proto) >= SA_PROTOCOL_COUNT) \ 51*716fd348SMartin Matuska return __VA_ARGS__ 52*716fd348SMartin Matuska 53*716fd348SMartin Matuska const char *const sa_protocol_names[SA_PROTOCOL_COUNT] = { 54*716fd348SMartin Matuska [SA_PROTOCOL_NFS] = "nfs", 55*716fd348SMartin Matuska [SA_PROTOCOL_SMB] = "smb", 56*716fd348SMartin Matuska }; 57*716fd348SMartin Matuska 58*716fd348SMartin Matuska static const sa_fstype_t *fstypes[SA_PROTOCOL_COUNT] = 59*716fd348SMartin Matuska {&libshare_nfs_type, &libshare_smb_type}; 60eda14cbcSMatt Macy 61eda14cbcSMatt Macy int 62eda14cbcSMatt Macy sa_enable_share(const char *zfsname, const char *mountpoint, 63*716fd348SMartin Matuska const char *shareopts, enum sa_protocol protocol) 64eda14cbcSMatt Macy { 65*716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); 66eda14cbcSMatt Macy 67*716fd348SMartin Matuska const struct sa_share_impl args = 68*716fd348SMartin Matuska init_share(zfsname, mountpoint, shareopts); 69*716fd348SMartin Matuska return (fstypes[protocol]->enable_share(&args)); 70eda14cbcSMatt Macy } 71eda14cbcSMatt Macy 72eda14cbcSMatt Macy int 73*716fd348SMartin Matuska sa_disable_share(const char *mountpoint, enum sa_protocol protocol) 74eda14cbcSMatt Macy { 75*716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); 76eda14cbcSMatt Macy 77*716fd348SMartin Matuska const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); 78*716fd348SMartin Matuska return (fstypes[protocol]->disable_share(&args)); 79eda14cbcSMatt Macy } 80eda14cbcSMatt Macy 81eda14cbcSMatt Macy boolean_t 82*716fd348SMartin Matuska sa_is_shared(const char *mountpoint, enum sa_protocol protocol) 83eda14cbcSMatt Macy { 84*716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, B_FALSE); 85eda14cbcSMatt Macy 86*716fd348SMartin Matuska const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); 87*716fd348SMartin Matuska return (fstypes[protocol]->is_shared(&args)); 88eda14cbcSMatt Macy } 89eda14cbcSMatt Macy 90eda14cbcSMatt Macy void 91*716fd348SMartin Matuska sa_commit_shares(enum sa_protocol protocol) 92eda14cbcSMatt Macy { 93*716fd348SMartin Matuska /* CSTYLED */ 94*716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, ); 95*716fd348SMartin Matuska 96*716fd348SMartin Matuska fstypes[protocol]->commit_shares(); 97eda14cbcSMatt Macy } 98*716fd348SMartin Matuska 99*716fd348SMartin Matuska int 100*716fd348SMartin Matuska sa_validate_shareopts(const char *options, enum sa_protocol protocol) 101*716fd348SMartin Matuska { 102*716fd348SMartin Matuska VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); 103*716fd348SMartin Matuska 104*716fd348SMartin 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 */ 112*716fd348SMartin 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: 119*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "ok")); 120eda14cbcSMatt Macy case SA_NO_SUCH_PATH: 121*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path doesn't exist")); 122eda14cbcSMatt Macy case SA_NO_MEMORY: 123*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no memory")); 124eda14cbcSMatt Macy case SA_DUPLICATE_NAME: 125*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "name in use")); 126eda14cbcSMatt Macy case SA_BAD_PATH: 127*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "bad path")); 128eda14cbcSMatt Macy case SA_NO_SUCH_GROUP: 129*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such group")); 130eda14cbcSMatt Macy case SA_CONFIG_ERR: 131*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "configuration error")); 132eda14cbcSMatt Macy case SA_SYSTEM_ERR: 133*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "system error")); 134eda14cbcSMatt Macy case SA_SYNTAX_ERR: 135*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "syntax error")); 136eda14cbcSMatt Macy case SA_NO_PERMISSION: 137*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no permission")); 138eda14cbcSMatt Macy case SA_BUSY: 139*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "busy")); 140eda14cbcSMatt Macy case SA_NO_SUCH_PROP: 141*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such property")); 142eda14cbcSMatt Macy case SA_INVALID_NAME: 143*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid name")); 144eda14cbcSMatt Macy case SA_INVALID_PROTOCOL: 145*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid protocol")); 146eda14cbcSMatt Macy case SA_NOT_ALLOWED: 147*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "operation not allowed")); 148eda14cbcSMatt Macy case SA_BAD_VALUE: 149*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "bad property value")); 150eda14cbcSMatt Macy case SA_INVALID_SECURITY: 151*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid security type")); 152eda14cbcSMatt Macy case SA_NO_SUCH_SECURITY: 153*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "security type not found")); 154eda14cbcSMatt Macy case SA_VALUE_CONFLICT: 155*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "property value conflict")); 156eda14cbcSMatt Macy case SA_NOT_IMPLEMENTED: 157*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "not implemented")); 158eda14cbcSMatt Macy case SA_INVALID_PATH: 159*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "invalid path")); 160eda14cbcSMatt Macy case SA_NOT_SUPPORTED: 161*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "operation not supported")); 162eda14cbcSMatt Macy case SA_PROP_SHARE_ONLY: 163*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "property not valid for group")); 164eda14cbcSMatt Macy case SA_NOT_SHARED: 165*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "not shared")); 166eda14cbcSMatt Macy case SA_NO_SUCH_RESOURCE: 167*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "no such resource")); 168eda14cbcSMatt Macy case SA_RESOURCE_REQUIRED: 169*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "resource name required")); 170eda14cbcSMatt Macy case SA_MULTIPLE_ERROR: 171*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, 172*716fd348SMartin Matuska "errors from multiple protocols")); 173eda14cbcSMatt Macy case SA_PATH_IS_SUBDIR: 174*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path is a subpath of share")); 175eda14cbcSMatt Macy case SA_PATH_IS_PARENTDIR: 176*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "path is parent of a share")); 177eda14cbcSMatt Macy case SA_NO_SECTION: 178*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "protocol requires a section")); 179eda14cbcSMatt Macy case SA_NO_PROPERTIES: 180*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "properties not found")); 181eda14cbcSMatt Macy case SA_NO_SUCH_SECTION: 182*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "section not found")); 183eda14cbcSMatt Macy case SA_PASSWORD_ENC: 184*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, "passwords must be encrypted")); 185eda14cbcSMatt Macy case SA_SHARE_EXISTS: 186*716fd348SMartin Matuska return (dgettext(TEXT_DOMAIN, 187*716fd348SMartin 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); 191*716fd348SMartin Matuska return (errstr); 192eda14cbcSMatt Macy } 193eda14cbcSMatt Macy } 194