usr/src/lib/libshare/nfs/libshare_nfs.c
author natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
Tue, 28 Oct 2008 03:34:04 -0700
changeset 7961 4b5e3051f38b
parent 6271 28c8a84426ca
child 8334 5f1c6a3b0fad
permissions -rw-r--r--
6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory 6753904 SVCCTL server side service 6741484 Local users cannot connect to CIFS shares from MacOS 10.5 6746898 win98 can not overwrite *.files 6753310 Incorrect handling of SmbNegotiate request when invalid dialects are negotiated. 6751123 Unable to join domain, core dump generated with IPMP setting 6722437 SMB_TRANS2_FIND returns wrong status code when stream file is passed 6716578 can not delete file in extended attribute name space in cifs client when cifs server is solaris PSARC 2008/584 Correction in nbmand behavior 6734067 Long delay when viewing MS Word Read-only file properties with nbmand enabled. PSARC/2007/281 NFS share properties for Montana compatibility 6475452 Need Solaris support for Montana approve file functionality in NFS 6582170 Host-based access control (approve file) 6749075 Unable to join domain if user password exceeds 20 characters 6612716 Join domain fails if hostname is > 15 chars 6753251 server signing: wrong signature is generated for the NetShareEnum reply 6757521 SMB daemon leaks memory after displaying GSS status 6760315 Local user cannot connnect to CIFS shares if CIFS server's hostname is not specified 6757333 Share publisher thread runs into infinite loop of displaying GSS major/minor status 6757132 smbd crashes at smb_idmap_batch_getmappings 6760876 security descriptor decoding function has a glitch 6761491 Cannot open or delete a named stream on a directory file. 6741449 Cleanup list in smbns_ads module 6593958 Users with restore privilege can take ownership of files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     1
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     2
 * CDDL HEADER START
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     3
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     7
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    11
 * and limitations under the License.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    12
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    18
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    19
 * CDDL HEADER END
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    20
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    21
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    22
/*
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    24
 * Use is subject to license terms.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    25
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    26
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    27
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    28
 * NFS specific functions
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    29
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    30
#include <stdio.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    31
#include <string.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    32
#include <ctype.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    33
#include <stdlib.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    34
#include <unistd.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    35
#include <zone.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    36
#include <errno.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    37
#include <locale.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    38
#include <signal.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    39
#include "libshare.h"
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    40
#include "libshare_impl.h"
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    41
#include <nfs/export.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    42
#include <pwd.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    43
#include <limits.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    44
#include <libscf.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    45
#include "nfslog_config.h"
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    46
#include "nfslogtab.h"
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    47
#include "libshare_nfs.h"
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    48
#include <rpcsvc/daemon_utils.h>
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    49
#include <nfs/nfs.h>
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
    50
#include <nfs/nfssys.h>
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    51
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    52
/* should really be in some global place */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    53
#define	DEF_WIN	30000
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    54
#define	OPT_CHUNK	1024
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    55
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    56
int debug = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    57
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
    58
#define	NFS_SERVER_SVC	"svc:/network/nfs/server:default"
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    59
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    60
/* internal functions */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    61
static int nfs_init();
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    62
static void nfs_fini();
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    63
static int nfs_enable_share(sa_share_t);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
    64
static int nfs_disable_share(sa_share_t, char *);
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
    65
static int nfs_validate_property(sa_handle_t, sa_property_t, sa_optionset_t);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    66
static int nfs_validate_security_mode(char *);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    67
static int nfs_is_security_opt(char *);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    68
static int nfs_parse_legacy_options(sa_group_t, char *);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    69
static char *nfs_format_options(sa_group_t, int);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    70
static int nfs_set_proto_prop(sa_property_t);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    71
static sa_protocol_properties_t nfs_get_proto_set();
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    72
static char *nfs_get_status();
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    73
static char *nfs_space_alias(char *);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
    74
