diff options
Diffstat (limited to 'sys/contrib/openzfs/lib/libshare/libshare.c')
-rw-r--r-- | sys/contrib/openzfs/lib/libshare/libshare.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/sys/contrib/openzfs/lib/libshare/libshare.c b/sys/contrib/openzfs/lib/libshare/libshare.c new file mode 100644 index 000000000000..3695207e6fe7 --- /dev/null +++ b/sys/contrib/openzfs/lib/libshare/libshare.c @@ -0,0 +1,204 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or https://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011 Gunnar Beutner + * Copyright (c) 2018, 2022 by Delphix. All rights reserved. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <errno.h> +#include <libintl.h> +#include <sys/file.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <libzfs.h> +#include <libshare.h> +#include "libshare_impl.h" + +#define init_share(zfsname, path, shareopts) \ + { \ + .sa_zfsname = zfsname, \ + .sa_mountpoint = path, \ + .sa_shareopts = shareopts, \ + } + +#define VALIDATE_PROTOCOL(proto, ...) \ + if ((proto) < 0 || (proto) >= SA_PROTOCOL_COUNT) \ + return __VA_ARGS__ + +const char *const sa_protocol_names[SA_PROTOCOL_COUNT] = { + [SA_PROTOCOL_NFS] = "nfs", + [SA_PROTOCOL_SMB] = "smb", +}; + +static const sa_fstype_t *fstypes[SA_PROTOCOL_COUNT] = + {&libshare_nfs_type, &libshare_smb_type}; + +int +sa_enable_share(const char *zfsname, const char *mountpoint, + const char *shareopts, enum sa_protocol protocol) +{ + VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); + + const struct sa_share_impl args = + init_share(zfsname, mountpoint, shareopts); + return (fstypes[protocol]->enable_share(&args)); +} + +int +sa_disable_share(const char *mountpoint, enum sa_protocol protocol) +{ + VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); + + const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); + return (fstypes[protocol]->disable_share(&args)); +} + +boolean_t +sa_is_shared(const char *mountpoint, enum sa_protocol protocol) +{ + VALIDATE_PROTOCOL(protocol, B_FALSE); + + const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); + return (fstypes[protocol]->is_shared(&args)); +} + +void +sa_commit_shares(enum sa_protocol protocol) +{ + /* CSTYLED */ + VALIDATE_PROTOCOL(protocol, ); + + fstypes[protocol]->commit_shares(); +} + +void +sa_truncate_shares(enum sa_protocol protocol) +{ + /* CSTYLED */ + VALIDATE_PROTOCOL(protocol, ); + + if (fstypes[protocol]->truncate_shares != NULL) + fstypes[protocol]->truncate_shares(); +} + +int +sa_validate_shareopts(const char *options, enum sa_protocol protocol) +{ + VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); + + return (fstypes[protocol]->validate_shareopts(options)); +} + +/* + * sa_errorstr(err) + * + * convert an error value to an error string + */ +const char * +sa_errorstr(int err) +{ + static char errstr[32]; + + switch (err) { + case SA_OK: + return (dgettext(TEXT_DOMAIN, "ok")); + case SA_NO_SUCH_PATH: + return (dgettext(TEXT_DOMAIN, "path doesn't exist")); + case SA_NO_MEMORY: + return (dgettext(TEXT_DOMAIN, "no memory")); + case SA_DUPLICATE_NAME: + return (dgettext(TEXT_DOMAIN, "name in use")); + case SA_BAD_PATH: + return (dgettext(TEXT_DOMAIN, "bad path")); + case SA_NO_SUCH_GROUP: + return (dgettext(TEXT_DOMAIN, "no such group")); + case SA_CONFIG_ERR: + return (dgettext(TEXT_DOMAIN, "configuration error")); + case SA_SYSTEM_ERR: + return (dgettext(TEXT_DOMAIN, "system error")); + case SA_SYNTAX_ERR: + return (dgettext(TEXT_DOMAIN, "syntax error")); + case SA_NO_PERMISSION: + return (dgettext(TEXT_DOMAIN, "no permission")); + case SA_BUSY: + return (dgettext(TEXT_DOMAIN, "busy")); + case SA_NO_SUCH_PROP: + return (dgettext(TEXT_DOMAIN, "no such property")); + case SA_INVALID_NAME: + return (dgettext(TEXT_DOMAIN, "invalid name")); + case SA_INVALID_PROTOCOL: + return (dgettext(TEXT_DOMAIN, "invalid protocol")); + case SA_NOT_ALLOWED: + return (dgettext(TEXT_DOMAIN, "operation not allowed")); + case SA_BAD_VALUE: + return (dgettext(TEXT_DOMAIN, "bad property value")); + case SA_INVALID_SECURITY: + return (dgettext(TEXT_DOMAIN, "invalid security type")); + case SA_NO_SUCH_SECURITY: + return (dgettext(TEXT_DOMAIN, "security type not found")); + case SA_VALUE_CONFLICT: + return (dgettext(TEXT_DOMAIN, "property value conflict")); + case SA_NOT_IMPLEMENTED: + return (dgettext(TEXT_DOMAIN, "not implemented")); + case SA_INVALID_PATH: + return (dgettext(TEXT_DOMAIN, "invalid path")); + case SA_NOT_SUPPORTED: + return (dgettext(TEXT_DOMAIN, "operation not supported")); + case SA_PROP_SHARE_ONLY: + return (dgettext(TEXT_DOMAIN, "property not valid for group")); + case SA_NOT_SHARED: + return (dgettext(TEXT_DOMAIN, "not shared")); + case SA_NO_SUCH_RESOURCE: + return (dgettext(TEXT_DOMAIN, "no such resource")); + case SA_RESOURCE_REQUIRED: + return (dgettext(TEXT_DOMAIN, "resource name required")); + case SA_MULTIPLE_ERROR: + return (dgettext(TEXT_DOMAIN, + "errors from multiple protocols")); + case SA_PATH_IS_SUBDIR: + return (dgettext(TEXT_DOMAIN, "path is a subpath of share")); + case SA_PATH_IS_PARENTDIR: + return (dgettext(TEXT_DOMAIN, "path is parent of a share")); + case SA_NO_SECTION: + return (dgettext(TEXT_DOMAIN, "protocol requires a section")); + case SA_NO_PROPERTIES: + return (dgettext(TEXT_DOMAIN, "properties not found")); + case SA_NO_SUCH_SECTION: + return (dgettext(TEXT_DOMAIN, "section not found")); + case SA_PASSWORD_ENC: + return (dgettext(TEXT_DOMAIN, "passwords must be encrypted")); + case SA_SHARE_EXISTS: + return (dgettext(TEXT_DOMAIN, + "path or file is already shared")); + default: + (void) snprintf(errstr, sizeof (errstr), + dgettext(TEXT_DOMAIN, "unknown %d"), err); + return (errstr); + } +} |