static uint64_t nfs_features();
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    75
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    76
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    77
 * ops vector that provides the protocol specific info and operations
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    78
 * for share management.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    79
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    80
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    81
struct sa_plugin_ops sa_plugin_ops = {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    82
	SA_PLUGIN_VERSION,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    83
	"nfs",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    84
	nfs_init,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    85
	nfs_fini,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    86
	nfs_enable_share,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    87
	nfs_disable_share,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    88
	nfs_validate_property,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    89
	nfs_validate_security_mode,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    90
	nfs_is_security_opt,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    91
	nfs_parse_legacy_options,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    92
	nfs_format_options,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    93
	nfs_set_proto_prop,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    94
	nfs_get_proto_set,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    95
	nfs_get_status,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
    96
	nfs_space_alias,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
    97
	NULL,	/* update_legacy */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
    98
	NULL,	/* delete_legacy */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
    99
	NULL,	/* change_notify */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   100
	NULL,	/* enable_resource */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   101
	NULL,	/* disable_resource */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   102
	nfs_features,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   103
	NULL,	/* transient shares */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   104
	NULL,	/* notify resource */
6007
d57e38e8fdd1 PSARC 2005/695 CIFS Client on Solaris
thurlow
parents: 5951
diff changeset
   105
	NULL,	/* rename_resource */
d57e38e8fdd1 PSARC 2005/695 CIFS Client on Solaris
thurlow
parents: 5951
diff changeset
   106
	NULL,	/* run_command */
d57e38e8fdd1 PSARC 2005/695 CIFS Client on Solaris
thurlow
parents: 5951
diff changeset
   107
	NULL,	/* command_help */
d57e38e8fdd1 PSARC 2005/695 CIFS Client on Solaris
thurlow
parents: 5951
diff changeset
   108
	NULL	/* delete_proto_section */
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   109
};
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   110
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   111
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   112
 * list of support services needed
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   113
 * defines should come from head/rpcsvc/daemon_utils.h
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   114
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   115
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   116
static char *service_list_default[] =
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   117
	{ STATD, LOCKD, MOUNTD, NFSD, NFSMAPID, RQUOTAD, NULL };
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   118
static char *service_list_logging[] =
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   119
	{ STATD, LOCKD, MOUNTD, NFSD, NFSMAPID, RQUOTAD, NFSLOGD, NULL };
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   120
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   121
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   122
 * option definitions.  Make sure to keep the #define for the option
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   123
 * index just before the entry it is the index for. Changing the order
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   124
 * can cause breakage.  E.g OPT_RW is index 1 and must precede the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   125
 * line that includes the SHOPT_RW and OPT_RW entries.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   126
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   127
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   128
struct option_defs optdefs[] = {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   129
#define	OPT_RO		0
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   130
	{SHOPT_RO, OPT_RO, OPT_TYPE_ACCLIST},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   131
#define	OPT_RW		1
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   132
	{SHOPT_RW, OPT_RW, OPT_TYPE_ACCLIST},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   133
#define	OPT_ROOT	2
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   134
	{SHOPT_ROOT, OPT_ROOT, OPT_TYPE_ACCLIST},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   135
#define	OPT_SECURE	3
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   136
	{SHOPT_SECURE, OPT_SECURE, OPT_TYPE_DEPRECATED},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   137
#define	OPT_ANON	4
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   138
	{SHOPT_ANON, OPT_ANON, OPT_TYPE_USER},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   139
#define	OPT_WINDOW	5
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   140
	{SHOPT_WINDOW, OPT_WINDOW, OPT_TYPE_NUMBER},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   141
#define	OPT_NOSUID	6
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   142
	{SHOPT_NOSUID, OPT_NOSUID, OPT_TYPE_BOOLEAN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   143
#define	OPT_ACLOK	7
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   144
	{SHOPT_ACLOK, OPT_ACLOK, OPT_TYPE_BOOLEAN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   145
#define	OPT_NOSUB	8
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   146
	{SHOPT_NOSUB, OPT_NOSUB, OPT_TYPE_BOOLEAN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   147
#define	OPT_SEC		9
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   148
	{SHOPT_SEC, OPT_SEC, OPT_TYPE_SECURITY},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   149
#define	OPT_PUBLIC	10
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   150
	{SHOPT_PUBLIC, OPT_PUBLIC, OPT_TYPE_BOOLEAN, OPT_SHARE_ONLY},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   151
#define	OPT_INDEX	11
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   152
	{SHOPT_INDEX, OPT_INDEX, OPT_TYPE_FILE},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   153
#define	OPT_LOG		12
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   154
	{SHOPT_LOG, OPT_LOG, OPT_TYPE_LOGTAG},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   155
#define	OPT_CKSUM	13
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   156
	{SHOPT_CKSUM, OPT_CKSUM, OPT_TYPE_STRINGSET},
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   157
#define	OPT_NONE	14
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   158
	{SHOPT_NONE, OPT_NONE, OPT_TYPE_ACCLIST},
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   159
#define	OPT_ROOT_MAPPING	15
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   160
	{SHOPT_ROOT_MAPPING, OPT_ROOT_MAPPING, OPT_TYPE_USER},
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   161
#define	OPT_CHARSET_MAP	16
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   162
	{"", OPT_CHARSET_MAP, OPT_TYPE_ACCLIST},
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   163
#ifdef VOLATILE_FH_TEST	/* XXX added for testing volatile fh's only */
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   164
#define	OPT_VOLFH	17
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   165
	{SHOPT_VOLFH, OPT_VOLFH},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   166
#endif /* VOLATILE_FH_TEST */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   167
	NULL
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   168
};
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   169
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   170
/*
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   171
 * Codesets that may need to be converted to UTF-8 for file paths.
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   172
 * Add new names here to add new property support. If we ever get a
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   173
 * way to query the kernel for character sets, this should become
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   174
 * dynamically loaded. Make sure changes here are reflected in
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   175
 * cmd/fs.d/nfs/mountd/nfscmd.c
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   176
 */
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   177
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   178
static char *legal_conv[] = {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   179
	"euc-cn",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   180
	"euc-jp",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   181
	"euc-jpms",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   182
	"euc-kr",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   183
	"euc-tw",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   184
	"iso8859-1",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   185
	"iso8859-2",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   186
	"iso8859-5",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   187
	"iso8859-6",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   188
	"iso8859-7",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   189
	"iso8859-8",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   190
	"iso8859-9",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   191
	"iso8859-13",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   192
	"iso8859-15",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   193
	"koi8-r",
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   194
	NULL
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   195
};
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   196
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   197
/*
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   198
 * list of properties that are related to security flavors.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   199
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   200
static char *seclist[] = {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   201
	SHOPT_RO,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   202
	SHOPT_RW,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   203
	SHOPT_ROOT,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   204
	SHOPT_WINDOW,
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   205
	SHOPT_NONE,
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   206
	SHOPT_ROOT_MAPPING,
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   207
	NULL
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   208
};
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   209
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   210
/* structure for list of securities */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   211
struct securities {
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   212
	sa_security_t security;
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   213
	struct securities *next;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   214
};
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   215
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   216
/*
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   217
 * findcharset(charset)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   218
 *
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   219
 * Returns B_TRUE if the charset is a legal conversion otherwise
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   220
 * B_FALSE. This will need to be rewritten to be more efficient when
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   221
 * we have a dynamic list of legal conversions.
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   222
 */
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   223
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   224
static boolean_t
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   225
findcharset(char *charset)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   226
{
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   227
	int i;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   228
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   229
	for (i = 0; legal_conv[i] != NULL; i++)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   230
		if (strcmp(charset, legal_conv[i]) == 0)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   231
			return (B_TRUE);
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   232
	return (B_FALSE);
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   233
}
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   234
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   235
/*
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   236
 * findopt(name)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   237
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   238
 * Lookup option "name" in the option table and return the table
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   239
 * index.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   240
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   241
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   242
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   243
findopt(char *name)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   244
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   245
	int i;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   246
	if (name != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   247
		for (i = 0; optdefs[i].tag != NULL; i++) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   248
			if (strcmp(optdefs[i].tag, name) == 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   249
				return (i);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   250
		}
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   251
		if (findcharset(name))
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   252
			return (OPT_CHARSET_MAP);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   253
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   254
	return (-1);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   255
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   256
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   257
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   258
 * gettype(name)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   259
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   260
 * Return the type of option "name".
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   261
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   262
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   263
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   264
gettype(char *name)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   265
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   266
	int optdef;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   267
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   268
	optdef = findopt(name);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   269
	if (optdef != -1)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   270
		return (optdefs[optdef].type);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   271
	return (OPT_TYPE_ANY);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   272
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   273
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   274
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   275
 * nfs_validate_security_mode(mode)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   276
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   277
 * is the specified mode string a valid one for use with NFS?
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   278
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   279
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   280
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   281
nfs_validate_security_mode(char *mode)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   282
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   283
	seconfig_t secinfo;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   284
	int err;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   285
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   286
	(void) memset(&secinfo, '\0', sizeof (secinfo));
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   287
	err = nfs_getseconfig_byname(mode, &secinfo);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   288
	if (err == SC_NOERROR)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   289
		return (1);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   290
	return (0);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   291
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   292
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   293
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   294
 * nfs_is_security_opt(tok)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   295
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   296
 * check to see if tok represents an option that is only valid in some
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   297
 * security flavor.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   298
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   299
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   300
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   301
nfs_is_security_opt(char *tok)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   302
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   303
	int i;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   304
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   305
	for (i = 0; seclist[i] != NULL; i++) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   306
		if (strcmp(tok, seclist[i]) == 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   307
			return (1);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   308
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   309
	return (0);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   310
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   311
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   312
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   313
 * find_security(seclist, sec)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   314
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   315
 * Walk the current list of security flavors and return true if it is
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   316
 * present, else return false.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   317
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   318
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   319
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   320
find_security(struct securities *seclist, sa_security_t sec)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   321
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   322
	while (seclist != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   323
		if (seclist->security == sec)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   324
			return (1);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   325
		seclist = seclist->next;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   326
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   327
	return (0);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   328
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   329
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   330
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   331
 * make_security_list(group, securitymodes, proto)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   332
 *	go through the list of securitymodes and add them to the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   333
 *	group's list of security optionsets. We also keep a list of
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   334
 *	those optionsets so we don't have to find them later. All of
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   335
 *	these will get copies of the same properties.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   336
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   337
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   338
static struct securities *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   339
make_security_list(sa_group_t group, char *securitymodes, char *proto)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   340
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   341
	char *tok, *next = NULL;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   342
	struct securities *curp, *headp = NULL, *prev;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   343
	sa_security_t check;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   344
	int freetok = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   345
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   346
	for (tok = securitymodes; tok != NULL; tok = next) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   347
		next = strchr(tok, ':');
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   348
		if (next != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   349
			*next++ = '\0';
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   350
		if (strcmp(tok, "default") == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   351
			/* resolve default into the real type */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   352
			tok = nfs_space_alias(tok);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   353
			freetok = 1;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   354
		}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   355
		check = sa_get_security(group, tok, proto);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   356
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   357
		/* add to the security list if it isn't there already */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   358
		if (check == NULL || !find_security(headp, check)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   359
			curp = (struct securities *)calloc(1,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   360
			    sizeof (struct securities));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   361
			if (curp != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   362
				if (check == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   363
					curp->security = sa_create_security(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   364
					    group, tok, proto);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   365
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   366
					curp->security = check;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   367
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   368
				/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   369
				 * note that the first time through the loop,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   370
				 * headp will be NULL and prev will be
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   371
				 * undefined.  Since headp is NULL, we set
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   372
				 * both it and prev to the curp (first
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   373
				 * structure to be allocated).
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   374
				 *
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   375
				 * later passes through the loop will have
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   376
				 * headp not being NULL and prev will be used
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   377
				 * to allocate at the end of the list.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   378
				 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   379
				if (headp == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   380
					headp = curp;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   381
					prev = curp;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   382
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   383
					prev->next = curp;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   384
					prev = curp;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   385
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   386
			}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   387
		}
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   388
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   389
		if (freetok) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   390
			freetok = 0;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   391
			sa_free_attr_string(tok);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   392
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   393
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   394
	return (headp);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   395
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   396
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   397
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   398
free_security_list(struct securities *sec)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   399
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   400
	struct securities *next;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   401
	if (sec != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   402
		for (next = sec->next; sec != NULL; sec = next) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   403
			next = sec->next;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   404
			free(sec);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   405
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   406
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   407
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   408
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   409
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   410
 * nfs_alistcat(str1, str2, sep)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   411
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   412
 * concatenate str1 and str2 into a new string using sep as a separate
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   413
 * character. If memory allocation fails, return NULL;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   414
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   415
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   416
static char *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   417
nfs_alistcat(char *str1, char *str2, char sep)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   418
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   419
	char *newstr;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   420
	size_t len;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   421
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   422
	len = strlen(str1) + strlen(str2) + 2;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   423
	newstr = (char *)malloc(len);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   424
	if (newstr != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   425
		(void) snprintf(newstr, len, "%s%c%s", str1, sep, str2);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   426
	return (newstr);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   427
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   428
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   429
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   430
 * add_security_prop(sec, name, value, persist)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   431
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   432
 * Add the property to the securities structure. This accumulates
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   433
 * properties for as part of parsing legacy options.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   434
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   435
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   436
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   437
add_security_prop(struct securities *sec, char *name, char *value,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   438
			int persist, int iszfs)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   439
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   440
	sa_property_t prop;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   441
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   442
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   443
	for (; sec != NULL; sec = sec->next) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   444
		if (value == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   445
			if (strcmp(name, SHOPT_RW) == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   446
			    strcmp(name, SHOPT_RO) == 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   447
				value = "*";
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   448
			else
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   449
				value = "true";
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   450
		}
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   451
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   452
		/*
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   453
		 * Get the existing property, if it exists, so we can
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   454
		 * determine what to do with it. The ro/rw/root
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   455
		 * properties can be merged if multiple instances of
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   456
		 * these properies are given. For example, if "rw"
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   457
		 * exists with a value "host1" and a later token of
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   458
		 * rw="host2" is seen, the values are merged into a
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   459
		 * single rw="host1:host2".
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   460
		 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   461
		prop = sa_get_property(sec->security, name);
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   462
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   463
		if (prop != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   464
			char *oldvalue;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   465
			char *newvalue;
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   466
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   467
			/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   468
			 * The security options of ro/rw/root might appear
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   469
			 * multiple times. If they do, the values need to be
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   470
			 * merged into an access list. If it was previously
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   471
			 * empty, the new value alone is added.
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   472
			 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   473
			oldvalue = sa_get_property_attr(prop, "value");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   474
			if (oldvalue != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   475
				/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   476
				 * The general case is to concatenate the new
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   477
				 * value onto the old value for multiple
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   478
				 * rw(ro/root) properties. A special case
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   479
				 * exists when either the old or new is the
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   480
				 * "all" case. In the special case, if both
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   481
				 * are "all", then it is "all", else if one is
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   482
				 * an access-list, that replaces the "all".
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   483
				 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   484
				if (strcmp(oldvalue, "*") == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   485
					/* Replace old value with new value. */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   486
					newvalue = strdup(value);
5454
c6999f08fe00 6603480 sharemgr doesn't allow shares to have more restricted access than its group
dougm
parents: 5331
diff changeset
   487
				} else if (strcmp(value, "*") == 0 ||
c6999f08fe00 6603480 sharemgr doesn't allow shares to have more restricted access than its group
dougm
parents: 5331
diff changeset
   488
				    strcmp(oldvalue, value) == 0) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   489
					/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   490
					 * Keep old value and ignore
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   491
					 * the new value.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   492
					 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   493
					newvalue = NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   494
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   495
					/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   496
					 * Make a new list of old plus new
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   497
					 * access-list.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   498
					 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   499
					newvalue = nfs_alistcat(oldvalue,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   500
					    value, ':');
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   501
				}
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   502
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   503
				if (newvalue != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   504
					(void) sa_remove_property(prop);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   505
					prop = sa_create_property(name,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   506
					    newvalue);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   507
					ret = sa_add_property(sec->security,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   508
					    prop);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   509
					free(newvalue);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   510
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   511
				if (oldvalue != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   512
					sa_free_attr_string(oldvalue);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   513
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   514
		} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   515
			prop = sa_create_property(name, value);
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   516
			ret = sa_add_property(sec->security, prop);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   517
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   518
		if (ret == SA_OK && !iszfs) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   519
			ret = sa_commit_properties(sec->security, !persist);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   520
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   521
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   522
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   523
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   524
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   525
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   526
 * check to see if group/share is persistent.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   527
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   528
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   529
is_persistent(sa_group_t group)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   530
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   531
	char *type;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   532
	int persist = 1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   533
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   534
	type = sa_get_group_attr(group, "type");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   535
	if (type != NULL && strcmp(type, "persist") != 0)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   536
		persist = 0;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   537
	if (type != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   538
		sa_free_attr_string(type);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   539
	return (persist);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   540
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   541
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   542
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   543
 * invalid_security(options)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   544
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   545
 * search option string for any invalid sec= type.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   546
 * return true (1) if any are not valid else false (0)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   547
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   548
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   549
invalid_security(char *options)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   550
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   551
	char *copy, *base, *token, *value;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   552
	int ret = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   553
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   554
	copy = strdup(options);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   555
	token = base = copy;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   556
	while (token != NULL && ret == 0) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   557
		token = strtok(base, ",");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   558
		base = NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   559
		if (token != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   560
			value = strchr(token, '=');
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   561
			if (value != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   562
				*value++ = '\0';
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   563
			if (strcmp(token, "sec") == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   564
				/* HAVE security flavors so check them */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   565
				char *tok, *next;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   566
				for (next = NULL, tok = value; tok != NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   567
				    tok = next) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   568
					next = strchr(tok, ':');
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   569
					if (next != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   570
						*next++ = '\0';
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   571
					ret = !nfs_validate_security_mode(tok);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   572
					if (ret)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   573
						break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   574
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   575
			}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   576
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   577
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   578
	if (copy != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   579
		free(copy);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   580
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   581
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   582
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   583
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   584
 * nfs_parse_legacy_options(group, options)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   585
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   586
 * Parse the old style options into internal format and store on the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   587
 * specified group.  Group could be a share for full legacy support.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   588
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   589
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   590
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   591
nfs_parse_legacy_options(sa_group_t group, char *options)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   592
{
4704
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   593
	char *dup;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   594
	char *base;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   595
	char *token;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   596
	sa_optionset_t optionset;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   597
	struct securities *security_list = NULL;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   598
	sa_property_t prop;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   599
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   600
	int iszfs = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   601
	sa_group_t parent;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   602
	int persist = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   603
	char *lasts;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   604
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   605
	/* do we have an existing optionset? */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   606
	optionset = sa_get_optionset(group, "nfs");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   607
	if (optionset == NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   608
		/* didn't find existing optionset so create one */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   609
		optionset = sa_create_optionset(group, "nfs");
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   610
	} else {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   611
		/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   612
		 * Have an existing optionset . Ideally, we would need
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   613
		 * to compare options in order to detect errors. For
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   614
		 * now, we assume that the first optionset is the
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   615
		 * correct one and the others will be the same. An
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   616
		 * empty optionset is the same as no optionset so we
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   617
		 * don't want to exit in that case. Getting an empty
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   618
		 * optionset can occur with ZFS property checking.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   619
		 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   620
		if (sa_get_property(optionset, NULL) != NULL)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   621
			return (ret);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   622
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   623
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   624
	if (strcmp(options, SHOPT_RW) == 0) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   625
		/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   626
		 * there is a special case of only the option "rw"
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   627
		 * being the default option. We don't have to do
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   628
		 * anything.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   629
		 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   630
		return (ret);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   631
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   632
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   633
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   634
	 * check if security types are present and validate them. If
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   635
	 * any are not legal, fail.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   636
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   637
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   638
	if (invalid_security(options)) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   639
		return (SA_INVALID_SECURITY);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   640
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   641
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   642
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   643
	 * in order to not attempt to change ZFS properties unless
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   644
	 * absolutely necessary, we never do it in the legacy parsing.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   645
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   646
	if (sa_is_share(group)) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   647
		char *zfs;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   648
		parent = sa_get_parent_group(group);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   649
		if (parent != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   650
			zfs = sa_get_group_attr(parent, "zfs");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   651
			if (zfs != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   652
				sa_free_attr_string(zfs);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   653
				iszfs++;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   654
			}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   655
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   656
	} else {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   657
		iszfs = sa_group_is_zfs(group);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   658
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   659
4704
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   660
	/* We need a copy of options for the next part. */
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   661
	dup = strdup(options);
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   662
	if (dup == NULL)
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   663
		return (SA_NO_MEMORY);
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   664
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   665
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   666
	 * we need to step through each option in the string and then
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   667
	 * add either the option or the security option as needed. If
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   668
	 * this is not a persistent share, don't commit to the
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   669
	 * repository. If there is an error, we also want to abort the
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   670
	 * processing and report it.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   671
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   672
	persist = is_persistent(group);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   673
	base = dup;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   674
	token = dup;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   675
	lasts = NULL;
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
   676
	while (token != NULL && ret == SA_OK) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   677
		ret = SA_OK;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   678
		token = strtok_r(base, ",", &lasts);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   679
		base = NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   680
		if (token != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   681
			char *value;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   682
			/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   683
			 * if the option has a value, it will have an '=' to
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   684
			 * separate the name from the value. The following
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   685
			 * code will result in value != NULL and token
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   686
			 * pointing to just the name if there is a value.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   687
			 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   688
			value = strchr(token, '=');
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   689
			if (value != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   690
				*value++ = '\0';
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   691
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   692
			if (strcmp(token, "sec") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   693
			    strcmp(token, "secure") == 0) {
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   694
				/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   695
				 * Once in security parsing, we only
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   696
				 * do security. We do need to move
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   697
				 * between the security node and the
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   698
				 * toplevel. The security tag goes on
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   699
				 * the root while the following ones
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   700
				 * go on the security.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   701
				 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   702
				if (security_list != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   703
					/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   704
					 * have an old list so close it and
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   705
					 * start the new
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   706
					 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   707
					free_security_list(security_list);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   708
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   709
				if (strcmp(token, "secure") == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   710
					value = "dh";
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   711
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   712
					if (value == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   713
						ret = SA_SYNTAX_ERR;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   714
						break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   715
					}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   716
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   717
				security_list = make_security_list(group,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   718
				    value, "nfs");
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   719
			} else {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   720
				/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   721
				 * Note that the "old" syntax allowed a
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   722
				 * default security model This must be
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   723
				 * accounted for and internally converted to
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   724
				 * "standard" security structure.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   725
				 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   726
				if (nfs_is_security_opt(token)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   727
					if (security_list == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   728
						/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   729
						 * need to have a
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   730
						 * security
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   731
						 * option. This will
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   732
						 * be "closed" when a
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   733
						 * defined "sec="
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   734
						 * option is
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   735
						 * seen. This is
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   736
						 * technically an
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   737
						 * error but will be
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   738
						 * allowed with
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   739
						 * warning.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   740
						 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   741
						security_list =
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   742
						    make_security_list(group,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   743
						    "default",
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   744
						    "nfs");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   745
					}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   746
					if (security_list != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   747
						ret = add_security_prop(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   748
						    security_list, token,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   749
						    value, persist, iszfs);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   750
					} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   751
						ret = SA_NO_MEMORY;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   752
					}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   753
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   754
					/* regular options */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   755
					if (value == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   756
						if (strcmp(token, SHOPT_RW) ==
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   757
						    0 || strcmp(token,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   758
						    SHOPT_RO) == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   759
							value = "*";
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   760
						} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   761
							value = "global";
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   762
							if (strcmp(token,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   763
							    SHOPT_LOG) != 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   764
								value = "true";
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   765
							}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   766
						}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   767
					}
4372
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   768
					/*
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   769
					 * In all cases, create the
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   770
					 * property specified. If the
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   771
					 * value was NULL, the default
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   772
					 * value will have been
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   773
					 * substituted.
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   774
					 */
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   775
					prop = sa_create_property(token, value);
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   776
					ret =  sa_add_property(optionset, prop);
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   777
					if (ret != SA_OK)
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   778
						break;
bec4e9eb1f01 6563921 Fix for 6549790 breaks "share -o anon=0"
dougm
parents: 4345
diff changeset
   779
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   780
					if (!iszfs) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   781
						ret = sa_commit_properties(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   782
						    optionset, !persist);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   783
					}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   784
				}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   785
			}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   786
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   787
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   788
	if (security_list != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   789
		free_security_list(security_list);
4704
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   790
f0e5c3bd2261 6559697 sharemgr: nfs_parse_legacy_options() leaks memory, segfaults on failure
dougm
parents: 4543
diff changeset
   791
	free(dup);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   792
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   793
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   794
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   795
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   796
 * is_a_number(number)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   797
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   798
 * is the string a number in one of the forms we want to use?
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   799
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   800
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   801
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   802
is_a_number(char *number)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   803
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   804
	int ret = 1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   805
	int hex = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   806
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   807
	if (strncmp(number, "0x", 2) == 0) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   808
		number += 2;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   809
		hex = 1;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   810
	} else if (*number == '-') {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   811
		number++; /* skip the minus */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   812
	}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   813
	while (ret == 1 && *number != '\0') {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   814
		if (hex) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   815
			ret = isxdigit(*number++);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   816
		} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   817
			ret = isdigit(*number++);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   818
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   819
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   820
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   821
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   822
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   823
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   824
 * Look for the specified tag in the configuration file. If it is found,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   825
 * enable logging and set the logging configuration information for exp.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   826
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   827
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   828
configlog(struct exportdata *exp, char *tag)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   829
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   830
	nfsl_config_t *configlist = NULL, *configp;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   831
	int error = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   832
	char globaltag[] = DEFAULTTAG;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   833
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   834
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   835
	 * Sends config errors to stderr
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   836
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   837
	nfsl_errs_to_syslog = B_FALSE;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   838
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   839
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   840
	 * get the list of configuration settings
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   841
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   842
	error = nfsl_getconfig_list(&configlist);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   843
	if (error) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   844
		(void) fprintf(stderr,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   845
		    dgettext(TEXT_DOMAIN, "Cannot get log configuration: %s\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   846
		    strerror(error));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   847
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   848
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   849
	if (tag == NULL)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   850
		tag = globaltag;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   851
	if ((configp = nfsl_findconfig(configlist, tag, &error)) == NULL) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   852
		nfsl_freeconfig_list(&configlist);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   853
		(void) fprintf(stderr,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   854
		    dgettext(TEXT_DOMAIN, "No tags matching \"%s\"\n"), tag);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   855
		/* bad configuration */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   856
		error = ENOENT;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   857
		goto err;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   858
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   859
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   860
	if ((exp->ex_tag = strdup(tag)) == NULL) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   861
		error = ENOMEM;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   862
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   863
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   864
	if ((exp->ex_log_buffer = strdup(configp->nc_bufferpath)) == NULL) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   865
		error = ENOMEM;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   866
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   867
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   868
	exp->ex_flags |= EX_LOG;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   869
	if (configp->nc_rpclogpath != NULL)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   870
		exp->ex_flags |= EX_LOG_ALLOPS;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   871
out:
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   872
	if (configlist != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   873
		nfsl_freeconfig_list(&configlist);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   874
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   875
err:
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   876
	if (error != 0) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   877
		if (exp->ex_flags != NULL)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   878
			free(exp->ex_tag);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   879
		if (exp->ex_log_buffer != NULL)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   880
			free(exp->ex_log_buffer);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   881
		(void) fprintf(stderr,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   882
		    dgettext(TEXT_DOMAIN, "Cannot set log configuration: %s\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   883
		    strerror(error));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   884
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   885
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   886
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   887
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   888
 * fill_export_from_optionset(export, optionset)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   889
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   890
 * In order to share, we need to set all the possible general options
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   891
 * into the export structure. Share info will be filled in by the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   892
 * caller. Various property values get turned into structure specific
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   893
 * values.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   894
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   895
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   896
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   897
fill_export_from_optionset(struct exportdata *export, sa_optionset_t optionset)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   898
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   899
	sa_property_t option;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   900
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   901
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   902
	for (option = sa_get_property(optionset, NULL);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   903
	    option != NULL; option = sa_get_next_property(option)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   904
		char *name;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   905
		char *value;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   906
		uint32_t val;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   907
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   908
		/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   909
		 * since options may be set/reset multiple times, always do an
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   910
		 * explicit set or clear of the option. This allows defaults
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
   911
		 * to be set and then the protocol specific to override.
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   912
		 */
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
   913
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   914
		name = sa_get_property_attr(option, "type");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   915
		value = sa_get_property_attr(option, "value");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   916
		switch (findopt(name)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   917
		case OPT_ANON:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   918
			if (value != NULL && is_a_number(value)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   919
				val = strtoul(value, NULL, 0);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   920
			} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   921
				struct passwd *pw;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   922
				pw = getpwnam(value != NULL ? value : "nobody");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   923
				if (pw != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   924
					val = pw->pw_uid;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   925
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   926
					val = UID_NOBODY;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   927
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   928
				endpwent();
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   929
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   930
			export->ex_anon = val;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   931
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   932
		case OPT_NOSUID:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   933
			if (value != NULL && (strcasecmp(value, "true") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   934
			    strcmp(value, "1") == 0))
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   935
				export->ex_flags |= EX_NOSUID;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   936
			else
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   937
				export->ex_flags &= ~EX_NOSUID;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   938
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   939
		case OPT_ACLOK:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   940
			if (value != NULL && (strcasecmp(value, "true") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   941
			    strcmp(value, "1") == 0))
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   942
				export->ex_flags |= EX_ACLOK;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   943
			else
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   944
				export->ex_flags &= ~EX_ACLOK;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   945
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   946
		case OPT_NOSUB:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   947
			if (value != NULL && (strcasecmp(value, "true") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   948
			    strcmp(value, "1") == 0))
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   949
				export->ex_flags |= EX_NOSUB;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   950
			else
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   951
				export->ex_flags &= ~EX_NOSUB;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   952
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   953
		case OPT_PUBLIC:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   954
			if (value != NULL && (strcasecmp(value, "true") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   955
			    strcmp(value, "1") == 0))
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   956
				export->ex_flags |= EX_PUBLIC;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   957
			else
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   958
				export->ex_flags &= ~EX_PUBLIC;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   959
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   960
		case OPT_INDEX:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   961
			if (value != NULL && (strcmp(value, "..") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   962
			    strchr(value, '/') != NULL)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   963
				/* this is an error */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   964
				(void) printf(dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   965
				    "NFS: index=\"%s\" not valid;"
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   966
				    "must be a filename.\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   967
				    value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   968
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   969
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   970
			if (value != NULL && *value != '\0' &&
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   971
			    strcmp(value, ".") != 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   972
				/* valid index file string */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   973
				if (export->ex_index != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   974
					/* left over from "default" */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   975
					free(export->ex_index);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   976
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   977
				/* remember to free */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   978
				export->ex_index = strdup(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   979
				if (export->ex_index == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   980
					(void) printf(dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   981
					    "NFS: out of memory setting "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   982
					    "index property\n"));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   983
					break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   984
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   985
				export->ex_flags |= EX_INDEX;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   986
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   987
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   988
		case OPT_LOG:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   989
			if (value == NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   990
				value = strdup("global");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   991
			if (value != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   992
				configlog(export,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   993
				    strlen(value) ? value : "global");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
   994
			break;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   995
		case OPT_CHARSET_MAP:
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   996
			/*
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   997
			 * Set EX_CHARMAP when there is at least one
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   998
			 * charmap conversion property. This will get
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
   999
			 * checked by the nfs server when it needs to.
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1000
			 */
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1001
			export->ex_flags |= EX_CHARMAP;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1002
			break;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1003
		default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1004
			/* have a syntactic error */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1005
			(void) printf(dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1006
			    "NFS: unrecognized option %s=%s\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1007
			    name, value != NULL ? value : "");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1008
			break;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1009
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1010
		if (name != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1011
			sa_free_attr_string(name);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1012
		if (value != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1013
			sa_free_attr_string(value);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1014
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1015
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1016
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1017
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1018
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1019
 * cleanup_export(export)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1020
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1021
 * Cleanup the allocated areas so we don't leak memory
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1022
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1023
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1024
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1025
cleanup_export(struct exportdata *export)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1026
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1027
	int i;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1028
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1029
	if (export->ex_index != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1030
		free(export->ex_index);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1031
	if (export->ex_secinfo != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1032
		for (i = 0; i < export->ex_seccnt; i++)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1033
			if (export->ex_secinfo[i].s_rootnames != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1034
				free(export->ex_secinfo[i].s_rootnames);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1035
		free(export->ex_secinfo);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1036
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1037
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1038
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1039
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1040
 * Given a seconfig entry and a colon-separated
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1041
 * list of names, allocate an array big enough
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1042
 * to hold the root list, then convert each name to
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1043
 * a principal name according to the security
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1044
 * info and assign it to an array element.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1045
 * Return the array and its size.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1046
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1047
static caddr_t *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1048
get_rootnames(seconfig_t *sec, char *list, int *count)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1049
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1050
	caddr_t *a;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1051
	int c, i;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1052
	char *host, *p;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1053
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1054
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1055
	 * Count the number of strings in the list.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1056
	 * This is the number of colon separators + 1.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1057
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1058
	c = 1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1059
	for (p = list; *p; p++)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1060
		if (*p == ':')
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1061
			c++;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1062
	*count = c;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1063
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1064
	a = (caddr_t *)malloc(c * sizeof (char *));
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1065
	if (a == NULL) {
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1066
		(void) printf(dgettext(TEXT_DOMAIN,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1067
		    "get_rootnames: no memory\n"));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1068
	} else {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1069
		for (i = 0; i < c; i++) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1070
			host = strtok(list, ":");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1071
			if (!nfs_get_root_principal(sec, host, &a[i])) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1072
				free(a);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1073
				a = NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1074
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1075
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1076
			list = NULL;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1077
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1078
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1079
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1080
	return (a);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1081
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1082
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1083
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1084
 * fill_security_from_secopts(sp, secopts)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1085
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1086
 * Fill the secinfo structure from the secopts optionset.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1087
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1088
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1089
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1090
fill_security_from_secopts(struct secinfo *sp, sa_security_t secopts)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1091
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1092
	sa_property_t prop;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1093
	char *type;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1094
	int longform;
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  1095
	int err = SC_NOERROR;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1096
	uint32_t val;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1097
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1098
	type = sa_get_security_attr(secopts, "sectype");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1099
	if (type != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1100
		/* named security type needs secinfo to be filled in */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1101
		err = nfs_getseconfig_byname(type, &sp->s_secinfo);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1102
		sa_free_attr_string(type);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1103
		if (err != SC_NOERROR)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1104
			return (err);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1105
	} else {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1106
		/* default case */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1107
		err = nfs_getseconfig_default(&sp->s_secinfo);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1108
		if (err != SC_NOERROR)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1109
			return (err);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1110
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1111
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  1112
	err = SA_OK;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1113
	for (prop = sa_get_property(secopts, NULL);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1114
	    prop != NULL && err == SA_OK;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1115
	    prop = sa_get_next_property(prop)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1116
		char *name;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1117
		char *value;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1118
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1119
		name = sa_get_property_attr(prop, "type");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1120
		value = sa_get_property_attr(prop, "value");
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1121
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1122
		longform = value != NULL && strcmp(value, "*") != 0;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1123
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1124
		switch (findopt(name)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1125
		case OPT_RO:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1126
			sp->s_flags |= longform ? M_ROL : M_RO;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1127
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1128
		case OPT_RW:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1129
			sp->s_flags |= longform ? M_RWL : M_RW;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1130
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1131
		case OPT_ROOT:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1132
			sp->s_flags |= M_ROOT;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1133
			/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1134
			 * if we are using AUTH_UNIX, handle like other things
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1135
			 * such as RO/RW
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1136
			 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1137
			if (sp->s_secinfo.sc_rpcnum == AUTH_UNIX)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1138
				continue;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1139
			/* not AUTH_UNIX */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1140
			if (value != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1141
				sp->s_rootnames = get_rootnames(&sp->s_secinfo,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1142
				    value, &sp->s_rootcnt);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1143
				if (sp->s_rootnames == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1144
					err = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1145
					(void) fprintf(stderr,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1146
					    dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1147
					    "Bad root list\n"));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1148
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1149
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1150
			break;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1151
		case OPT_NONE:
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1152
			sp->s_flags |= M_NONE;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1153
			break;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1154
		case OPT_WINDOW:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1155
			if (value != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1156
				sp->s_window = atoi(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1157
				/* just in case */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1158
				if (sp->s_window < 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1159
					sp->s_window = DEF_WIN;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1160
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1161
			break;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1162
		case OPT_ROOT_MAPPING:
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1163
			if (value != NULL && is_a_number(value)) {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1164
				val = strtoul(value, NULL, 0);
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1165
			} else {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1166
				struct passwd *pw;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1167
				pw = getpwnam(value != NULL ? value : "nobody");
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1168
				if (pw != NULL) {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1169
					val = pw->pw_uid;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1170
				} else {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1171
					val = UID_NOBODY;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1172
				}
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1173
				endpwent();
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1174
			}
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1175
			sp->s_rootid = val;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1176
			break;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1177
		default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1178
			break;
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  1179
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1180
		if (name != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1181
			sa_free_attr_string(name);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1182
		if (value != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1183
			sa_free_attr_string(value);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1184
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1185
	/* if rw/ro options not set, use default of RW */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1186
	if ((sp->s_flags & NFS_RWMODES) == 0)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1187
		sp->s_flags |= M_RW;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1188
	return (err);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1189
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1190
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1191
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1192
 * This is for testing only
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1193
 * It displays the export structure that
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1194
 * goes into the kernel.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1195
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1196
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1197
printarg(char *path, struct exportdata *ep)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1198
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1199
	int i, j;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1200
	struct secinfo *sp;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1201
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1202
	if (debug == 0)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1203
		return;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1204
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1205
	(void) printf("%s:\n", path);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1206
	(void) printf("\tex_version = %d\n", ep->ex_version);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1207
	(void) printf("\tex_path = %s\n", ep->ex_path);
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1208
	(void) printf("\tex_pathlen = %ld\n", (ulong_t)ep->ex_pathlen);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1209
	(void) printf("\tex_flags: (0x%02x) ", ep->ex_flags);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1210
	if (ep->ex_flags & EX_NOSUID)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1211
		(void) printf("NOSUID ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1212
	if (ep->ex_flags & EX_ACLOK)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1213
		(void) printf("ACLOK ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1214
	if (ep->ex_flags & EX_PUBLIC)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1215
		(void) printf("PUBLIC ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1216
	if (ep->ex_flags & EX_NOSUB)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1217
		(void) printf("NOSUB ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1218
	if (ep->ex_flags & EX_LOG)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1219
		(void) printf("LOG ");
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1220
	if (ep->ex_flags & EX_CHARMAP)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1221
		(void) printf("CHARMAP ");
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1222
	if (ep->ex_flags & EX_LOG_ALLOPS)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1223
		(void) printf("LOG_ALLOPS ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1224
	if (ep->ex_flags == 0)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1225
		(void) printf("(none)");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1226
	(void) 	printf("\n");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1227
	if (ep->ex_flags & EX_LOG) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1228
		(void) printf("\tex_log_buffer = %s\n",
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1229
		    (ep->ex_log_buffer ? ep->ex_log_buffer : "(NULL)"));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1230
		(void) printf("\tex_tag = %s\n",
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1231
		    (ep->ex_tag ? ep->ex_tag : "(NULL)"));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1232
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1233
	(void) printf("\tex_anon = %d\n", ep->ex_anon);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1234
	(void) printf("\tex_seccnt = %d\n", ep->ex_seccnt);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1235
	(void) printf("\n");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1236
	for (i = 0; i < ep->ex_seccnt; i++) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1237
		sp = &ep->ex_secinfo[i];
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1238
		(void) printf("\t\ts_secinfo = %s\n", sp->s_secinfo.sc_name);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1239
		(void) printf("\t\ts_flags: (0x%02x) ", sp->s_flags);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1240
		if (sp->s_flags & M_ROOT) (void) printf("M_ROOT ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1241
		if (sp->s_flags & M_RO) (void) printf("M_RO ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1242
		if (sp->s_flags & M_ROL) (void) printf("M_ROL ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1243
		if (sp->s_flags & M_RW) (void) printf("M_RW ");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1244
		if (sp->s_flags & M_RWL) (void) printf("M_RWL ");
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1245
		if (sp->s_flags & M_NONE) (void) printf("M_NONE ");
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1246
		if (sp->s_flags == 0) (void) printf("(none)");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1247
		(void) printf("\n");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1248
		(void) printf("\t\ts_window = %d\n", sp->s_window);
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  1249
		(void) printf("\t\ts_rootid = %d\n", sp->s_rootid);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1250
		(void) printf("\t\ts_rootcnt = %d ", sp->s_rootcnt);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1251
		(void) fflush(stdout);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1252
		for (j = 0; j < sp->s_rootcnt; j++)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1253
			(void) printf("%s ", sp->s_rootnames[j] ?
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1254
			    sp->s_rootnames[j] : "<null>");
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1255
		(void) printf("\n\n");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1256
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1257
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1258
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1259
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1260
 * count_security(opts)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1261
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1262
 * Count the number of security types (flavors). The optionset has
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1263
 * been populated with the security flavors as a holding mechanism.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1264
 * We later use this number to allocate data structures.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1265
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1266
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1267
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1268
count_security(sa_optionset_t opts)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1269
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1270
	int count = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1271
	sa_property_t prop;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1272
	if (opts != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1273
		for (prop = sa_get_property(opts, NULL); prop != NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1274
		    prop = sa_get_next_property(prop)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1275
			count++;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1276
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1277
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1278
	return (count);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1279
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1280
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1281
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1282
 * nfs_sprint_option(rbuff, rbuffsize, incr, prop, sep)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1283
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1284
 * provides a mechanism to format NFS properties into legacy output
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1285
 * format. If the buffer would overflow, it is reallocated and grown
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1286
 * as appropriate. Special cases of converting internal form of values
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1287
 * to those used by "share" are done. this function does one property
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1288
 * at a time.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1289
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1290
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1291
static int
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1292
nfs_sprint_option(char **rbuff, size_t *rbuffsize, size_t incr,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1293
			sa_property_t prop, int sep)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1294
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1295
	char *name;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1296
	char *value;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1297
	int curlen;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1298
	char *buff = *rbuff;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1299
	size_t buffsize = *rbuffsize;
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1300
	int printed = B_FALSE;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1301
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1302
	name = sa_get_property_attr(prop, "type");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1303
	value = sa_get_property_attr(prop, "value");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1304
	if (buff != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1305
		curlen = strlen(buff);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1306
	else
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1307
		curlen = 0;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1308
	if (name != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1309
		int len;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1310
		len = strlen(name) + sep;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1311
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1312
		/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1313
		 * A future RFE would be to replace this with more
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1314
		 * generic code and to possibly handle more types.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1315
		 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1316
		switch (gettype(name)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1317
		case OPT_TYPE_BOOLEAN:
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1318
			/*
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1319
			 * For NFS, boolean value of FALSE means it
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1320
			 * doesn't show up in the option list at all.
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1321
			 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1322
			if (value != NULL && strcasecmp(value, "false") == 0)
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1323
				goto skip;
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1324
			if (value != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1325
				sa_free_attr_string(value);
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1326
				value = NULL;
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1327
			}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1328
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1329
		case OPT_TYPE_ACCLIST:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1330
			if (value != NULL && strcmp(value, "*") == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1331
				sa_free_attr_string(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1332
				value = NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1333
			} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1334
				if (value != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1335
					len += 1 + strlen(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1336
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1337
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1338
		case OPT_TYPE_LOGTAG:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1339
			if (value != NULL && strlen(value) == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1340
				sa_free_attr_string(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1341
				value = NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1342
			} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1343
				if (value != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1344
					len += 1 + strlen(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1345
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1346
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1347
		default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1348
			if (value != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1349
				len += 1 + strlen(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1350
			break;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1351
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1352
		while (buffsize <= (curlen + len)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1353
			/* need more room */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1354
			buffsize += incr;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1355
			buff = realloc(buff, buffsize);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1356
			if (buff == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1357
				/* realloc failed so free everything */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1358
				if (*rbuff != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1359
					free(*rbuff);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1360
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1361
			*rbuff = buff;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1362
			*rbuffsize = buffsize;
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1363
			if (buff == NULL)
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1364
				goto skip;
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1365
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1366
		}
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1367
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1368
		if (buff == NULL)
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1369
			goto skip;
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1370
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1371
		if (value == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1372
			(void) snprintf(buff + curlen, buffsize - curlen,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1373
			    "%s%s", sep ? "," : "",
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1374
			    name, value != NULL ? value : "");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1375
		} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1376
			(void) snprintf(buff + curlen, buffsize - curlen,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1377
			    "%s%s=%s", sep ? "," : "",
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1378
			    name, value != NULL ? value : "");
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1379
		}
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1380
		printed = B_TRUE;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1381
	}
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1382
skip:
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1383
	if (name != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1384
		sa_free_attr_string(name);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1385
	if (value != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1386
		sa_free_attr_string(value);
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1387
	return (printed);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1388
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1389
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1390
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1391
 * nfs_format_options(group, hier)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1392
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1393
 * format all the options on the group into an old-style option
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1394
 * string. If hier is non-zero, walk up the tree to get inherited
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1395
 * options.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1396
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1397
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1398
static char *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1399
nfs_format_options(sa_group_t group, int hier)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1400
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1401
	sa_optionset_t options = NULL;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1402
	sa_optionset_t secoptions = NULL;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1403
	sa_property_t prop, secprop;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1404
	sa_security_t security = NULL;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1405
	char *buff;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1406
	size_t buffsize;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1407
	char *sectype = NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1408
	int sep = 0;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1409
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1410
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1411
	buff = malloc(OPT_CHUNK);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1412
	if (buff == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1413
		return (NULL);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1414
	}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1415
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1416
	buff[0] = '\0';
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1417
	buffsize = OPT_CHUNK;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1418
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1419
	/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1420
	 * We may have a an optionset relative to this item. format
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1421
	 * these if we find them and then add any security definitions.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1422
	 */
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1423
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1424
	options = sa_get_derived_optionset(group, "nfs", hier);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1425
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1426
	/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1427
	 * do the default set first but skip any option that is also
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1428
	 * in the protocol specific optionset.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1429
	 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1430
	if (options != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1431
		for (prop = sa_get_property(options, NULL);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1432
		    prop != NULL; prop = sa_get_next_property(prop)) {
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1433
			/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1434
			 * use this one since we skipped any
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1435
			 * of these that were also in
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1436
			 * optdefault
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1437
			 */
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1438
			if (nfs_sprint_option(&buff, &buffsize, OPT_CHUNK,
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1439
			    prop, sep))
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1440
				sep = 1;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1441
			if (buff == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1442
				/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1443
				 * buff could become NULL if there
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1444
				 * isn't enough memory for
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1445
				 * nfs_sprint_option to realloc()
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1446
				 * as necessary. We can't really
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1447
				 * do anything about it at this
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1448
				 * point so we return NULL.  The
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1449
				 * caller should handle the
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1450
				 * failure.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1451
				 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1452
				if (options != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1453
					sa_free_derived_optionset(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1454
					    options);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1455
				return (buff);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1456
			}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1457
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1458
	}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1459
	secoptions = (sa_optionset_t)sa_get_all_security_types(group,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1460
	    "nfs", hier);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1461
	if (secoptions != NULL) {
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1462
		for (secprop = sa_get_property(secoptions, NULL);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1463
		    secprop != NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1464
		    secprop = sa_get_next_property(secprop)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1465
			sectype = sa_get_property_attr(secprop, "type");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1466
			security =
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1467
			    (sa_security_t)sa_get_derived_security(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1468
			    group, sectype, "nfs", hier);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1469
			if (security != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1470
				if (sectype != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1471
					prop = sa_create_property(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1472
					    "sec", sectype);
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1473
					if (prop == NULL)
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1474
						goto err;
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1475
					if (nfs_sprint_option(&buff,
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1476
					    &buffsize, OPT_CHUNK, prop, sep))
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1477
						sep = 1;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1478
					(void) sa_remove_property(prop);
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1479
					if (buff == NULL)
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1480
						goto err;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1481
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1482
				for (prop = sa_get_property(security,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1483
				    NULL); prop != NULL;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1484
				    prop = sa_get_next_property(prop)) {
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1485
					if (nfs_sprint_option(&buff,
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1486
					    &buffsize, OPT_CHUNK, prop, sep))
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  1487
						sep = 1;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1488
					if (buff == NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1489
						goto err;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1490
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1491
				sa_free_derived_optionset(security);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1492
			}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1493
			if (sectype != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1494
				sa_free_attr_string(sectype);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1495
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1496
		sa_free_derived_optionset(secoptions);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1497
	}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1498
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1499
	if (options != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1500
		sa_free_derived_optionset(options);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1501
	return (buff);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1502
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1503
err:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1504
	/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1505
	 * If we couldn't allocate memory for option printing, we need
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1506
	 * to break out of the nested loops, cleanup and return NULL.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1507
	 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1508
	if (secoptions != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1509
		sa_free_derived_optionset(secoptions);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1510
	if (security != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1511
		sa_free_derived_optionset(security);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1512
	if (sectype != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1513
		sa_free_attr_string(sectype);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1514
	if (options != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1515
		sa_free_derived_optionset(options);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1516
	return (buff);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1517
}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1518
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1519
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1520
 * Append an entry to the nfslogtab file
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1521
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1522
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1523
nfslogtab_add(dir, buffer, tag)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1524
	char *dir, *buffer, *tag;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1525
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1526
	FILE *f;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1527
	struct logtab_ent lep;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1528
	int error = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1529
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1530
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1531
	 * Open the file for update and create it if necessary.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1532
	 * This may leave the I/O offset at the end of the file,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1533
	 * so rewind back to the beginning of the file.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1534
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1535
	f = fopen(NFSLOGTAB, "a+");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1536
	if (f == NULL) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1537
		error = errno;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1538
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1539
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1540
	rewind(f);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1541
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1542
	if (lockf(fileno(f), F_LOCK, 0L) < 0) {
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1543
		(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1544
		    "share complete, however failed to lock %s "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1545
		    "for update: %s\n"), NFSLOGTAB, strerror(errno));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1546
		error = -1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1547
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1548
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1549
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1550
	if (logtab_deactivate_after_boot(f) == -1) {
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1551
		(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1552
		    "share complete, however could not deactivate "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1553
		    "entries in %s\n"), NFSLOGTAB);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1554
		error = -1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1555
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1556
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1557
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1558
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1559
	 * Remove entries matching buffer and sharepoint since we're
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1560
	 * going to replace it with perhaps an entry with a new tag.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1561
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1562
	if (logtab_rement(f, buffer, dir, NULL, -1)) {
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1563
		(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1564
		    "share complete, however could not remove matching "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1565
		    "entries in %s\n"), NFSLOGTAB);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1566
		error = -1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1567
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1568
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1569
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1570
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1571
	 * Deactivate all active entries matching this sharepoint
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1572
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1573
	if (logtab_deactivate(f, NULL, dir, NULL)) {
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1574
		(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1575
		    "share complete, however could not deactivate matching "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1576
		    "entries in %s\n"), NFSLOGTAB);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1577
		error = -1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1578
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1579
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1580
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1581
	lep.le_buffer = buffer;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1582
	lep.le_path = dir;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1583
	lep.le_tag = tag;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1584
	lep.le_state = LES_ACTIVE;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1585
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1586
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1587
	 * Add new sharepoint / buffer location to nfslogtab
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1588
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1589
	if (logtab_putent(f, &lep) < 0) {
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1590
		(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1591
		    "share complete, however could not add %s to %s\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1592
		    dir, NFSLOGTAB);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1593
		error = -1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1594
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1595
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1596
out:
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1597
	if (f != NULL)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1598
		(void) fclose(f);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1599
	return (error);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1600
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1601
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1602
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1603
 * Deactivate an entry from the nfslogtab file
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1604
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1605
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1606
nfslogtab_deactivate(path)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1607
	char *path;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1608
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1609
	FILE *f;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1610
	int error = 0;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1611
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1612
	f = fopen(NFSLOGTAB, "r+");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1613
	if (f == NULL) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1614
		error = errno;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1615
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1616
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1617
	if (lockf(fileno(f), F_LOCK, 0L) < 0) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1618
		error = errno;
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1619
		(void)  fprintf(stderr, dgettext(TEXT_DOMAIN,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1620
		    "share complete, however could not lock %s for "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1621
		    "update: %s\n"), NFSLOGTAB, strerror(error));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1622
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1623
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1624
	if (logtab_deactivate(f, NULL, path, NULL) == -1) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1625
		error = -1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1626
		(void) fprintf(stderr,
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1627
		    dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1628
		    "share complete, however could not "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1629
		    "deactivate %s in %s\n"), path, NFSLOGTAB);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1630
		goto out;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1631
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1632
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1633
out:	if (f != NULL)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1634
		(void) fclose(f);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1635
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1636
	return (error);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1637
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1638
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1639
/*
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1640
 * check_public(group, skipshare)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1641
 *
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1642
 * Check the group for any shares that have the public property
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1643
 * enabled. We skip "skipshare" since that is the one we are
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1644
 * working with. This is a separate function to make handling
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1645
 * subgroups simpler. Returns true if there is a share with public.
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1646
 */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1647
static int
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1648
check_public(sa_group_t group, sa_share_t skipshare)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1649
{
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1650
	int exists = B_FALSE;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1651
	sa_share_t share;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1652
	sa_optionset_t opt;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1653
	sa_property_t prop;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1654
	char *shared;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1655
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1656
	for (share = sa_get_share(group, NULL); share != NULL;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1657
	    share = sa_get_next_share(share)) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1658
		if (share == skipshare)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1659
			continue;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1660
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1661
		opt = sa_get_optionset(share, "nfs");
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1662
		if (opt == NULL)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1663
			continue;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1664
		prop = sa_get_property(opt, "public");
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1665
		if (prop == NULL)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1666
			continue;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1667
		shared = sa_get_share_attr(share, "shared");
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1668
		if (shared != NULL) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1669
			exists = strcmp(shared, "true") == 0;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1670
			sa_free_attr_string(shared);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1671
			if (exists == B_TRUE)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1672
				break;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1673
		}
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1674
	}
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1675
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1676
	return (exists);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1677
}
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1678
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1679
/*
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1680
 * public_exists(handle, share)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1681
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1682
 * check to see if public option is set on any other share than the
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1683
 * one specified. Need to check zfs sub-groups as well as the top
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1684
 * level groups.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1685
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1686
static int
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1687
public_exists(sa_handle_t handle, sa_share_t skipshare)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1688
{
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1689
	sa_group_t group = NULL;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1690
6271
28c8a84426ca 6678356 zfs set sharenfs=anon=0 complains invalid option
dougm
parents: 6214
diff changeset
  1691
	/*
28c8a84426ca 6678356 zfs set sharenfs=anon=0 complains invalid option
dougm
parents: 6214
diff changeset
  1692
	 * If we don't have a handle, we can only do syntax check. We
28c8a84426ca 6678356 zfs set sharenfs=anon=0 complains invalid option
dougm
parents: 6214
diff changeset
  1693
	 * can't check against other shares so we assume OK and will
28c8a84426ca 6678356 zfs set sharenfs=anon=0 complains invalid option
dougm
parents: 6214
diff changeset
  1694
	 * catch the problem only when we actually try to apply it.
28c8a84426ca 6678356 zfs set sharenfs=anon=0 complains invalid option
dougm
parents: 6214
diff changeset
  1695
	 */
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1696
	if (handle == NULL)
6271
28c8a84426ca 6678356 zfs set sharenfs=anon=0 complains invalid option
dougm
parents: 6214
diff changeset
  1697
		return (SA_OK);
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1698
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1699
	if (skipshare != NULL) {
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1700
		group = sa_get_parent_group(skipshare);
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1701
		if (group == NULL)
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1702
			return (SA_NO_SUCH_GROUP);
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1703
	}
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1704
3910
00586900e34c 6516085 sharemgr: should deliver 64-bit library objects for libshare.so and plugin(s)
dougm
parents: 3663
diff changeset
  1705
	for (group = sa_get_group(handle, NULL); group != NULL;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1706
	    group = sa_get_next_group(group)) {
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1707
		/* Walk any ZFS subgroups as well as all standard groups */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1708
		if (sa_group_is_zfs(group)) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1709
			sa_group_t subgroup;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1710
			for (subgroup = sa_get_sub_group(group);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1711
			    subgroup != NULL;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1712
			    subgroup = sa_get_next_group(subgroup)) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1713
				if (check_public(subgroup, skipshare))
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1714
					return (B_TRUE);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1715
			}
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1716
		} else {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1717
			if (check_public(group, skipshare))
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1718
				return (B_TRUE);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1719
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1720
	}
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1721
	return (B_FALSE);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1722
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1723
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1724
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1725
 * sa_enable_share at the protocol level, enable_share must tell the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1726
 * implementation that it is to enable the share. This entails
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1727
 * converting the path and options into the appropriate ioctl
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1728
 * calls. It is assumed that all error checking of paths, etc. were
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1729
 * done earlier.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1730
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1731
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1732
nfs_enable_share(sa_share_t share)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1733
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1734
	struct exportdata export;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1735
	sa_optionset_t secoptlist;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1736
	struct secinfo *sp;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1737
	int num_secinfo;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1738
	sa_optionset_t opt;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1739
	sa_security_t sec;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1740
	sa_property_t prop;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1741
	char *path;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1742
	int err = SA_OK;
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1743
	int i;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1744
	int iszfs;
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1745
	sa_handle_t handle;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1746
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1747
	/* Don't drop core if the NFS module isn't loaded. */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1748
	(void) signal(SIGSYS, SIG_IGN);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1749
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1750
	/* get the path since it is important in several places */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1751
	path = sa_get_share_attr(share, "path");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1752
	if (path == NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1753
		return (SA_NO_SUCH_PATH);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1754
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1755
	iszfs = sa_path_is_zfs(path);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1756
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1757
	 * find the optionsets and security sets.  There may not be
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1758
	 * any or there could be one or two for each of optionset and
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1759
	 * security may have multiple, one per security type per
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1760
	 * protocol type.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1761
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1762
	opt = sa_get_derived_optionset(share, "nfs", 1);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1763
	secoptlist = (sa_optionset_t)sa_get_all_security_types(share, "nfs", 1);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1764
	if (secoptlist != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1765
		num_secinfo = MAX(1, count_security(secoptlist));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1766
	else
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1767
		num_secinfo = 1;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1768
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1769
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1770
	 * walk through the options and fill in the structure
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1771
	 * appropriately.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1772
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1773
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1774
	(void) memset(&export, '\0', sizeof (export));
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1775
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1776
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1777
	 * do non-security options first since there is only one after
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1778
	 * the derived group is constructed.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1779
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1780
	export.ex_version = EX_CURRENT_VERSION;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1781
	export.ex_anon = UID_NOBODY; /* this is our default value */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1782
	export.ex_index = NULL;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1783
	export.ex_path = path;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1784
	export.ex_pathlen = strlen(path) + 1;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1785
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1786
	if (opt != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1787
		err = fill_export_from_optionset(&export, opt);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1788
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1789
	/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1790
	 * check to see if "public" is set. If it is, then make sure
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1791
	 * no other share has it set. If it is already used, fail.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1792
	 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1793
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1794
	handle = sa_find_group_handle((sa_group_t)share);
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  1795
	if (export.ex_flags & EX_PUBLIC && public_exists(handle, share)) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1796
		(void) printf(dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1797
		    "NFS: Cannot share more than one file "
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1798
		    "system with 'public' property\n"));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1799
		err = SA_NOT_ALLOWED;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1800
		goto out;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1801
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1802
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1803
	sp = calloc(num_secinfo, sizeof (struct secinfo));
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1804
	if (sp == NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1805
		err = SA_NO_MEMORY;
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1806
		(void) printf(dgettext(TEXT_DOMAIN,
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1807
		    "NFS: NFS: no memory for security\n"));
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1808
		goto out;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1809
	}
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1810
	export.ex_secinfo = sp;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1811
	/* get default secinfo */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1812
	export.ex_seccnt = num_secinfo;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1813
	/*
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1814
	 * since we must have one security option defined, we
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1815
	 * init to the default and then override as we find
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1816
	 * defined security options. This handles the case
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1817
	 * where we have no defined options but we need to set
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1818
	 * up one.
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1819
	 */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1820
	sp[0].s_window = DEF_WIN;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1821
	sp[0].s_rootnames = NULL;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1822
	/* setup a default in case no properties defined */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1823
	if (nfs_getseconfig_default(&sp[0].s_secinfo)) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1824
		(void) printf(dgettext(TEXT_DOMAIN,
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1825
		    "NFS: nfs_getseconfig_default: failed to "
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1826
		    "get default security mode\n"));
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1827
		err = SA_CONFIG_ERR;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1828
	}
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1829
	if (secoptlist != NULL) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1830
		for (i = 0, prop = sa_get_property(secoptlist, NULL);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1831
		    prop != NULL && i < num_secinfo;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1832
		    prop = sa_get_next_property(prop), i++) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1833
			char *sectype;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1834
				sectype = sa_get_property_attr(prop, "type");
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1835
			/*
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1836
			 * if sectype is NULL, we probably
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1837
			 * have a memory problem and can't get
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1838
			 * the correct values. Rather than
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1839
			 * exporting with incorrect security,
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1840
			 * don't share it.
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1841
			 */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1842
			if (sectype == NULL) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1843
				err = SA_NO_MEMORY;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1844
				(void) printf(dgettext(TEXT_DOMAIN,
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1845
				    "NFS: Cannot share %s: "
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1846
				    "no memory\n"), path);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1847
				goto out;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1848
			}
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1849
			sec = (sa_security_t)sa_get_derived_security(
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1850
			    share, sectype, "nfs", 1);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1851
			sp[i].s_window = DEF_WIN;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1852
			sp[i].s_rootcnt = 0;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1853
			sp[i].s_rootnames = NULL;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1854
				(void) fill_security_from_secopts(&sp[i], sec);
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1855
			if (sec != NULL)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1856
				sa_free_derived_security(sec);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1857
			if (sectype != NULL)
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1858
				sa_free_attr_string(sectype);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1859
		}
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1860
	}
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1861
	/*
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1862
	 * when we get here, we can do the exportfs system call and
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1863
	 * initiate thinsg. We probably want to enable the nfs.server
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1864
	 * service first if it isn't running within SMF.
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1865
	 */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1866
	/* check nfs.server status and start if needed */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1867
	/* now add the share to the internal tables */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1868
	printarg(path, &export);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1869
	/*
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1870
	 * call the exportfs system call which is implemented
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1871
	 * via the nfssys() call as the EXPORTFS subfunction.
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1872
	 */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1873
	if (iszfs) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1874
		struct exportfs_args ea;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1875
		share_t sh;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1876
		char *str;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1877
		priv_set_t *priv_effective;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1878
		int privileged;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1879
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1880
		/*
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1881
		 * If we aren't a privileged user
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1882
		 * and NFS server service isn't running
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1883
		 * then print out an error message
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1884
		 * and return EPERM
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1885
		 */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1886
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1887
		priv_effective = priv_allocset();
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1888
		(void) getppriv(PRIV_EFFECTIVE, priv_effective);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1889
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1890
		privileged = (priv_isfullset(priv_effective) == B_TRUE);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1891
		priv_freeset(priv_effective);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1892
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1893
		if (!privileged &&
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1894
		    (str = smf_get_state(NFS_SERVER_SVC)) != NULL) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1895
			err = 0;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1896
			if (strcmp(str, SCF_STATE_STRING_ONLINE) != 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1897
				(void) printf(dgettext(TEXT_DOMAIN,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1898
				    "NFS: Cannot share remote "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1899
				    "filesystem: %s\n"), path);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1900
				(void) printf(dgettext(TEXT_DOMAIN,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1901
				    "NFS: Service needs to be enabled "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1902
				    "by a privileged user\n"));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1903
				err = SA_SYSTEM_ERR;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1904
				errno = EPERM;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1905
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1906
			free(str);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1907
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1908
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1909
		if (err == 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1910
			ea.dname = path;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1911
			ea.uex = &export;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1912
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1913
			sa_sharetab_fill_zfs(share, &sh, "nfs");
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  1914
			err = sa_share_zfs(share, path, &sh,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  1915
			    &ea, ZFS_SHARE_NFS);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1916
			sa_emptyshare(&sh);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1917
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1918
	} else {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1919
		err = exportfs(path, &export);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1920
	}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1921
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1922
	if (err < 0) {
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1923
		err = SA_SYSTEM_ERR;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1924
		switch (errno) {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1925
		case EREMOTE:
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1926
			(void) printf(dgettext(TEXT_DOMAIN,
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1927
			    "NFS: Cannot share filesystems "
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1928
			    "in non-global zones: %s\n"), path);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1929
			err = SA_NOT_SUPPORTED;
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1930
			break;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1931
		case EPERM:
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1932
			if (getzoneid() != GLOBAL_ZONEID) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1933
				(void) printf(dgettext(TEXT_DOMAIN,
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1934
				    "NFS: Cannot share file systems "
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1935
				    "in non-global zones: %s\n"), path);
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1936
				err = SA_NOT_SUPPORTED;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1937
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1938
			}
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1939
			err = SA_NO_PERMISSION;
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1940
			/* FALLTHROUGH */
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1941
		default:
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1942
			break;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1943
		}
4524
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1944
	} else {
d36479d7e320 6531853 sharemgr: set is confused if trying to set multiple properties at a time
dougm
parents: 4372
diff changeset
  1945
		/* update sharetab with an add/modify */
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1946
		if (!iszfs) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1947
			(void) sa_update_sharetab(share, "nfs");
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  1948
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1949
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1950
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1951
	if (err == SA_OK) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1952
		/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1953
		 * enable services as needed. This should probably be
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1954
		 * done elsewhere in order to minimize the calls to
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1955
		 * check services.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1956
		 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1957
		/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1958
		 * check to see if logging and other services need to
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1959
		 * be triggered, but only if there wasn't an
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1960
		 * error. This is probably where sharetab should be
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1961
		 * updated with the NFS specific entry.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1962
		 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1963
		if (export.ex_flags & EX_LOG) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1964
			/* enable logging */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1965
			if (nfslogtab_add(path, export.ex_log_buffer,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1966
			    export.ex_tag) != 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1967
				(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1968
				    "Could not enable logging for %s\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1969
				    path);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1970
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1971
			_check_services(service_list_logging);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1972
		} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1973
			/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1974
			 * don't have logging so remove it from file. It might
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1975
			 * not be thre, but that doesn't matter.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1976
			 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1977
			(void) nfslogtab_deactivate(path);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1978
			_check_services(service_list_default);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1979
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1980
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1981
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1982
out:
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1983
	if (path != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1984
		free(path);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1985
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1986
	cleanup_export(&export);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1987
	if (opt != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1988
		sa_free_derived_optionset(opt);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1989
	if (secoptlist != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  1990
		(void) sa_destroy_optionset(secoptlist);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1991
	return (err);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1992
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1993
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1994
/*
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  1995
 * nfs_disable_share(share, path)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  1996
 *
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  1997
 * Unshare the specified share. Note that "path" is the same path as
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  1998
 * what is in the "share" object. It is passed in to avoid an
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  1999
 * additional lookup. A missing "path" value makes this a no-op
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2000
 * function.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2001
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2002
static int
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  2003
nfs_disable_share(sa_share_t share, char *path)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2004
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2005
	int err;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2006
	int ret = SA_OK;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  2007
	int iszfs;
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2008
	sa_group_t parent;
5951
c597da46efd6 6558321 zfs_share_nfs() fails the second time through
dougm
parents: 5800
diff changeset
  2009
	sa_handle_t handle;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  2010
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2011
	if (path == NULL)
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2012
		return (ret);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  2013
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2014
	/*
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2015
	 * If the share is in a ZFS group we need to handle it
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2016
	 * differently.  Just being on a ZFS file system isn't
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2017
	 * enough since we may be in a legacy share case.
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2018
	 */
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2019
	parent = sa_get_parent_group(share);
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2020
	iszfs = sa_group_is_zfs(parent);
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2021
	if (iszfs) {
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2022
		struct exportfs_args ea;
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2023
		share_t sh = { 0 };
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2024
		ea.dname = path;
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2025
		ea.uex = NULL;
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2026
		sh.sh_path = path;
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2027
		sh.sh_fstype = "nfs";
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  2028
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2029
		err = sa_share_zfs(share, path, &sh,
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2030
		    &ea, ZFS_UNSHARE_NFS);
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2031
	} else {
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2032
		err = exportfs(path, NULL);
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2033
	}
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2034
	if (err < 0) {
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2035
		/*
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2036
		 * TBD: only an error in some
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2037
		 * cases - need better analysis
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2038
		 */
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2039
		switch (errno) {
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2040
		case EPERM:
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2041
		case EACCES:
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2042
			ret = SA_NO_PERMISSION;
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2043
			if (getzoneid() != GLOBAL_ZONEID) {
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2044
				ret = SA_NOT_SUPPORTED;
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2045
			}
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2046
			break;
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2047
		case EINVAL:
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2048
		case ENOENT:
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2049
			ret = SA_NO_SUCH_PATH;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  2050
			break;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2051
			default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2052
				ret = SA_SYSTEM_ERR;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4524
diff changeset
  2053
			break;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2054
		}
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2055
	}
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2056
	if (ret == SA_OK || ret == SA_NO_SUCH_PATH) {
5951
c597da46efd6 6558321 zfs_share_nfs() fails the second time through
dougm
parents: 5800
diff changeset
  2057
		handle = sa_find_group_handle((sa_group_t)share);
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2058
		if (!iszfs)
5951
c597da46efd6 6558321 zfs_share_nfs() fails the second time through
dougm
parents: 5800
diff changeset
  2059
			(void) sa_delete_sharetab(handle, path, "nfs");
5800
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2060
		/* just in case it was logged */
5ed3ad44f595 6639919 Remove shares failed at the first time with error message "Could not remove share: unknown -1"
dougm
parents: 5454
diff changeset
  2061
		(void) nfslogtab_deactivate(path);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2062
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2063
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2064
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2065
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2066
/*
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2067
 * check_rorwnone(v1, v2, v3)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2068
 *
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2069
 * check ro vs rw vs none values.  Over time this may get beefed up.
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2070
 * for now it just does simple checks. v1 is never NULL but v2 or v3
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2071
 * could be.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2072
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2073
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2074
static int
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2075
check_rorwnone(char *v1, char *v2, char *v3)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2076
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2077
	int ret = SA_OK;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2078
	if (v2 != NULL && strcmp(v1, v2) == 0)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2079
		ret = SA_VALUE_CONFLICT;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2080
	else if (v3 != NULL && strcmp(v1, v3) == 0)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2081
		ret = SA_VALUE_CONFLICT;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2082
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2083
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2084
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2085
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2086
/*
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2087
 * nfs_validate_property(handle, property, parent)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2088
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2089
 * Check that the property has a legitimate value for its type.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2090
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2091
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2092
static int
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2093
nfs_validate_property(sa_handle_t handle, sa_property_t property,
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2094
    sa_optionset_t parent)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2095
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2096
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2097
	char *propname;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2098
	char *other1;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2099
	char *other2;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2100
	int optindex;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2101
	nfsl_config_t *configlist;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2102
	sa_group_t parent_group;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2103
	char *value;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2104
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2105
	propname = sa_get_property_attr(property, "type");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2106
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2107
	if ((optindex = findopt(propname)) < 0)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2108
		ret = SA_NO_SUCH_PROP;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2109
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2110
	/* need to validate value range here as well */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2111
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2112
	if (ret == SA_OK) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2113
		parent_group = sa_get_parent_group((sa_share_t)parent);
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2114
		if (optdefs[optindex].share && parent_group != NULL &&
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2115
		    !sa_is_share(parent_group))
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2116
			ret = SA_PROP_SHARE_ONLY;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2117
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2118
	if (ret == SA_OK) {
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2119
		if (optdefs[optindex].index == OPT_PUBLIC) {
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2120
			/*
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2121
			 * Public is special in that only one instance can
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2122
			 * be in the repository at the same time.
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2123
			 */
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2124
			if (public_exists(handle, parent_group)) {
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2125
				sa_free_attr_string(propname);
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2126
				return (SA_VALUE_CONFLICT);
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2127
			}
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2128
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2129
		value = sa_get_property_attr(property, "value");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2130
		if (value != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2131
			/* first basic type checking */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2132
			switch (optdefs[optindex].type) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2133
			case OPT_TYPE_NUMBER:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2134
				/* check that the value is all digits */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2135
				if (!is_a_number(value))
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2136
					ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2137
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2138
			case OPT_TYPE_BOOLEAN:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2139
				if (strlen(value) == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2140
				    strcasecmp(value, "true") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2141
				    strcmp(value, "1") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2142
				    strcasecmp(value, "false") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2143
				    strcmp(value, "0") == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2144
					ret = SA_OK;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2145
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2146
					ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2147
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2148
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2149
			case OPT_TYPE_USER:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2150
				if (!is_a_number(value)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2151
					struct passwd *pw;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2152
					/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2153
					 * in this case it would have to be a
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2154
					 * user name
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2155
					 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2156
					pw = getpwnam(value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2157
					if (pw == NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2158
						ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2159
					endpwent();
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2160
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2161
					uint64_t intval;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2162
					intval = strtoull(value, NULL, 0);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2163
					if (intval > UID_MAX && intval != ~0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2164
						ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2165
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2166
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2167
			case OPT_TYPE_FILE:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2168
				if (strcmp(value, "..") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2169
				    strchr(value, '/') != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2170
					ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2171
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2172
				break;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2173
			case OPT_TYPE_ACCLIST: {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2174
				sa_property_t oprop1;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2175
				sa_property_t oprop2;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2176
				char *ovalue1 = NULL;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2177
				char *ovalue2 = NULL;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2178
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2179
				if (parent == NULL)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2180
					break;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2181
				/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2182
				 * access list handling. Should eventually
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2183
				 * validate that all the values make sense.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2184
				 * Also, ro and rw may have cross value
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2185
				 * conflicts.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2186
				 */
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2187
				if (strcmp(propname, SHOPT_RO) == 0) {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2188
					other1 = SHOPT_RW;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2189
					other2 = SHOPT_NONE;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2190
				} else if (strcmp(propname, SHOPT_RW) == 0) {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2191
					other1 = SHOPT_RO;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2192
					other2 = SHOPT_NONE;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2193
				} else if (strcmp(propname, SHOPT_NONE) == 0) {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2194
					other1 = SHOPT_RO;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2195
					other2 = SHOPT_RW;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2196
				} else {
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2197
					other1 = NULL;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2198
					other2 = NULL;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2199
				}
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2200
				if (other1 == NULL && other2 == NULL)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2201
					break;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2202
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2203
				/* compare rw(ro) with ro(rw) */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2204
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2205
				oprop1 = sa_get_property(parent, other1);
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2206
				oprop2 = sa_get_property(parent, other2);
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2207
				if (oprop1 == NULL && oprop2 == NULL)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2208
					break;
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2209
				/*
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2210
				 * Only potential confusion if other1
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2211
				 * or other2 exists. Check the values
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2212
				 * and run the check if there is a
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2213
				 * value other than the one we are
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2214
				 * explicitly looking at.
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2215
				 */
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2216
				ovalue1 = sa_get_property_attr(oprop1, "value");
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2217
				ovalue2 = sa_get_property_attr(oprop2, "value");
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2218
				if (ovalue1 != NULL || ovalue2 != NULL)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2219
					ret = check_rorwnone(value, ovalue1,
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2220
					    ovalue2);
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2221
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2222
				if (ovalue1 != NULL)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2223
					sa_free_attr_string(ovalue1);
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2224
				if (ovalue2 != NULL)
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2225
					sa_free_attr_string(ovalue2);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2226
				break;
7961
4b5e3051f38b 6751647 TRANS2_FIND_NEXT continuation by filename restarts search at beginning of directory
natalie li - Sun Microsystems - Irvine United States <Natalie.Li@Sun.COM>
parents: 6271
diff changeset
  2227
			}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2228
			case OPT_TYPE_LOGTAG:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2229
				if (nfsl_getconfig_list(&configlist) == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2230
					int error;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2231
					if (value == NULL ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2232
					    strlen(value) == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2233
						if (value != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2234
							sa_free_attr_string(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2235
							    value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2236
						value = strdup("global");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2237
					}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2238
					if (value != NULL &&
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2239
					    nfsl_findconfig(configlist, value,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2240
					    &error) == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2241
						ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2242
					}
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2243
					/* Must always free when done */
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2244
					nfsl_freeconfig_list(&configlist);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2245
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2246
					ret = SA_CONFIG_ERR;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2247
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2248
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2249
			case OPT_TYPE_STRING:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2250
				/* whatever is here should be ok */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2251
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2252
			case OPT_TYPE_SECURITY:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2253
				/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2254
				 * The "sec" property isn't used in the
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2255
				 * non-legacy parts of sharemgr. We need to
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2256
				 * reject it here. For legacy, it is pulled
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2257
				 * out well before we get here.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2258
				 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2259
				ret = SA_NO_SUCH_PROP;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2260
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2261
			default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2262
				break;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2263
			}
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2264
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2265
			if (value != NULL)
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2266
				sa_free_attr_string(value);
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2267
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2268
			if (ret == SA_OK && optdefs[optindex].check != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2269
				/* do the property specific check */
6214
224c86f7f220 6604618 sharemgr can validate options against NULL optionset, have bogus result
dougm
parents: 6162
diff changeset
  2270
				ret = optdefs[optindex].check(handle, property);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2271
			}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2272
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2273
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2274
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2275
	if (propname != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2276
		sa_free_attr_string(propname);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2277
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2278
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2279
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2280
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2281
 * Protocol management functions
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2282
 *
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2283
 * Properties defined in the default files are defined in
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2284
 * proto_option_defs for parsing and validation. If "other" and
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2285
 * "compare" are set, then the value for this property should be
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2286
 * compared against the property specified in "other" using the
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2287
 * "compare" check (either <= or >=) in order to ensure that the
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2288
 * values are in the correct range.  E.g. setting server_versmin
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2289
 * higher than server_versmax should not be allowed.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2290
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2291
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2292
struct proto_option_defs {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2293
	char *tag;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2294
	char *name;	/* display name -- remove protocol identifier */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2295
	int index;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2296
	int type;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2297
	union {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2298
	    int intval;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2299
	    char *string;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2300
	} defvalue;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2301
	uint32_t svcs;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2302
	int32_t minval;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2303
	int32_t maxval;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2304
	char *file;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2305
	char *other;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2306
	int compare;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2307
#define	OPT_CMP_GE	0
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2308
#define	OPT_CMP_LE	1
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2309
	int (*check)(char *);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2310
} proto_options[] = {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2311
#define	PROTO_OPT_NFSD_SERVERS			0
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2312
	{"nfsd_servers",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2313
	    "servers", PROTO_OPT_NFSD_SERVERS, OPT_TYPE_NUMBER, 16, SVC_NFSD,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2314
	    1, INT32_MAX, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2315
#define	PROTO_OPT_LOCKD_LISTEN_BACKLOG		1
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2316
	{"lockd_listen_backlog",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2317
	    "lockd_listen_backlog", PROTO_OPT_LOCKD_LISTEN_BACKLOG,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2318
	    OPT_TYPE_NUMBER, 32, SVC_LOCKD, 32, INT32_MAX, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2319
#define	PROTO_OPT_LOCKD_SERVERS			2
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2320
	{"lockd_servers",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2321
	    "lockd_servers", PROTO_OPT_LOCKD_SERVERS, OPT_TYPE_NUMBER, 20,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2322
	    SVC_LOCKD, 1, INT32_MAX, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2323
#define	PROTO_OPT_LOCKD_RETRANSMIT_TIMEOUT	3
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2324
	{"lockd_retransmit_timeout",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2325
	    "lockd_retransmit_timeout", PROTO_OPT_LOCKD_RETRANSMIT_TIMEOUT,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2326
	    OPT_TYPE_NUMBER, 5, SVC_LOCKD, 0, INT32_MAX, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2327
#define	PROTO_OPT_GRACE_PERIOD			4
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2328
	{"grace_period",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2329
	    "grace_period", PROTO_OPT_GRACE_PERIOD, OPT_TYPE_NUMBER, 90,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2330
	    SVC_LOCKD, 0, INT32_MAX, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2331
#define	PROTO_OPT_NFS_SERVER_VERSMIN		5
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2332
	{"nfs_server_versmin",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2333
	    "server_versmin", PROTO_OPT_NFS_SERVER_VERSMIN, OPT_TYPE_NUMBER,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2334
	    (int)NFS_VERSMIN_DEFAULT, SVC_NFSD|SVC_MOUNTD, NFS_VERSMIN,
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2335
	    NFS_VERSMAX, NFSADMIN, "server_versmax", OPT_CMP_LE},
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2336
#define	PROTO_OPT_NFS_SERVER_VERSMAX		6
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2337
	{"nfs_server_versmax",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2338
	    "server_versmax", PROTO_OPT_NFS_SERVER_VERSMAX, OPT_TYPE_NUMBER,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2339
	    (int)NFS_VERSMAX_DEFAULT, SVC_NFSD|SVC_MOUNTD, NFS_VERSMIN,
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2340
	    NFS_VERSMAX, NFSADMIN, "server_versmin", OPT_CMP_GE},
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2341
#define	PROTO_OPT_NFS_CLIENT_VERSMIN		7
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2342
	{"nfs_client_versmin",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2343
	    "client_versmin", PROTO_OPT_NFS_CLIENT_VERSMIN, OPT_TYPE_NUMBER,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2344
	    (int)NFS_VERSMIN_DEFAULT, NULL, NFS_VERSMIN, NFS_VERSMAX,
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2345
	    NFSADMIN, "client_versmax", OPT_CMP_LE},
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2346
#define	PROTO_OPT_NFS_CLIENT_VERSMAX		8
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2347
	{"nfs_client_versmax",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2348
	    "client_versmax", PROTO_OPT_NFS_CLIENT_VERSMAX, OPT_TYPE_NUMBER,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2349
	    (int)NFS_VERSMAX_DEFAULT, NULL, NFS_VERSMIN, NFS_VERSMAX,
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2350
	    NFSADMIN, "client_versmin", OPT_CMP_GE},
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2351
#define	PROTO_OPT_NFS_SERVER_DELEGATION		9
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2352
	{"nfs_server_delegation",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2353
	    "server_delegation", PROTO_OPT_NFS_SERVER_DELEGATION,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2354
	    OPT_TYPE_ONOFF, NFS_SERVER_DELEGATION_DEFAULT, SVC_NFSD, 0, 0,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2355
	    NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2356
#define	PROTO_OPT_NFSMAPID_DOMAIN		10
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2357
	{"nfsmapid_domain",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2358
	    "nfsmapid_domain", PROTO_OPT_NFSMAPID_DOMAIN, OPT_TYPE_DOMAIN,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2359
	    NULL, SVC_NFSMAPID, 0, 0, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2360
#define	PROTO_OPT_NFSD_MAX_CONNECTIONS		11
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2361
	{"nfsd_max_connections",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2362
	    "max_connections", PROTO_OPT_NFSD_MAX_CONNECTIONS,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2363
	    OPT_TYPE_NUMBER, -1, SVC_NFSD, -1, INT32_MAX, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2364
#define	PROTO_OPT_NFSD_PROTOCOL			12
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2365
	{"nfsd_protocol",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2366
	    "protocol", PROTO_OPT_NFSD_PROTOCOL, OPT_TYPE_PROTOCOL, 0,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2367
	    SVC_NFSD, 0, 0, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2368
#define	PROTO_OPT_NFSD_LISTEN_BACKLOG		13
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2369
	{"nfsd_listen_backlog",
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2370
	    "listen_backlog", PROTO_OPT_NFSD_LISTEN_BACKLOG,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2371
	    OPT_TYPE_NUMBER, 0,
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2372
	    SVC_LOCKD, 0, INT32_MAX, NFSADMIN},
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2373
	{NULL}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2374
};
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2375
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2376
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2377
 * the protoset holds the defined options so we don't have to read
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2378
 * them multiple times
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2379
 */
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2380
static sa_protocol_properties_t protoset;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2381
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2382
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2383
findprotoopt(char *name, int whichname)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2384
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2385
	int i;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2386
	for (i = 0; proto_options[i].tag != NULL; i++) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2387
		if (whichname == 1) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2388
			if (strcasecmp(proto_options[i].name, name) == 0)
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2389
			return (i);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2390
		} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2391
			if (strcasecmp(proto_options[i].tag, name) == 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2392
				return (i);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2393
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2394
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2395
	return (-1);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2396
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2397
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2398
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2399
 * fixcaselower(str)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2400
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2401
 * convert a string to lower case (inplace).
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2402
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2403
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2404
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2405
fixcaselower(char *str)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2406
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2407
	while (*str) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2408
		*str = tolower(*str);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2409
		str++;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2410
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2411
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2412
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2413
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2414
 * fixcaseupper(str)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2415
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2416
 * convert a string to upper case (inplace).
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2417
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2418
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2419
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2420
fixcaseupper(char *str)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2421
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2422
	while (*str) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2423
		*str = toupper(*str);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2424
		str++;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2425
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2426
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2427
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2428
/*
4241
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2429
 * skipwhitespace(str)
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2430
 *
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2431
 * Skip leading white space. It is assumed that it is called with a
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2432
 * valid pointer.
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2433
 */
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2434
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2435
static char *
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2436
skipwhitespace(char *str)
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2437
{
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2438
	while (*str && isspace(*str))
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2439
		str++;
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2440
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2441
	return (str);
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2442
}
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2443
b39742cafe7a 6522812 sharemgr: sharectl unable to set/get properties which have leading space
dougm
parents: 3910
diff changeset
  2444
/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2445
 * extractprop()
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2446
 *
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2447
 * Extract the property and value out of the line and create the
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2448
 * property in the optionset.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2449
 */
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2450
static int
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2451
extractprop(char *name, char *value)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2452
{
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2453
	sa_property_t prop;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2454
	int index;
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2455
	int ret = SA_OK;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2456
	/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2457
	 * Remove any leading
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2458
	 * white space.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2459
	 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2460
	name = skipwhitespace(name);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2461
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2462
	index = findprotoopt(name, 0);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2463
	if (index >= 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2464
		fixcaselower(name);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2465
		prop = sa_create_property(proto_options[index].name, value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2466
		if (prop != NULL)
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2467
			ret = sa_add_protocol_property(protoset, prop);
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2468
		else
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2469
			ret = SA_NO_MEMORY;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2470
	}
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2471
	return (ret);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2472
}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2473
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2474
/*
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2475
 * initprotofromdefault()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2476
 *
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2477
 * Read the default file(s) and add the defined values to the
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2478
 * protoset.  Note that default values are known from the built in
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2479
 * table in case the file doesn't have a definition. Not having the
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2480
 * /etc/default/nfs file is OK since we have builtin default
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2481
 * values. The default file will get constructed as needed if values
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2482
 * are changed from the defaults.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2483
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2484
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2485
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2486
initprotofromdefault()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2487
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2488
	FILE *nfs;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2489
	char buff[BUFSIZ];
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2490
	char *name;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2491
	char *value;
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2492
	int ret = SA_OK;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2493
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2494
	protoset = sa_create_protocol_properties("nfs");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2495
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2496
	if (protoset != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2497
		nfs = fopen(NFSADMIN, "r");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2498
		if (nfs != NULL) {
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2499
			while (ret == SA_OK &&
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2500
			    fgets(buff, sizeof (buff), nfs) != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2501
				switch (buff[0]) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2502
				case '\n':
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2503
				case '#':
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2504
					/* skip */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2505
					break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2506
				default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2507
					name = buff;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2508
					buff[strlen(buff) - 1] = '\0';
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2509
					value = strchr(name, '=');
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2510
					if (value != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2511
						*value++ = '\0';
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2512
						ret = extractprop(name, value);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2513
					}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2514
				}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2515
			}
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2516
			(void) fclose(nfs);
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2517
		} else {
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2518
			switch (errno) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2519
			case EPERM:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2520
			case EACCES:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2521
				ret = SA_NO_PERMISSION;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2522
				break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2523
			case ENOENT:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2524
				break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2525
			default:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2526
				ret = SA_SYSTEM_ERR;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2527
				break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2528
			}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2529
		}
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2530
	} else {
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2531
		ret = SA_NO_MEMORY;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2532
	}
6019
db75d4ce12e7 6630425 sa_add_protocol_property() and callers have poor error semantics
dougm
parents: 6007
diff changeset
  2533
	return (ret);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2534
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2535
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2536
/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2537
 * add_defaults()
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2538
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2539
 * Add the default values for any property not defined in the parsing
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2540
 * of the default files. Values are set according to their defined
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2541
 * types.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2542
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2543
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2544
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2545
add_defaults()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2546
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2547
	int i;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2548
	char number[MAXDIGITS];
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2549
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2550
	for (i = 0; proto_options[i].tag != NULL; i++) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2551
		sa_property_t prop;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2552
		prop = sa_get_protocol_property(protoset,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2553
		    proto_options[i].name);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2554
		if (prop == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2555
			/* add the default value */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2556
			switch (proto_options[i].type) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2557
			case OPT_TYPE_NUMBER:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2558
				(void) snprintf(number, sizeof (number), "%d",
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2559
				    proto_options[i].defvalue.intval);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2560
				prop = sa_create_property(proto_options[i].name,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2561
				    number);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2562
				break;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2563
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2564
			case OPT_TYPE_BOOLEAN:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2565
				prop = sa_create_property(proto_options[i].name,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2566
				    proto_options[i].defvalue.intval ?
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2567
				    "true" : "false");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2568
				break;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2569
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2570
			case OPT_TYPE_ONOFF:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2571
				prop = sa_create_property(proto_options[i].name,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2572
				    proto_options[i].defvalue.intval ?
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2573
				    "on" : "off");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2574
				break;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2575
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2576
			default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2577
				/* treat as strings of zero length */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2578
				prop = sa_create_property(proto_options[i].name,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2579
				    "");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2580
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2581
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2582
			if (prop != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2583
				(void) sa_add_protocol_property(protoset, prop);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2584
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2585
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2586
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2587
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2588
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2589
free_protoprops()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2590
{
5179
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2591
	if (protoset != NULL) {
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2592
		xmlFreeNode(protoset);
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2593
		protoset = NULL;
9fe462ab3144 6546230 sharemgr: "nosuid=false" caused extra comma in share command's output
dougm
parents: 4704
diff changeset
  2594
	}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2595
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2596
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2597
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2598
 * nfs_init()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2599
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2600
 * Initialize the NFS plugin.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2601
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2602
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2603
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2604
nfs_init()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2605
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2606
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2607
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2608
	if (sa_plugin_ops.sa_init != nfs_init) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2609
		(void) printf(dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2610
		    "NFS plugin not properly initialized\n"));
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2611
		return (SA_CONFIG_ERR);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2612
	}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2613
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2614
	ret = initprotofromdefault();
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2615
	if (ret != SA_OK) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2616
		(void) printf(dgettext(TEXT_DOMAIN,
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2617
		    "NFS plugin problem with default file: %s\n"),
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2618
		    sa_errorstr(ret));
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2619
		ret = SA_OK;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2620
	}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2621
	add_defaults();
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2622
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2623
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2624
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2625
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2626
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2627
 * nfs_fini()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2628
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2629
 * uninitialize the NFS plugin. Want to avoid memory leaks.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2630
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2631
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2632
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2633
nfs_fini()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2634
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2635
	free_protoprops();
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2636
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2637
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2638
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2639
 * nfs_get_proto_set()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2640
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2641
 * Return an optionset with all the protocol specific properties in
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2642
 * it.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2643
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2644
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2645
static sa_protocol_properties_t
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2646
nfs_get_proto_set()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2647
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2648
	return (protoset);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2649
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2650
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2651
struct deffile {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2652
	struct deffile *next;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2653
	char *line;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2654
};
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2655
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2656
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2657
 * read_default_file(fname)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2658
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2659
 * Read the specified default file. We return a list of entries. This
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2660
 * get used for adding or removing values.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2661
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2662
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2663
static struct deffile *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2664
read_default_file(char *fname)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2665
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2666
	FILE *file;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2667
	struct deffile *defs = NULL;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2668
	struct deffile *newdef;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2669
	struct deffile *prevdef = NULL;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2670
	char buff[BUFSIZ * 2];
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2671
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2672
	file = fopen(fname, "r");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2673
	if (file != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2674
		while (fgets(buff, sizeof (buff), file) != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2675
			newdef = (struct deffile *)calloc(1,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2676
			    sizeof (struct deffile));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2677
			if (newdef != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2678
				/* Make sure we skip any leading whitespace. */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2679
				newdef->line = strdup(skipwhitespace(buff));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2680
				if (defs == NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2681
					prevdef = defs = newdef;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2682
				} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2683
					prevdef->next = newdef;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2684
					prevdef = newdef;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2685
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2686
			}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2687
		}
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2688
		(void) fclose(file);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2689
	} else {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2690
		int ret = SA_OK;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2691
		switch (errno) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2692
		case EPERM:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2693
		case EACCES:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2694
			ret = SA_NO_PERMISSION;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2695
			break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2696
		case ENOENT:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2697
			break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2698
		default:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2699
			ret = SA_SYSTEM_ERR;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2700
			break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2701
		}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2702
		if (ret == SA_OK) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2703
			/* Want at least one comment line */
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2704
			defs = (struct deffile *)
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2705
			    calloc(1, sizeof (struct deffile));
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2706
			defs->line = strdup("# NFS default file\n");
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2707
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2708
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2709
	return (defs);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2710
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2711
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2712
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2713
free_default_file(struct deffile *defs)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2714
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2715
	struct deffile *curdefs = NULL;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2716
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2717
	while (defs != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2718
		curdefs = defs;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2719
		defs = defs->next;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2720
		if (curdefs->line != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2721
			free(curdefs->line);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2722
		free(curdefs);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2723
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2724
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2725
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2726
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2727
 * write_default_file(fname, defs)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2728
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2729
 * Write the default file back.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2730
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2731
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2732
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2733
write_default_file(char *fname, struct deffile *defs)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2734
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2735
	FILE *file;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2736
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2737
	sigset_t old, new;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2738
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2739
	file = fopen(fname, "w+");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2740
	if (file != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2741
		(void) sigprocmask(SIG_BLOCK, NULL, &new);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2742
		(void) sigaddset(&new, SIGHUP);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2743
		(void) sigaddset(&new, SIGINT);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2744
		(void) sigaddset(&new, SIGQUIT);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2745
		(void) sigaddset(&new, SIGTSTP);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2746
		(void) sigprocmask(SIG_SETMASK, &new, &old);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2747
		while (defs != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2748
			(void) fputs(defs->line, file);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2749
			defs = defs->next;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2750
		}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2751
		(void) fsync(fileno(file));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2752
		(void) sigprocmask(SIG_SETMASK, &old, NULL);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2753
		(void) fclose(file);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2754
	} else {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2755
		switch (errno) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2756
		case EPERM:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2757
		case EACCES:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2758
			ret = SA_NO_PERMISSION;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2759
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2760
		default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2761
			ret = SA_SYSTEM_ERR;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2762
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2763
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2764
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2765
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2766
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2767
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2768
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2769
 * set_default_file_value(tag, value)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2770
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2771
 * Set the default file value for tag to value. Then rewrite the file.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2772
 * tag and value are always set.  The caller must ensure this.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2773
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2774
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2775
#define	MAX_STRING_LENGTH	256
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2776
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2777
set_default_file_value(char *tag, char *value)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2778
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2779
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2780
	struct deffile *root;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2781
	struct deffile *defs;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2782
	struct deffile *prev;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2783
	char string[MAX_STRING_LENGTH];
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2784
	int len;
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2785
	boolean_t update = B_FALSE;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2786
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2787
	(void) snprintf(string, MAX_STRING_LENGTH, "%s=", tag);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2788
	len = strlen(string);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2789
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2790
	root = defs = read_default_file(NFSADMIN);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2791
	if (root == NULL) {
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2792
		switch (errno) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2793
		case EPERM:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2794
		case EACCES:
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2795
			ret = SA_NO_PERMISSION;
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2796
			break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2797
		default:
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2798
			ret = SA_NO_MEMORY;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2799
			break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2800
		}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2801
		return (ret);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2802
	}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2803
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2804
	while (defs != NULL) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2805
		if (defs->line != NULL &&
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2806
		    strncasecmp(defs->line, string, len) == 0) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2807
			/* replace with the new value */
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2808
			free(defs->line);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2809
			fixcaseupper(tag);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2810
			(void) snprintf(string, sizeof (string),
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2811
			    "%s=%s\n", tag, value);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2812
			string[MAX_STRING_LENGTH - 1] = '\0';
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2813
			defs->line = strdup(string);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2814
			update = B_TRUE;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2815
			break;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2816
		}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2817
		defs = defs->next;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2818
	}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2819
	if (!update) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2820
		defs = root;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2821
		/* didn't find, so see if it is a comment */
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2822
		(void) snprintf(string, MAX_STRING_LENGTH, "#%s=", tag);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2823
		len = strlen(string);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2824
		while (defs != NULL) {
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2825
			if (strncasecmp(defs->line, string, len) == 0) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2826
				/* replace with the new value */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2827
				free(defs->line);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2828
				fixcaseupper(tag);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2829
				(void) snprintf(string, sizeof (string),
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2830
				    "%s=%s\n", tag, value);
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2831
				string[MAX_STRING_LENGTH - 1] = '\0';
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2832
				defs->line = strdup(string);
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2833
				update = B_TRUE;
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2834
				break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2835
			}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2836
			defs = defs->next;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2837
		}
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2838
	}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2839
	if (!update) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2840
		fixcaseupper(tag);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2841
		(void) snprintf(string, sizeof (string), "%s=%s\n",
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2842
		    tag, value);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2843
		prev = root;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2844
		while (prev->next != NULL)
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2845
			prev = prev->next;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2846
		defs = malloc(sizeof (struct deffile));
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2847
		prev->next = defs;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2848
		if (defs != NULL) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2849
			defs->next = NULL;
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2850
			defs->line = strdup(string);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2851
			update = B_TRUE;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2852
		}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2853
	}
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2854
	if (update) {
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2855
		ret = write_default_file(NFSADMIN, root);
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2856
	}
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  2857
	free_default_file(root);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2858
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2859
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2860
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2861
/*
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2862
 * service_in_state(service, chkstate)
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2863
 *
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2864
 * Want to know if the specified service is in the desired state
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2865
 * (chkstate) or not. Return true (1) if it is and false (0) if it
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2866
 * isn't.
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2867
 */
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2868
static int
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2869
service_in_state(char *service, const char *chkstate)
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2870
{
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2871
	char *state;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2872
	int ret = B_FALSE;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2873
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2874
	state = smf_get_state(service);
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2875
	if (state != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2876
		/* got the state so get the equality for the return value */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2877
		ret = strcmp(state, chkstate) == 0 ? B_TRUE : B_FALSE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2878
		free(state);
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2879
	}
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2880
	return (ret);
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2881
}
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2882
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2883
/*
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2884
 * restart_service(svcs)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2885
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2886
 * Walk through the bit mask of services that need to be restarted in
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2887
 * order to use the new property values. Some properties affect
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2888
 * multiple daemons. Should only restart a service if it is currently
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2889
 * enabled (online).
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2890
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2891
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2892
static void
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2893
restart_service(uint32_t svcs)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2894
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2895
	uint32_t mask;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2896
	int ret;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2897
	char *service;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2898
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2899
	for (mask = 1; svcs != 0; mask <<= 1) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2900
		switch (svcs & mask) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2901
		case SVC_LOCKD:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2902
			service = LOCKD;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2903
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2904
		case SVC_STATD:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2905
			service = STATD;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2906
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2907
		case SVC_NFSD:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2908
			service = NFSD;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2909
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2910
		case SVC_MOUNTD:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2911
			service = MOUNTD;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2912
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2913
		case SVC_NFS4CBD:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2914
			service = NFS4CBD;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2915
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2916
		case SVC_NFSMAPID:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2917
			service = NFSMAPID;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2918
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2919
		case SVC_RQUOTAD:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2920
			service = RQUOTAD;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2921
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2922
		case SVC_NFSLOGD:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2923
			service = NFSLOGD;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2924
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2925
		default:
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2926
			continue;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2927
		}
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2928
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2929
		/*
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2930
		 * Only attempt to restart the service if it is
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2931
		 * currently running. In the future, it may be
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2932
		 * desirable to use smf_refresh_instance if the NFS
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2933
		 * services ever implement the refresh method.
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2934
		 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2935
		if (service_in_state(service, SCF_STATE_STRING_ONLINE)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2936
			ret = smf_restart_instance(service);
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2937
			/*
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2938
			 * There are only a few SMF errors at this point, but
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2939
			 * it is also possible that a bad value may have put
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2940
			 * the service into maintenance if there wasn't an
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2941
			 * SMF level error.
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2942
			 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2943
			if (ret != 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2944
				(void) fprintf(stderr,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2945
				    dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2946
				    "%s failed to restart: %s\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2947
				    scf_strerror(scf_error()));
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2948
			} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2949
				/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2950
				 * Check whether it has gone to "maintenance"
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2951
				 * mode or not. Maintenance implies something
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2952
				 * went wrong.
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2953
				 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2954
				if (service_in_state(service,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2955
				    SCF_STATE_STRING_MAINT)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2956
					(void) fprintf(stderr,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2957
					    dgettext(TEXT_DOMAIN,
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2958
					    "%s failed to restart\n"),
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2959
					    service);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2960
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2961
			}
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2962
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2963
		svcs &= ~mask;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2964
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2965
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2966
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  2967
/*
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2968
 * nfs_minmax_check(name, value)
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2969
 *
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2970
 * Verify that the value for the property specified by index is valid
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2971
 * relative to the opposite value in the case of a min/max variable.
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2972
 * Currently, server_minvers/server_maxvers and
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2973
 * client_minvers/client_maxvers are the only ones to check.
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2974
 */
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2975
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2976
static int
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2977
nfs_minmax_check(int index, int value)
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2978
{
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2979
	int val;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2980
	char *pval;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2981
	sa_property_t prop;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2982
	sa_optionset_t opts;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2983
	int ret = B_TRUE;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2984
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2985
	if (proto_options[index].other != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2986
		/* have a property to compare against */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2987
		opts = nfs_get_proto_set();
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2988
		prop = sa_get_property(opts, proto_options[index].other);
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2989
		/*
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2990
		 * If we don't find the property, assume default
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2991
		 * values which will work since the max will be at the
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2992
		 * max and the min at the min.
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  2993
		 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2994
		if (prop != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2995
			pval = sa_get_property_attr(prop, "value");
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2996
			if (pval != NULL) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2997
				val = strtoul(pval, NULL, 0);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2998
				if (proto_options[index].compare ==
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  2999
				    OPT_CMP_LE) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3000
					ret = value <= val ? B_TRUE : B_FALSE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3001
				} else if (proto_options[index].compare ==
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3002
				    OPT_CMP_GE) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3003
					ret = value >= val ? B_TRUE : B_FALSE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3004
				}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3005
			}
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3006
		}
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3007
	}
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3008
	return (ret);
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3009
}
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3010
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3011
/*
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3012
 * nfs_validate_proto_prop(index, name, value)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3013
 *
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3014
 * Verify that the property specified by name can take the new
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3015
 * value. This is a sanity check to prevent bad values getting into
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3016
 * the default files. All values need to be checked against what is
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3017
 * allowed by their defined type. If a type isn't explicitly defined
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3018
 * here, it is treated as a string.
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3019
 *
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3020
 * Note that OPT_TYPE_NUMBER will additionally check that the value is
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3021
 * within the range specified and potentially against another property
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3022
 * value as well as specified in the proto_options members other and
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3023
 * compare.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3024
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3025
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3026
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3027
nfs_validate_proto_prop(int index, char *name, char *value)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3028
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3029
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3030
	char *cp;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3031
#ifdef lint
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3032
	name = name;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3033
#endif
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3035
	switch (proto_options[index].type) {
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3036
	case OPT_TYPE_NUMBER:
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3037
		if (!is_a_number(value))
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3038
			ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3039
		else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3040
			int val;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3041
			val = strtoul(value, NULL, 0);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3042
			if (val < proto_options[index].minval ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3043
			    val > proto_options[index].maxval)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3044
				ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3045
			/*
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3046
			 * For server_versmin/server_versmax and
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3047
			 * client_versmin/client_versmax, the value of the
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3048
			 * min(max) should be checked to be correct relative
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3049
			 * to the current max(min).
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3050
			 */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3051
			if (!nfs_minmax_check(index, val)) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3052
				ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3053
			}
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3054
		}
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3055
		break;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3056
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3057
	case OPT_TYPE_DOMAIN:
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3058
		/*
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3059
		 * needs to be a qualified domain so will have at
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3060
		 * least one period and other characters on either
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3061
		 * side of it.  A zero length string is also allowed
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3062
		 * and is the way to turn off the override.
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3063
		 */
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3064
		if (strlen(value) == 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3065
			break;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3066
		cp = strchr(value, '.');
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3067
		if (cp == NULL || cp == value || strchr(value, '@') != NULL)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3068
			ret = SA_BAD_VALUE;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3069
		break;
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3070
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3071
	case OPT_TYPE_BOOLEAN:
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3072
		if (strlen(value) == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3073
		    strcasecmp(value, "true") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3074
		    strcmp(value, "1") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3075
		    strcasecmp(value, "false") == 0 ||
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3076
		    strcmp(value, "0") == 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3077
			ret = SA_OK;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3078
		} else {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3079
			ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3080
		}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3081
		break;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3082
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3083
	case OPT_TYPE_ONOFF:
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3084
		if (strcasecmp(value, "on") != 0 &&
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3085
		    strcasecmp(value, "off") != 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3086
			ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3087
		}
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3088
		break;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3089
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3090
	case OPT_TYPE_PROTOCOL:
6162
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  3091
		if (strlen(value) != 0 &&
eb677bca555d 6671097 libshare can dump core when plugin initialization fails
dougm
parents: 6088
diff changeset
  3092
		    strcasecmp(value, "all") != 0 &&
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3093
		    strcasecmp(value, "tcp") != 0 &&
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3094
		    strcasecmp(value, "udp") != 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3095
			ret = SA_BAD_VALUE;
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3096
		break;
3393
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3097
660717ce3a70 6493258 sharemgr: *sharectl* usage is confusing
dougm
parents: 3034
diff changeset
  3098
	default:
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3099
		/* treat as a string */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3100
		break;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3101
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3102
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3103
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3104
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3105
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3106
 * nfs_set_proto_prop(prop)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3107
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3108
 * check that prop is valid.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3109
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3110
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3111
static int
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3112
nfs_set_proto_prop(sa_property_t prop)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3113
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3114
	int ret = SA_OK;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3115
	char *name;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3116
	char *value;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3117
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3118
	name = sa_get_property_attr(prop, "type");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3119
	value = sa_get_property_attr(prop, "value");
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3120
	if (name != NULL && value != NULL) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3121
		int index = findprotoopt(name, 1);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3122
		if (index >= 0) {
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3123
			/* should test for valid value */
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3124
			ret = nfs_validate_proto_prop(index, name, value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3125
			if (ret == SA_OK)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3126
				ret = set_default_file_value(
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3127
				    proto_options[index].tag, value);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3128
			if (ret == SA_OK)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3129
				restart_service(proto_options[index].svcs);
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3130
		}
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3131
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3132
	if (name != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3133
		sa_free_attr_string(name);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3134
	if (value != NULL)
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3135
		sa_free_attr_string(value);
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3136
	return (ret);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3137
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3138
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3139
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3140
 * nfs_get_status()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3141
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3142
 * What is the current status of the nfsd? We use the SMF state here.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3143
 * Caller must free the returned value.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3144
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3145
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3146
static char *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3147
nfs_get_status()
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3148
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3149
	char *state;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3150
	state = smf_get_state(NFSD);
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3151
	return (state != NULL ? state : strdup("-"));
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3152
}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3153
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3154
/*
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3155
 * nfs_space_alias(alias)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3156
 *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3157
 * Lookup the space (security) name. If it is default, convert to the
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3158
 * real name.
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3159
 */
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3160
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3161
static char *
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3162
nfs_space_alias(char *space)
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3163
{
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3164
	char *name = space;
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3165
	seconfig_t secconf;
3663
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3166
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3167
	/*
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3168
	 * Only the space named "default" is special. If it is used,
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3169
	 * the default needs to be looked up and the real name used.
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3170
	 * This is normally "sys" but could be changed.  We always
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3171
	 * change defautl to the real name.
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3172
	 */
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3173
	if (strcmp(space, "default") == 0 &&
718327411bfa 6493853 sharemgr: inconsistent messages if parent is shared with UFS and ZFS
dougm
parents: 3393
diff changeset
  3174
	    nfs_getseconfig_default(&secconf) == 0) {
4345
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3175
		if (nfs_getseconfig_bynumber(secconf.sc_nfsnum, &secconf) == 0)
20eb5d8abe27 6548000 sharemgr dumps core on allocation failure
dougm
parents: 4241
diff changeset
  3176
			name = secconf.sc_name;
3034
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3177
	}
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3178
	return (strdup(name));
3199b356d00f PSARC 2005/374 Share management improvements
dougm
parents:
diff changeset
  3179
}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3180
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3181
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3182
 * nfs_features()
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3183
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3184
 * Return a mask of the features required.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3185
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3186
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3187
static uint64_t
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3188
nfs_features()
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3189
{
6088
b28bff9b9414 6666213 share manager displays an error message when a share is added to a group created without -P.
dougm
parents: 6019
diff changeset
  3190
	return ((uint64_t)SA_FEATURE_DFSTAB | SA_FEATURE_SERVER);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5179
diff changeset
  3191
}