usr/src/cmd/zonecfg/zonecfg.c
author dp
Thu, 22 Jun 2006 14:42:46 -0700
changeset 2267 c5d9a656170f
parent 1645 5c204cdba7d2
child 2303 327ca1e2fdf0
permissions -rw-r--r--
PSARC/2006/269 Zone Boot Arguments II 4943812 init improperly respawning stuff during reboot 4994285 RFE: zones should support boot arguments 6315349 halt.c contains an uninitialized variable 6395642 missing global zone checks for menu updates in uadmin(2) 6415633 krtld calls printf(), goes boom 6421372 libc's lintlib doesn't include <sys/uadmin.h> 6433526 zoneadm should use statvfs64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1497
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
     5
 * Common Development and Distribution License (the "License").
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
222
dd716cb7b870 6228039 bfu clobbers amd64 sysinit module
comay
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
1497
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
    23
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * zonecfg is a lex/yacc based command interpreter used to manage zone
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 * configurations.  The lexer (see zonecfg_lex.l) builds up tokens, which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * the grammar (see zonecfg_grammar.y) builds up into commands, some of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * which takes resources and/or properties as arguments.  See the block
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * comments near the end of zonecfg_grammar.y for how the data structures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * which keep track of these resources and properties are built up.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * The resource/property data structures are inserted into a command
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 * structure (see zonecfg.h), which also keeps track of command names,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 * miscellaneous arguments, and function handlers.  The grammar selects
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * the appropriate function handler, each of which takes a pointer to a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * command structure as its sole argument, and invokes it.  The grammar
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * itself is "entered" (a la the Matrix) by yyparse(), which is called
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * from read_input(), our main driving function.  That in turn is called
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * by one of do_interactive(), cmd_file() or one_command_at_a_time(), each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * of which is called from main() depending on how the program was invoked.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * The rest of this module consists of the various function handlers and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 * their helper functions.  Some of these functions, particularly the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * X_to_str() functions, which maps command, resource and property numbers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * to strings, are used quite liberally, as doing so results in a better
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * program w/rt I18N, reducing the need for translation notes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/mntent.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <sys/varargs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <assert.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#include <zone.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#include <arpa/inet.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#include <netdb.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#include <libintl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#include <alloca.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include <regex.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
#include <libtecla.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
    74
#include <libzfs.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#include <libzonecfg.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#include "zonecfg.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#if !defined(TEXT_DOMAIN)		/* should be defined by cc -D */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
#define	TEXT_DOMAIN	"SYS_TEST"	/* Use this only if it wasn't */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#define	PAGER	"/usr/bin/more"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
struct help {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	uint_t	cmd_num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	char	*cmd_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	uint_t	flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	char	*short_usage;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
extern int yyparse(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
extern int lex_lineno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#define	MAX_LINE_LEN	1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
#define	MAX_CMD_HIST	1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
 * Each SHELP_ should be a simple string.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
#define	SHELP_ADD	"add <resource-type>\n\t(global scope)\n" \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	"add <property-name> <property-value>\n\t(resource scope)"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
#define	SHELP_CANCEL	"cancel"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
#define	SHELP_COMMIT	"commit"
1507
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
   106
#define	SHELP_CREATE	"create [-F] [ -a <path> | -b | -t <template> ]"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
#define	SHELP_DELETE	"delete [-F]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
#define	SHELP_END	"end"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
#define	SHELP_EXIT	"exit [-F]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
#define	SHELP_EXPORT	"export [-f output-file]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
#define	SHELP_HELP	"help [commands] [syntax] [usage] [<command-name>]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
#define	SHELP_INFO	"info [<resource-type> [property-name=property-value]*]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
#define	SHELP_REMOVE	"remove <resource-type> { <property-name>=<property-" \
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   114
	"value> }\n\t(global scope)\nremove <property-name> <property-value>" \
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	"\n\t(resource scope)"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
#define	SHELP_REVERT	"revert [-F]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
#define	SHELP_SELECT	"select <resource-type> { <property-name>=" \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	"<property-value> }"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
#define	SHELP_SET	"set <property-name>=<property-value>"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
#define	SHELP_VERIFY	"verify"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
static struct help helptab[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	{ CMD_ADD,	"add",		HELP_RES_PROPS,	SHELP_ADD, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	{ CMD_CANCEL,	"cancel",	0,		SHELP_CANCEL, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	{ CMD_COMMIT,	"commit",	0,		SHELP_COMMIT, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	{ CMD_CREATE,	"create",	0,		SHELP_CREATE, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	{ CMD_DELETE,	"delete",	0,		SHELP_DELETE, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	{ CMD_END,	"end",		0,		SHELP_END, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	{ CMD_EXIT,	"exit",		0,		SHELP_EXIT, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	{ CMD_EXPORT,	"export",	0,		SHELP_EXPORT, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	{ CMD_HELP,	"help",		0,		SHELP_HELP },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	{ CMD_INFO,	"info",		HELP_RES_PROPS,	SHELP_INFO, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	{ CMD_REMOVE,	"remove",	HELP_RES_PROPS,	SHELP_REMOVE, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	{ CMD_REVERT,	"revert",	0,		SHELP_REVERT, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	{ CMD_SELECT,	"select",	HELP_RES_PROPS,	SHELP_SELECT, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	{ CMD_SET,	"set",		HELP_PROPS,	SHELP_SET, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	{ CMD_VERIFY,	"verify",	0,		SHELP_VERIFY, },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	{ 0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
#define	MAX_RT_STRLEN	16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
/* These *must* match the order of the RT_ define's from zonecfg.h */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
static char *res_types[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	"unknown",
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   146
	"zonename",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	"zonepath",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	"autoboot",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	"pool",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	"fs",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	"inherit-pkg-dir",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	"net",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	"device",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	"rctl",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	"attr",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   156
	"dataset",
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   157
	"limitpriv",
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
   158
	"bootargs",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
/* These *must* match the order of the PT_ define's from zonecfg.h */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
static char *prop_types[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	"unknown",
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   165
	"zonename",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	"zonepath",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	"autoboot",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	"pool",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	"dir",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	"special",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	"type",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	"options",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	"address",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	"physical",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	"name",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	"value",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	"match",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	"priv",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	"limit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	"action",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	"raw",
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   182
	"limitpriv",
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
   183
	"bootargs",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   187
/* These *must* match the order of the PROP_VAL_ define's from zonecfg.h */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
static char *prop_val_types[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	"simple",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	"complex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	"list",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 * The various _cmds[] lists below are for command tab-completion.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
 * remove has a space afterwards because it has qualifiers; the other commands
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
 * that have qualifiers (add, select and set) don't need a space here because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
 * they have their own _cmds[] lists below.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
static const char *global_scope_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	"add",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	"commit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	"create",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	"delete",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	"exit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	"export",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	"help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	"info",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	"remove ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	"revert",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	"select",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	"set",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	"verify",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
static const char *add_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	"add fs",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	"add inherit-pkg-dir",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	"add net",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	"add device",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	"add rctl",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	"add attr",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   227
	"add dataset",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
static const char *select_cmds[] = {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   232
	"select fs ",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   233
	"select inherit-pkg-dir ",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   234
	"select net ",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   235
	"select device ",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   236
	"select rctl ",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   237
	"select attr ",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   238
	"select dataset ",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
static const char *set_cmds[] = {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   243
	"set zonename=",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   244
	"set zonepath=",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   245
	"set autoboot=",
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   246
	"set pool=",
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   247
	"set limitpriv=",
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
   248
	"set bootargs=",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
static const char *fs_res_scope_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	"add options ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	"cancel",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	"end",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	"exit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	"help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	"info",
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   259
	"remove options ",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	"set dir=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	"set raw=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	"set special=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	"set type=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
static const char *net_res_scope_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	"cancel",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	"end",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	"exit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	"help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	"info",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	"set address=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	"set physical=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
static const char *ipd_res_scope_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	"cancel",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	"end",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	"exit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	"help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	"info",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	"set dir=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
static const char *device_res_scope_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	"cancel",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	"end",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	"exit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	"help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	"info",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	"set match=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
static const char *attr_res_scope_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	"cancel",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	"end",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	"exit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	"help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	"info",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	"set name=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	"set type=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	"set value=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
static const char *rctl_res_scope_cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	"add value ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	"cancel",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	"end",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	"exit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	"help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	"info",
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   317
	"remove value ",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	"set name=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   322
static const char *dataset_res_scope_cmds[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   323
	"cancel",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   324
	"end",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   325
	"exit",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   326
	"help",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   327
	"info",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   328
	"set name=",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   329
	NULL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   330
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   331
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
/* Global variables */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
/* set early in main(), never modified thereafter, used all over the place */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
static char *execname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
/* set in main(), used all over the place */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
static zone_dochandle_t handle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
/* used all over the place */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   341
static char zone[ZONENAME_MAX];
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   342
static char revert_zone[ZONENAME_MAX];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
/* set in modifying functions, checked in read_input() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
static bool need_to_commit = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
bool saw_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
/* set in yacc parser, checked in read_input() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
bool newline_terminated;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
/* set in main(), checked in lex error handler */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
bool cmd_file_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
/* set in exit_func(), checked in read_input() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
static bool time_to_exit = FALSE, force_exit = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
/* used in short_usage() and zerr() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
static char *cmd_file_name = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
/* checked in read_input() and other places */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
static bool ok_to_prompt = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
/* set and checked in initialize() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
static bool got_handle = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
/* initialized in do_interactive(), checked in initialize() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
static bool interactive_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
/* set in main(), checked in multiple places */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
static bool read_only_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
static bool global_scope = TRUE; /* scope is outer/global or inner/resource */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
static int resource_scope;	/* should be in the RT_ list from zonecfg.h */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
static int end_op = -1;		/* operation on end is either add or modify */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
int num_prop_vals;		/* for grammar */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
 * These are for keeping track of resources as they are specified as part of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
 * the multi-step process.  They should be initialized by add_resource() or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 * select_func() and filled in by add_property() or set_func().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
static struct zone_fstab	old_fstab, in_progress_fstab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
static struct zone_fstab	old_ipdtab, in_progress_ipdtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
static struct zone_nwiftab	old_nwiftab, in_progress_nwiftab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
static struct zone_devtab	old_devtab, in_progress_devtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
static struct zone_rctltab	old_rctltab, in_progress_rctltab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
static struct zone_attrtab	old_attrtab, in_progress_attrtab;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   389
static struct zone_dstab	old_dstab, in_progress_dstab;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
static GetLine *gl;	/* The gl_get_line() resource object */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
/* Functions begin here */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
static bool
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
initial_match(const char *line1, const char *line2, int word_end)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	if (word_end <= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	return (strncmp(line1, line2, word_end) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
add_stuff(WordCompletion *cpl, const char *line1, const char **list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
    int word_end)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	int i, err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	for (i = 0; list[i] != NULL; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
		if (initial_match(line1, list[i], word_end)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
			err = cpl_add_completion(cpl, line1, 0, word_end,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
			    list[i] + word_end, "", "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
			if (err != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
				return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
static
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
CPL_MATCH_FN(cmd_cpl_fn)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	if (global_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		 * The MAX/MIN tests below are to make sure we have at least
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
		 * enough characters to distinguish from other prefixes (MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		 * but only check MIN(what we have, what we're checking).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		if (strncmp(line, "add ", MAX(MIN(word_end, 4), 1)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
			return (add_stuff(cpl, line, add_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
		if (strncmp(line, "select ", MAX(MIN(word_end, 7), 3)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
			return (add_stuff(cpl, line, select_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		if (strncmp(line, "set ", MAX(MIN(word_end, 4), 3)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
			return (add_stuff(cpl, line, set_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		return (add_stuff(cpl, line, global_scope_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	switch (resource_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		return (add_stuff(cpl, line, fs_res_scope_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	case RT_IPD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
		return (add_stuff(cpl, line, ipd_res_scope_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
		return (add_stuff(cpl, line, net_res_scope_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
		return (add_stuff(cpl, line, device_res_scope_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
		return (add_stuff(cpl, line, rctl_res_scope_cmds, word_end));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		return (add_stuff(cpl, line, attr_res_scope_cmds, word_end));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   451
	case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   452
		return (add_stuff(cpl, line, dataset_res_scope_cmds, word_end));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
 * For the main CMD_func() functions below, several of them call getopt()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
 * then check optind against argc to make sure an extra parameter was not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
 * passed in.  The reason this is not caught in the grammar is that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
 * grammar just checks for a miscellaneous TOKEN, which is *expected* to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
 * be "-F" (for example), but could be anything.  So (for example) this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
 * check will prevent "create bogus".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
cmd_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
alloc_cmd(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	return (calloc(1, sizeof (cmd_t)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
free_cmd(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	for (i = 0; i < MAX_EQ_PROP_PAIRS; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
		if (cmd->cmd_property_ptr[i] != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
			property_value_ptr_t pp = cmd->cmd_property_ptr[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
			switch (pp->pv_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
			case PROP_VAL_SIMPLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
				free(pp->pv_simple);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
			case PROP_VAL_COMPLEX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
				free_complex(pp->pv_complex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
			case PROP_VAL_LIST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
				free_list(pp->pv_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	for (i = 0; i < cmd->cmd_argc; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
		free(cmd->cmd_argv[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	free(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
complex_property_ptr_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
alloc_complex(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	return (calloc(1, sizeof (complex_property_t)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
free_complex(complex_property_ptr_t complex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	if (complex == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	free_complex(complex->cp_next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	if (complex->cp_value != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		free(complex->cp_value);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	free(complex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
list_property_ptr_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
alloc_list(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	return (calloc(1, sizeof (list_property_t)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
free_list(list_property_ptr_t list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	if (list == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	if (list->lp_simple != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
		free(list->lp_simple);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	free_complex(list->lp_complex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	free_list(list->lp_next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	free(list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
free_outer_list(list_property_ptr_t list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	if (list == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	free_outer_list(list->lp_next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
	free(list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
static struct zone_rctlvaltab *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
alloc_rctlvaltab(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	return (calloc(1, sizeof (struct zone_rctlvaltab)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
rt_to_str(int res_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	assert(res_type >= RT_MIN && res_type <= RT_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	return (res_types[res_type]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
pt_to_str(int prop_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	assert(prop_type >= PT_MIN && prop_type <= PT_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	return (prop_types[prop_type]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
pvt_to_str(int pv_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	assert(pv_type >= PROP_VAL_MIN && pv_type <= PROP_VAL_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	return (prop_val_types[pv_type]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
cmd_to_str(int cmd_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
	assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	return (helptab[cmd_num].cmd_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
 * This is a separate function rather than a set of define's because of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
 * gettext() wrapping.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
 * TRANSLATION_NOTE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
 * Each string below should have \t follow \n whenever needed; the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
 * initial \t and the terminal \n will be provided by the calling function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
long_help(int cmd_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	static char line[1024];	/* arbitrary large amount */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	switch (cmd_num) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		case CMD_HELP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
			return (gettext("Prints help message."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		case CMD_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			(void) snprintf(line, sizeof (line),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
			    gettext("Creates a configuration for the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
			    "specified zone.  %s should be\n\tused to "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
			    "begin configuring a new zone.  If overwriting an "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
			    "existing\n\tconfiguration, the -F flag can be "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
			    "used to force the action.  If\n\t-t template is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
			    "given, creates a configuration identical to the\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
			    "\tspecified template, except that the zone name "
1634
1fdc3a400294 6397915 Usage text for detach & attach seems to be missing
gjelinek
parents: 1507
diff changeset
   605
			    "is changed from\n\ttemplate to zonename.  '%s -a' "
1fdc3a400294 6397915 Usage text for detach & attach seems to be missing
gjelinek
parents: 1507
diff changeset
   606
			    "creates a configuration from a\n\tdetached "
1fdc3a400294 6397915 Usage text for detach & attach seems to be missing
gjelinek
parents: 1507
diff changeset
   607
			    "zonepath.  '%s -b' results in a blank "
1fdc3a400294 6397915 Usage text for detach & attach seems to be missing
gjelinek
parents: 1507
diff changeset
   608
			    "configuration.\n\t'%s' with no arguments applies "
1fdc3a400294 6397915 Usage text for detach & attach seems to be missing
gjelinek
parents: 1507
diff changeset
   609
			    "the Sun default settings."),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
			    cmd_to_str(CMD_CREATE), cmd_to_str(CMD_CREATE),
1634
1fdc3a400294 6397915 Usage text for detach & attach seems to be missing
gjelinek
parents: 1507
diff changeset
   611
			    cmd_to_str(CMD_CREATE), cmd_to_str(CMD_CREATE));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
			return (line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		case CMD_EXIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
			return (gettext("Exits the program.  The -F flag can "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
			    "be used to force the action."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		case CMD_EXPORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
			return (gettext("Prints configuration to standard "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
			    "output, or to output-file if\n\tspecified, in "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
			    "a form suitable for use in a command-file."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
		case CMD_ADD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
			return (gettext("Add specified resource to "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
			    "configuration."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
		case CMD_DELETE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
			return (gettext("Deletes the specified zone.  The -F "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
			    "flag can be used to force the\n\taction."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
		case CMD_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
			return (gettext("Remove specified resource from "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
			    "configuration.  Note that the curly\n\tbraces "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
			    "('{', '}') mean one or more of whatever "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
			    "is between them."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
		case CMD_SELECT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
			(void) snprintf(line, sizeof (line),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
			    gettext("Selects a resource to modify.  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
			    "Resource modification is completed\n\twith the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
			    "command \"%s\".  The property name/value pairs "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			    "must uniquely\n\tidentify a resource.  Note that "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			    "the curly braces ('{', '}') mean one\n\tor more "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
			    "of whatever is between them."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
			    cmd_to_str(CMD_END));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
			return (line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
		case CMD_SET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
			return (gettext("Sets property values."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
		case CMD_INFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
			return (gettext("Displays information about the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
			    "current configuration.  If resource\n\ttype is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
			    "specified, displays only information about "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
			    "resources of\n\tthe relevant type.  If resource "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
			    "id is specified, displays only\n\tinformation "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
			    "about that resource."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
		case CMD_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
			return (gettext("Verifies current configuration "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
			    "for correctness (some resource types\n\thave "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
			    "required properties)."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		case CMD_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
			(void) snprintf(line, sizeof (line),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
			    gettext("Commits current configuration.  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
			    "Configuration must be committed to\n\tbe used by "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
			    "%s.  Until the configuration is committed, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
			    "changes \n\tcan be removed with the %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
			    "command.  This operation is\n\tattempted "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
			    "automatically upon completion of a %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
			    "session."), "zoneadm", cmd_to_str(CMD_REVERT),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
			    "zonecfg");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
			return (line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
		case CMD_REVERT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
			return (gettext("Reverts configuration back to the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
			    "last committed state.  The -F flag\n\tcan be "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
			    "used to force the action."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
		case CMD_CANCEL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
			return (gettext("Cancels resource/property "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
			    "specification."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		case CMD_END:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
			return (gettext("Ends resource/property "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
			    "specification."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	/* NOTREACHED */
222
dd716cb7b870 6228039 bfu clobbers amd64 sysinit module
comay
parents: 0
diff changeset
   677
	return (NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
 * Called with verbose TRUE when help is explicitly requested, FALSE for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
 * unexpected errors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
usage(bool verbose, uint_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	FILE *fp = verbose ? stdout : stderr, *newfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	bool need_to_close = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	char *pager;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	/* don't page error output */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	if (verbose && interactive_mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		if ((pager = getenv("PAGER")) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
			pager = PAGER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		if ((newfp = popen(pager, "w")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
			need_to_close = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
			fp = newfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	if (flags & HELP_META) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
		(void) fprintf(fp, gettext("More help is available for the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
		    "following:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
		(void) fprintf(fp, "\n\tcommands ('%s commands')\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
		    cmd_to_str(CMD_HELP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		(void) fprintf(fp, "\tsyntax ('%s syntax')\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
		    cmd_to_str(CMD_HELP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		(void) fprintf(fp, "\tusage ('%s usage')\n\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
		    cmd_to_str(CMD_HELP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
		(void) fprintf(fp, gettext("You may also obtain help on any "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
		    "command by typing '%s <command-name>.'\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
		    cmd_to_str(CMD_HELP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	if (flags & HELP_RES_SCOPE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
		switch (resource_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
		case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
			(void) fprintf(fp, gettext("The '%s' resource scope is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
			    "used to configure a file-system.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
			    rt_to_str(resource_scope));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
			(void) fprintf(fp, gettext("Valid commands:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
			    pt_to_str(PT_DIR), gettext("<path>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
			    pt_to_str(PT_SPECIAL), gettext("<path>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
			    pt_to_str(PT_RAW), gettext("<raw-device>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
			    pt_to_str(PT_TYPE), gettext("<file-system type>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
			(void) fprintf(fp, "\t%s %s %s\n", cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
			    pt_to_str(PT_OPTIONS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
			    gettext("<file-system options>"));
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   733
			(void) fprintf(fp, "\t%s %s %s\n",
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   734
			    cmd_to_str(CMD_REMOVE), pt_to_str(PT_OPTIONS),
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   735
			    gettext("<file-system options>"));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
			(void) fprintf(fp, gettext("Consult the file-system "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
			    "specific manual page, such as mount_ufs(1M), "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
			    "for\ndetails about file-system options.  Note "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
			    "that any file-system options with an\nembedded "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
			    "'=' character must be enclosed in double quotes, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
			    /*CSTYLED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
			    "such as \"%s=5\".\n"), MNTOPT_RETRY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
		case RT_IPD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
			(void) fprintf(fp, gettext("The '%s' resource scope is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
			    "used to configure a directory\ninherited from the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
			    "global zone into a non-global zone in read-only "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
			    "mode.\n"), rt_to_str(resource_scope));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
			(void) fprintf(fp, gettext("Valid commands:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
			    pt_to_str(PT_DIR), gettext("<path>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
		case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
			(void) fprintf(fp, gettext("The '%s' resource scope is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
			    "used to configure a network interface.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
			    rt_to_str(resource_scope));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
			(void) fprintf(fp, gettext("Valid commands:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
			    pt_to_str(PT_ADDRESS), gettext("<IP-address>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
			    pt_to_str(PT_PHYSICAL), gettext("<interface>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
			(void) fprintf(fp, gettext("See ifconfig(1M) for "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
			    "details of the <interface> string.\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
		case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
			(void) fprintf(fp, gettext("The '%s' resource scope is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
			    "used to configure a device node.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
			    rt_to_str(resource_scope));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
			(void) fprintf(fp, gettext("Valid commands:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
			    pt_to_str(PT_MATCH), gettext("<device-path>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
		case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
			(void) fprintf(fp, gettext("The '%s' resource scope is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
			    "used to configure a resource control.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
			    rt_to_str(resource_scope));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
			(void) fprintf(fp, gettext("Valid commands:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
			    pt_to_str(PT_NAME), gettext("<string>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
			(void) fprintf(fp, "\t%s %s (%s=%s,%s=%s,%s=%s)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
			    cmd_to_str(CMD_ADD), pt_to_str(PT_VALUE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
			    pt_to_str(PT_PRIV), gettext("<priv-value>"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
			    pt_to_str(PT_LIMIT), gettext("<number>"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
			    pt_to_str(PT_ACTION), gettext("<action-value>"));
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   785
			(void) fprintf(fp, "\t%s %s (%s=%s,%s=%s,%s=%s)\n",
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   786
			    cmd_to_str(CMD_REMOVE), pt_to_str(PT_VALUE),
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   787
			    pt_to_str(PT_PRIV), gettext("<priv-value>"),
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   788
			    pt_to_str(PT_LIMIT), gettext("<number>"),
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   789
			    pt_to_str(PT_ACTION), gettext("<action-value>"));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
			(void) fprintf(fp, "%s\n\t%s := privileged\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
			    "\t%s := none | deny\n", gettext("Where"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
			    gettext("<priv-value>"), gettext("<action-value>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
		case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
			(void) fprintf(fp, gettext("The '%s' resource scope is "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
			    "used to configure a generic attribute.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
			    rt_to_str(resource_scope));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
			(void) fprintf(fp, gettext("Valid commands:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
			    pt_to_str(PT_NAME), gettext("<name>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
			(void) fprintf(fp, "\t%s %s=boolean\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
			    cmd_to_str(CMD_SET), pt_to_str(PT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
			(void) fprintf(fp, "\t%s %s=true | false\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
			    cmd_to_str(CMD_SET), pt_to_str(PT_VALUE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
			(void) fprintf(fp, gettext("or\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
			(void) fprintf(fp, "\t%s %s=int\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
			    pt_to_str(PT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
			    pt_to_str(PT_VALUE), gettext("<integer>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
			(void) fprintf(fp, gettext("or\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
			(void) fprintf(fp, "\t%s %s=string\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
			    cmd_to_str(CMD_SET), pt_to_str(PT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
			    pt_to_str(PT_VALUE), gettext("<string>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
			(void) fprintf(fp, gettext("or\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
			(void) fprintf(fp, "\t%s %s=uint\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
			    cmd_to_str(CMD_SET), pt_to_str(PT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
			    pt_to_str(PT_VALUE), gettext("<unsigned integer>"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   821
		case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   822
			(void) fprintf(fp, gettext("The '%s' resource scope is "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   823
			    "used to export ZFS datasets.\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   824
			    rt_to_str(resource_scope));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   825
			(void) fprintf(fp, gettext("Valid commands:\n"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   826
			(void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   827
			    pt_to_str(PT_NAME), gettext("<name>"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   828
			break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
		(void) fprintf(fp, gettext("And from any resource scope, you "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
		    "can:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
		(void) fprintf(fp, "\t%s\t%s\n", cmd_to_str(CMD_END),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
		    gettext("(to conclude this operation)"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
		(void) fprintf(fp, "\t%s\t%s\n", cmd_to_str(CMD_CANCEL),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
		    gettext("(to cancel this operation)"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
		(void) fprintf(fp, "\t%s\t%s\n", cmd_to_str(CMD_EXIT),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
		    gettext("(to exit the zonecfg utility)"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
	if (flags & HELP_USAGE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
		(void) fprintf(fp, "%s:\t%s %s\n", gettext("usage"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
		    execname, cmd_to_str(CMD_HELP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
		(void) fprintf(fp, "\t%s -z <zone>\t\t\t(%s)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
		    execname, gettext("interactive"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
		(void) fprintf(fp, "\t%s -z <zone> <command>\n", execname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
		(void) fprintf(fp, "\t%s -z <zone> -f <command-file>\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
		    execname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
	if (flags & HELP_SUBCMDS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
		(void) fprintf(fp, "%s:\n\n", gettext("Commands"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
		for (i = 0; i <= CMD_MAX; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
			(void) fprintf(fp, "%s\n", helptab[i].short_usage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
			if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
				(void) fprintf(fp, "\t%s\n\n", long_help(i));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	if (flags & HELP_SYNTAX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		if (!verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
			(void) fprintf(fp, "\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
		(void) fprintf(fp, "<zone> := [A-Za-z0-9][A-Za-z0-9_.-]*\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
		(void) fprintf(fp, gettext("\t(except the reserved words "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
		    "'%s' and anything starting with '%s')\n"), "global",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
		    "SUNW");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
		(void) fprintf(fp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
		    gettext("\tName must be less than %d characters.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
		    ZONENAME_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
		if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
			(void) fprintf(fp, "\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	if (flags & HELP_NETADDR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
		(void) fprintf(fp, gettext("\n<net-addr> :="));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
		(void) fprintf(fp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
		    gettext("\t<IPv4-address>[/<IPv4-prefix-length>] |\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		(void) fprintf(fp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
		    gettext("\t\t<IPv6-address>/<IPv6-prefix-length> |\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
		(void) fprintf(fp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
		    gettext("\t\t<hostname>[/<IPv4-prefix-length>]\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
		(void) fprintf(fp, gettext("See inet(3SOCKET) for IPv4 and "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
		    "IPv6 address syntax.\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		(void) fprintf(fp, gettext("<IPv4-prefix-length> := [0-32]\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
		(void) fprintf(fp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
		    gettext("<IPv6-prefix-length> := [0-128]\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
		(void) fprintf(fp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
		    gettext("<hostname> := [A-Za-z0-9][A-Za-z0-9-.]*\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
	if (flags & HELP_RESOURCES) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
		(void) fprintf(fp, "<%s> := %s | %s | %s | %s | %s | %s\n\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		    gettext("resource type"), rt_to_str(RT_FS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		    rt_to_str(RT_IPD), rt_to_str(RT_NET), rt_to_str(RT_DEVICE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
		    rt_to_str(RT_RCTL), rt_to_str(RT_ATTR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	if (flags & HELP_PROPS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
		(void) fprintf(fp, gettext("For resource type ... there are "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
		    "property types ...:\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
		(void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   895
		    pt_to_str(PT_ZONENAME));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   896
		(void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
		    pt_to_str(PT_ZONEPATH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
		(void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
		    pt_to_str(PT_AUTOBOOT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
		(void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
   901
		    pt_to_str(PT_BOOTARGS));
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
   902
		(void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
		    pt_to_str(PT_POOL));
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   904
		(void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
   905
		    pt_to_str(PT_LIMITPRIV));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
		(void) fprintf(fp, "\t%s\t\t%s, %s, %s, %s\n", rt_to_str(RT_FS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
		    pt_to_str(PT_DIR), pt_to_str(PT_SPECIAL),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
		    pt_to_str(PT_RAW), pt_to_str(PT_TYPE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
		    pt_to_str(PT_OPTIONS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
		(void) fprintf(fp, "\t%s\t%s\n", rt_to_str(RT_IPD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
		    pt_to_str(PT_DIR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		(void) fprintf(fp, "\t%s\t\t%s, %s\n", rt_to_str(RT_NET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
		    pt_to_str(PT_ADDRESS), pt_to_str(PT_PHYSICAL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
		(void) fprintf(fp, "\t%s\t\t%s\n", rt_to_str(RT_DEVICE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
		    pt_to_str(PT_MATCH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
		(void) fprintf(fp, "\t%s\t\t%s, %s\n", rt_to_str(RT_RCTL),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
		    pt_to_str(PT_NAME), pt_to_str(PT_VALUE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
		(void) fprintf(fp, "\t%s\t\t%s, %s, %s\n", rt_to_str(RT_ATTR),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
		    pt_to_str(PT_NAME), pt_to_str(PT_TYPE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		    pt_to_str(PT_VALUE));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   921
		(void) fprintf(fp, "\t%s\t\t%s\n", rt_to_str(RT_DATASET),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
   922
		    pt_to_str(PT_NAME));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	if (need_to_close)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
		(void) pclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
/* PRINTFLIKE1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
zerr(const char *fmt, ...)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
	va_list alist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
	static int last_lineno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	/* lex_lineno has already been incremented in the lexer; compensate */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
	if (cmd_file_mode && lex_lineno > last_lineno) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
		if (strcmp(cmd_file_name, "-") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
			(void) fprintf(stderr, gettext("On line %d:\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
			    lex_lineno - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
			(void) fprintf(stderr, gettext("On line %d of %s:\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
			    lex_lineno - 1, cmd_file_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
		last_lineno = lex_lineno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
	va_start(alist, fmt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	(void) vfprintf(stderr, fmt, alist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	(void) fprintf(stderr, "\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	va_end(alist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
zone_perror(char *prefix, int err, bool set_saw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
	zerr("%s: %s", prefix, zonecfg_strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
	if (set_saw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
 * zone_perror() expects a single string, but for remove and select
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
 * we have both the command and the resource type, so this wrapper
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
 * function serves the same purpose in a slightly different way.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
z_cmd_rt_perror(int cmd_num, int res_num, int err, bool set_saw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
	zerr("%s %s: %s", cmd_to_str(cmd_num), rt_to_str(res_num),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
	    zonecfg_strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
	if (set_saw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
/* returns Z_OK if successful, Z_foo from <libzonecfg.h> otherwise */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
initialize(bool handle_expected)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	if (zonecfg_check_handle(handle) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
		if ((err = zonecfg_get_handle(zone, handle)) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
			got_handle = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
			zone_perror(zone, err, handle_expected || got_handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
			if (err == Z_NO_ZONE && !got_handle &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
			    interactive_mode && !read_only_mode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
				(void) printf(gettext("Use '%s' to begin "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
				    "configuring a new zone.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
				    cmd_to_str(CMD_CREATE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
			return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
	return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   996
static bool
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   997
state_atleast(zone_state_t state)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   998
{
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
   999
	zone_state_t state_num;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1000
	int err;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1001
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1002
	if ((err = zone_get_state(zone, &state_num)) != Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1003
		/* all states are greater than "non-existent" */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1004
		if (err == Z_NO_ZONE)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1005
			return (B_FALSE);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1006
		zerr(gettext("Unexpectedly failed to determine state "
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1007
		    "of zone %s: %s"), zone, zonecfg_strerror(err));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1008
		exit(Z_ERR);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1009
	}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1010
	return (state_num >= state);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1011
}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1012
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
 * short_usage() is for bad syntax: getopt() issues, too many arguments, etc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
short_usage(int command)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
	/* lex_lineno has already been incremented in the lexer; compensate */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
	if (cmd_file_mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
		if (strcmp(cmd_file_name, "-") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
			(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
			    gettext("syntax error on line %d\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
			    lex_lineno - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
			(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
			    gettext("syntax error on line %d of %s\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
			    lex_lineno - 1, cmd_file_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
	(void) fprintf(stderr, "%s:\n%s\n", gettext("usage"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	    helptab[command].short_usage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
 * long_usage() is for bad semantics: e.g., wrong property type for a given
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
 * resource type.  It is also used by longer_usage() below.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
long_usage(uint_t cmd_num, bool set_saw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
	(void) fprintf(set_saw ? stderr : stdout, "%s:\n%s\n", gettext("usage"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
	    helptab[cmd_num].short_usage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
	(void) fprintf(set_saw ? stderr : stdout, "\t%s\n", long_help(cmd_num));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
	if (set_saw)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
 * longer_usage() is for 'help foo' and 'foo -?': call long_usage() and also
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
 * any extra usage() flags as appropriate for whatever command.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
longer_usage(uint_t cmd_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
	long_usage(cmd_num, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	if (helptab[cmd_num].flags != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
		(void) printf("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
		usage(TRUE, helptab[cmd_num].flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
 * scope_usage() is simply used when a command is called from the wrong scope.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
scope_usage(uint_t cmd_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
	zerr(gettext("The %s command only makes sense in the %s scope."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
	    cmd_to_str(cmd_num),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
	    global_scope ?  gettext("resource") : gettext("global"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
 * On input, TRUE => yes, FALSE => no.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
 * On return, TRUE => 1, FALSE => no, could not ask => -1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
ask_yesno(bool default_answer, const char *question)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
	char line[64];	/* should be enough to answer yes or no */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
	if (!ok_to_prompt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
	for (;;) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1094
		if (printf("%s (%s)? ", question,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1095
		    default_answer ? "[y]/n" : "y/[n]") < 0)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1096
			return (-1);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1097
		if (fgets(line, sizeof (line), stdin) == NULL)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1098
			return (-1);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1099
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1100
		if (line[0] == '\n')
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
			return (default_answer ? 1 : 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
		if (tolower(line[0]) == 'y')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
		if (tolower(line[0]) == 'n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
 * Prints warning if zone already exists.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
 * In interactive mode, prompts if we should continue anyway and returns Z_OK
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
 * if so, Z_ERR if not.  In non-interactive mode, exits with Z_ERR.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
 * Note that if a zone exists and its state is >= INSTALLED, an error message
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
 * will be printed and this function will return Z_ERR regardless of mode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
check_if_zone_already_exists(bool force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
	char line[ZONENAME_MAX + 128];	/* enough to ask a question */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
	zone_dochandle_t tmphandle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
	int res, answer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
	if ((tmphandle = zonecfg_init_handle()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
		zone_perror(execname, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
	res = zonecfg_get_handle(zone, tmphandle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
	zonecfg_fini_handle(tmphandle);
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1131
	if (res != Z_OK)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
		return (Z_OK);
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1133
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1134
	if (state_atleast(ZONE_STATE_INSTALLED)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
		zerr(gettext("Zone %s already installed; %s not allowed."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		    zone, cmd_to_str(CMD_CREATE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	if (force) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
		(void) printf(gettext("Zone %s already exists; overwriting.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
		    zone);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	(void) snprintf(line, sizeof (line),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
	    gettext("Zone %s already exists; %s anyway"), zone,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
	    cmd_to_str(CMD_CREATE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	if ((answer = ask_yesno(FALSE, line)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
		zerr(gettext("Zone exists, input not from terminal and -F not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
		    "specified:\n%s command ignored, exiting."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		    cmd_to_str(CMD_CREATE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
	return (answer == 1 ? Z_OK : Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
static bool
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
zone_is_read_only(int cmd_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
	if (strncmp(zone, "SUNW", 4) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
		zerr(gettext("%s: zones beginning with SUNW are read-only."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
		    zone);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
	if (read_only_mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
		zerr(gettext("%s: cannot %s in read-only mode."), zone,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
		    cmd_to_str(cmd_num));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
 * Create a new configuration.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
create_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
	int err, arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
	char zone_template[ZONENAME_MAX];
1507
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1183
	char attach_path[MAXPATHLEN];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	zone_dochandle_t tmphandle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
	bool force = FALSE;
1507
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1186
	bool attach = FALSE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
	/* This is the default if no arguments are given. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	(void) strlcpy(zone_template, "SUNWdefault", sizeof (zone_template));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
	optind = 0;
1507
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1194
	while ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?a:bFt:")) != EOF) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
			if (optopt == '?')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
				longer_usage(CMD_CREATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
				short_usage(CMD_CREATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
			return;
1507
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1202
		case 'a':
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1203
			(void) strlcpy(attach_path, optarg,
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1204
			    sizeof (attach_path));
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1205
			attach = TRUE;
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1206
			break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
		case 'b':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
			(void) strlcpy(zone_template, "SUNWblank",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
			    sizeof (zone_template));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
		case 'F':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
			force = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
		case 't':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
			(void) strlcpy(zone_template, optarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
			    sizeof (zone_template));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
			short_usage(CMD_CREATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
		short_usage(CMD_CREATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
	if (zone_is_read_only(CMD_CREATE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
	if (check_if_zone_already_exists(force) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
	 * Get a temporary handle first.  If that fails, the old handle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
	 * will not be lost.  Then finish whichever one we don't need,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
	 * to avoid leaks.  Then get the handle for zone_template, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
	 * set the name to zone: this "copy, rename" method is how
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
	 * create -[b|t] works.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
	if ((tmphandle = zonecfg_init_handle()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
		zone_perror(execname, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
	}
1507
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1245
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1246
	if (attach)
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1247
		err = zonecfg_get_attach_handle(attach_path, zone, B_FALSE,
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1248
		    tmphandle);
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1249
	else
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1250
		err = zonecfg_get_template_handle(zone_template, zone,
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1251
		    tmphandle);
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1252
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1253
	if (err != Z_OK) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
		zonecfg_fini_handle(tmphandle);
1507
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1255
		if (attach && err == Z_NO_ZONE)
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1256
			(void) fprintf(stderr, gettext("invalid path to "
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1257
			    "detached zone\n"));
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1258
		else if (attach && err == Z_INVALID_DOCUMENT)
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1259
			(void) fprintf(stderr, gettext("Cannot attach to an "
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1260
			    "earlier release of the operating system\n"));
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1261
		else
394fe4a8084d PSARC 2006/030 Zone migration
gjelinek
parents: 1497
diff changeset
  1262
			zone_perror(zone_template, err, TRUE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
	}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1265
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1266
	need_to_commit = TRUE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
	zonecfg_fini_handle(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
	handle = tmphandle;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1269
	got_handle = TRUE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
 * This malloc()'s memory, which must be freed by the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
quoteit(char *instr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
	char *outstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
	size_t outstrsize = strlen(instr) + 3;	/* 2 quotes + '\0' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
	if ((outstr = malloc(outstrsize)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
		zone_perror(zone, Z_NOMEM, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
	if (strchr(instr, ' ') == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
		(void) strlcpy(outstr, instr, outstrsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
		return (outstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
	(void) snprintf(outstr, outstrsize, "\"%s\"", instr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
	return (outstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
export_prop(FILE *of, int prop_num, char *prop_id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
	char *quote_str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
	if (strlen(prop_id) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
	quote_str = quoteit(prop_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
	(void) fprintf(of, "%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
	    pt_to_str(prop_num), quote_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
	free(quote_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
export_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
	struct zone_nwiftab nwiftab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
	struct zone_fstab fstab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
	struct zone_devtab devtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
	struct zone_attrtab attrtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
	struct zone_rctltab rctltab;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1314
	struct zone_dstab dstab;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
	struct zone_rctlvaltab *valptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
	int err, arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
	char zonepath[MAXPATHLEN], outfile[MAXPATHLEN], pool[MAXNAMELEN];
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1318
	char bootargs[BOOTARGS_MAX];
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1319
	char *limitpriv;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
	FILE *of;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
	boolean_t autoboot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	bool need_to_close = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
	outfile[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
	while ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?f:")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
			if (optopt == '?')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
				longer_usage(CMD_EXPORT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
				short_usage(CMD_EXPORT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
		case 'f':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
			(void) strlcpy(outfile, optarg, sizeof (outfile));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
			short_usage(CMD_EXPORT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
		short_usage(CMD_EXPORT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
	if (strlen(outfile) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
		of = stdout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
		if ((of = fopen(outfile, "w")) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
			zerr(gettext("opening file %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
			    outfile, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
		setbuf(of, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
		need_to_close = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
	if ((err = initialize(TRUE)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	(void) fprintf(of, "%s -b\n", cmd_to_str(CMD_CREATE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	if (zonecfg_get_zonepath(handle, zonepath, sizeof (zonepath)) == Z_OK &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	    strlen(zonepath) > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
		(void) fprintf(of, "%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
		    pt_to_str(PT_ZONEPATH), zonepath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	if (zonecfg_get_autoboot(handle, &autoboot) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
		(void) fprintf(of, "%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
		    pt_to_str(PT_AUTOBOOT), autoboot ? "true" : "false");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1374
	if (zonecfg_get_bootargs(handle, bootargs, sizeof (bootargs)) == Z_OK &&
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1375
	    strlen(bootargs) > 0) {
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1376
		(void) fprintf(of, "%s %s=%s\n", cmd_to_str(CMD_SET),
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1377
		    pt_to_str(PT_BOOTARGS), bootargs);
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1378
	}
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1379
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	if (zonecfg_get_pool(handle, pool, sizeof (pool)) == Z_OK &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
	    strlen(pool) > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
		(void) fprintf(of, "%s %s=%s\n", cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
		    pt_to_str(PT_POOL), pool);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1385
	if (zonecfg_get_limitpriv(handle, &limitpriv) == Z_OK &&
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1386
	    strlen(limitpriv) > 0) {
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1387
		(void) fprintf(of, "%s %s=%s\n", cmd_to_str(CMD_SET),
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1388
		    pt_to_str(PT_LIMITPRIV), limitpriv);
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1389
		free(limitpriv);
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1390
	}
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  1391
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  1392
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
	if ((err = zonecfg_setipdent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
		zone_perror(zone, err, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	while (zonecfg_getipdent(handle, &fstab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
		(void) fprintf(of, "%s %s\n", cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
		    rt_to_str(RT_IPD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
		export_prop(of, PT_DIR, fstab.zone_fs_dir);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
		(void) fprintf(of, "%s\n", cmd_to_str(CMD_END));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
	(void) zonecfg_endipdent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	if ((err = zonecfg_setfsent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
		zone_perror(zone, err, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	while (zonecfg_getfsent(handle, &fstab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
		zone_fsopt_t *optptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
		(void) fprintf(of, "%s %s\n", cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
		    rt_to_str(RT_FS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
		export_prop(of, PT_DIR, fstab.zone_fs_dir);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
		export_prop(of, PT_SPECIAL, fstab.zone_fs_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
		export_prop(of, PT_RAW, fstab.zone_fs_raw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
		export_prop(of, PT_TYPE, fstab.zone_fs_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
		for (optptr = fstab.zone_fs_options; optptr != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
		    optptr = optptr->zone_fsopt_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
			 * Simple property values with embedded equal signs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
			 * need to be quoted to prevent the lexer from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
			 * mis-parsing them as complex name=value pairs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
			if (strchr(optptr->zone_fsopt_opt, '='))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
				(void) fprintf(of, "%s %s \"%s\"\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
				    cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
				    pt_to_str(PT_OPTIONS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
				    optptr->zone_fsopt_opt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
				(void) fprintf(of, "%s %s %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
				    cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
				    pt_to_str(PT_OPTIONS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
				    optptr->zone_fsopt_opt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
		(void) fprintf(of, "%s\n", cmd_to_str(CMD_END));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
		zonecfg_free_fs_option_list(fstab.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
	(void) zonecfg_endfsent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
	if ((err = zonecfg_setnwifent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
		zone_perror(zone, err, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
	while (zonecfg_getnwifent(handle, &nwiftab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
		(void) fprintf(of, "%s %s\n", cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
		    rt_to_str(RT_NET));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
		export_prop(of, PT_ADDRESS, nwiftab.zone_nwif_address);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
		export_prop(of, PT_PHYSICAL, nwiftab.zone_nwif_physical);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
		(void) fprintf(of, "%s\n", cmd_to_str(CMD_END));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
	(void) zonecfg_endnwifent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
	if ((err = zonecfg_setdevent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
		zone_perror(zone, err, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
	while (zonecfg_getdevent(handle, &devtab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
		(void) fprintf(of, "%s %s\n", cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
		    rt_to_str(RT_DEVICE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
		export_prop(of, PT_MATCH, devtab.zone_dev_match);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
		(void) fprintf(of, "%s\n", cmd_to_str(CMD_END));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	(void) zonecfg_enddevent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
	if ((err = zonecfg_setrctlent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
		zone_perror(zone, err, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	while (zonecfg_getrctlent(handle, &rctltab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
		(void) fprintf(of, "%s rctl\n", cmd_to_str(CMD_ADD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
		export_prop(of, PT_NAME, rctltab.zone_rctl_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
		for (valptr = rctltab.zone_rctl_valptr; valptr != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
		    valptr = valptr->zone_rctlval_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
			fprintf(of, "%s %s (%s=%s,%s=%s,%s=%s)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
			    cmd_to_str(CMD_ADD), pt_to_str(PT_VALUE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
			    pt_to_str(PT_PRIV), valptr->zone_rctlval_priv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
			    pt_to_str(PT_LIMIT), valptr->zone_rctlval_limit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
			    pt_to_str(PT_ACTION), valptr->zone_rctlval_action);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
		(void) fprintf(of, "%s\n", cmd_to_str(CMD_END));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
		zonecfg_free_rctl_value_list(rctltab.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
	(void) zonecfg_endrctlent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	if ((err = zonecfg_setattrent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
		zone_perror(zone, err, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	while (zonecfg_getattrent(handle, &attrtab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
		(void) fprintf(of, "%s %s\n", cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
		    rt_to_str(RT_ATTR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
		export_prop(of, PT_NAME, attrtab.zone_attr_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
		export_prop(of, PT_TYPE, attrtab.zone_attr_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
		export_prop(of, PT_VALUE, attrtab.zone_attr_value);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
		(void) fprintf(of, "%s\n", cmd_to_str(CMD_END));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	(void) zonecfg_endattrent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1500
	if ((err = zonecfg_setdsent(handle)) != Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1501
		zone_perror(zone, err, FALSE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1502
		goto done;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1503
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1504
	while (zonecfg_getdsent(handle, &dstab) == Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1505
		(void) fprintf(of, "%s %s\n", cmd_to_str(CMD_ADD),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1506
		    rt_to_str(RT_DATASET));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1507
		export_prop(of, PT_NAME, dstab.zone_dataset_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1508
		(void) fprintf(of, "%s\n", cmd_to_str(CMD_END));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1509
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1510
	(void) zonecfg_enddsent(handle);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1511
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
	if (need_to_close)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
		(void) fclose(of);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
exit_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	int arg, answer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	while ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?F")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
			longer_usage(CMD_EXIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
		case 'F':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
			force_exit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
			short_usage(CMD_EXIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
	if (optind < cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
		short_usage(CMD_EXIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
	if (global_scope || force_exit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
		time_to_exit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
	answer = ask_yesno(FALSE, "Resource incomplete; really quit");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
	if (answer == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
		zerr(gettext("Resource incomplete, input "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
		    "not from terminal and -F not specified:\n%s command "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		    "ignored, but exiting anyway."), cmd_to_str(CMD_EXIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
	} else if (answer == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		time_to_exit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
	/* (answer == 0) => just return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
validate_zonepath_syntax(char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
	if (path[0] != '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
		zerr(gettext("%s is not an absolute path."), path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
	if (strcmp(path, "/") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
		zerr(gettext("/ is not allowed as a %s."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
		    pt_to_str(PT_ZONEPATH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
	return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
add_resource(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
	int type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
	if ((type = cmd->cmd_res_type) == RT_UNKNOWN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
		long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
		goto bad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
	switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
		bzero(&in_progress_fstab, sizeof (in_progress_fstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
	case RT_IPD:
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1588
		if (state_atleast(ZONE_STATE_INSTALLED)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
			zerr(gettext("Zone %s already installed; %s %s not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
			    "allowed."), zone, cmd_to_str(CMD_ADD),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
			    rt_to_str(RT_IPD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
			goto bad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
		bzero(&in_progress_ipdtab, sizeof (in_progress_ipdtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
	case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
		bzero(&in_progress_nwiftab, sizeof (in_progress_nwiftab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
	case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
		bzero(&in_progress_devtab, sizeof (in_progress_devtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
		bzero(&in_progress_rctltab, sizeof (in_progress_rctltab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
	case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
		bzero(&in_progress_attrtab, sizeof (in_progress_attrtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1608
	case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1609
		bzero(&in_progress_dstab, sizeof (in_progress_dstab));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  1610
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
		zone_perror(rt_to_str(type), Z_NO_RESOURCE_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
		long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
		usage(FALSE, HELP_RESOURCES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
bad:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
	global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
	end_op = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
do_complex_rctl_val(complex_property_ptr_t cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
	struct zone_rctlvaltab *rctlvaltab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
	complex_property_ptr_t cx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
	bool seen_priv = FALSE, seen_limit = FALSE, seen_action = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	rctlblk_t *rctlblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
	if ((rctlvaltab = alloc_rctlvaltab()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
		zone_perror(zone, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
	for (cx = cp; cx != NULL; cx = cx->cp_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
		switch (cx->cp_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
		case PT_PRIV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
			if (seen_priv) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
				zerr(gettext("%s already specified"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
				    pt_to_str(PT_PRIV));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
				goto bad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
			(void) strlcpy(rctlvaltab->zone_rctlval_priv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
			    cx->cp_value,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
			    sizeof (rctlvaltab->zone_rctlval_priv));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
			seen_priv = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
		case PT_LIMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
			if (seen_limit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
				zerr(gettext("%s already specified"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
				    pt_to_str(PT_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
				goto bad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
			(void) strlcpy(rctlvaltab->zone_rctlval_limit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
			    cx->cp_value,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
			    sizeof (rctlvaltab->zone_rctlval_limit));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
			seen_limit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
		case PT_ACTION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
			if (seen_action) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
				zerr(gettext("%s already specified"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
				    pt_to_str(PT_ACTION));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
				goto bad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
			(void) strlcpy(rctlvaltab->zone_rctlval_action,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
			    cx->cp_value,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
			    sizeof (rctlvaltab->zone_rctlval_action));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
			seen_action = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
			zone_perror(pt_to_str(PT_VALUE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
			    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
			long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
			zonecfg_free_rctl_value_list(rctlvaltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
	if (!seen_priv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
		zerr(gettext("%s not specified"), pt_to_str(PT_PRIV));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
	if (!seen_limit)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
		zerr(gettext("%s not specified"), pt_to_str(PT_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
	if (!seen_action)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
		zerr(gettext("%s not specified"), pt_to_str(PT_ACTION));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
	if (!seen_priv || !seen_limit || !seen_action)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
		goto bad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
	rctlvaltab->zone_rctlval_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
	rctlblk = alloca(rctlblk_size());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
	 * Make sure the rctl value looks roughly correct; we won't know if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
	 * it's truly OK until we verify the configuration on the target
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
	 * system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
	if (zonecfg_construct_rctlblk(rctlvaltab, rctlblk) != Z_OK ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
	    !zonecfg_valid_rctlblk(rctlblk)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
		zerr(gettext("Invalid %s %s specification"), rt_to_str(RT_RCTL),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
		    pt_to_str(PT_VALUE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
		goto bad;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
	err = zonecfg_add_rctl_value(&in_progress_rctltab, rctlvaltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
	if (err != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
		zone_perror(pt_to_str(PT_VALUE), err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
	return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
bad:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
	zonecfg_free_rctl_value_list(rctlvaltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
add_property(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
	char *prop_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
	int err, res_type, prop_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
	list_property_ptr_t l;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
	res_type = resource_scope;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
	prop_type = cmd->cmd_prop_name[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
	if (res_type == RT_UNKNOWN || prop_type == PT_UNKNOWN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
		long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
	if (cmd->cmd_prop_nv_pairs != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
		long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
	switch (res_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
		if (prop_type != PT_OPTIONS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
			long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
		pp = cmd->cmd_property_ptr[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
		if (pp->pv_type != PROP_VAL_SIMPLE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
		    pp->pv_type != PROP_VAL_LIST) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
			zerr(gettext("A %s or %s value was expected here."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
			    pvt_to_str(PROP_VAL_SIMPLE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
			    pvt_to_str(PROP_VAL_LIST));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
		if (pp->pv_type == PROP_VAL_SIMPLE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
			if (pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
				long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
			prop_id = pp->pv_simple;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
			err = zonecfg_add_fs_option(&in_progress_fstab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
			    prop_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
			if (err != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
				zone_perror(pt_to_str(prop_type), err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
			list_property_ptr_t list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
			for (list = pp->pv_list; list != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
			    list = list->lp_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
				prop_id = list->lp_simple;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
				if (prop_id == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
				err = zonecfg_add_fs_option(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
				    &in_progress_fstab, prop_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
				if (err != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
					zone_perror(pt_to_str(prop_type), err,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
					    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
		if (prop_type != PT_VALUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
			long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
		pp = cmd->cmd_property_ptr[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
		if (pp->pv_type != PROP_VAL_COMPLEX &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
		    pp->pv_type != PROP_VAL_LIST) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
			zerr(gettext("A %s or %s value was expected here."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
			    pvt_to_str(PROP_VAL_COMPLEX),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
			    pvt_to_str(PROP_VAL_LIST));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
		if (pp->pv_type == PROP_VAL_COMPLEX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
			do_complex_rctl_val(pp->pv_complex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
		for (l = pp->pv_list; l != NULL; l = l->lp_next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
			do_complex_rctl_val(l->lp_complex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
		zone_perror(rt_to_str(res_type), Z_NO_RESOURCE_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
		long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
		usage(FALSE, HELP_RESOURCES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
add_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
	int arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
	if ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
			longer_usage(CMD_ADD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
			short_usage(CMD_ADD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
		short_usage(CMD_ADD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
	if (zone_is_read_only(CMD_ADD))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
	if (global_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
		global_scope = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
		resource_scope = cmd->cmd_res_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
		end_op = CMD_ADD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
		add_resource(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
		add_property(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1844
/*
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1845
 * This routine has an unusual implementation, because it tries very
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1846
 * hard to succeed in the face of a variety of failure modes.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1847
 * The most common and most vexing occurs when the index file and
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1848
 * the /etc/zones/<zonename.xml> file are not both present.  In
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1849
 * this case, delete must eradicate as much of the zone state as is left
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1850
 * so that the user can later create a new zone with the same name.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1851
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
delete_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
	int err, arg, answer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
	char line[ZONENAME_MAX + 128];	/* enough to ask a question */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
	bool force = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
	while ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?F")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
			longer_usage(CMD_DELETE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
		case 'F':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
			force = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
			short_usage(CMD_DELETE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
		short_usage(CMD_DELETE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
	if (zone_is_read_only(CMD_DELETE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
	if (!force) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1882
		/*
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1883
		 * Initialize sets up the global called "handle" and warns the
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1884
		 * user if the zone is not configured.  In force mode, we don't
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1885
		 * trust that evaluation, and hence skip it.  (We don't need the
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1886
		 * handle to be loaded anyway, since zonecfg_destroy is done by
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1887
		 * zonename).  However, we also have to take care to emulate the
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1888
		 * messages spit out by initialize; see below.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1889
		 */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1890
		if (initialize(TRUE) != Z_OK)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1891
			return;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1892
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
		(void) snprintf(line, sizeof (line),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
		    gettext("Are you sure you want to delete zone %s"), zone);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
		if ((answer = ask_yesno(FALSE, line)) == -1) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1896
			zerr(gettext("Input not from terminal and -F not "
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1897
			    "specified:\n%s command ignored, exiting."),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1898
			    cmd_to_str(CMD_DELETE));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
			exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
		if (answer != 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1905
	if ((err = zonecfg_destroy(zone, force)) != Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1906
		if ((err == Z_BAD_ZONE_STATE) && !force) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1907
			zerr(gettext("Zone %s not in %s state; %s not "
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1908
			    "allowed.  Use -F to force %s."),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1909
			    zone, zone_state_str(ZONE_STATE_CONFIGURED),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1910
			    cmd_to_str(CMD_DELETE), cmd_to_str(CMD_DELETE));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1911
		} else {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1912
			zone_perror(zone, err, TRUE);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1913
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
	need_to_commit = FALSE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1916
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1917
	/*
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1918
	 * Emulate initialize's messaging; if there wasn't a valid handle to
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1919
	 * begin with, then user had typed delete (or delete -F) multiple
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1920
	 * times.  So we emit a message.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1921
	 *
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1922
	 * We only do this in the 'force' case because normally, initialize()
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1923
	 * takes care of this for us.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1924
	 */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1925
	if (force && zonecfg_check_handle(handle) != Z_OK && interactive_mode)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1926
		(void) printf(gettext("Use '%s' to begin "
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1927
		    "configuring a new zone.\n"), cmd_to_str(CMD_CREATE));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
	 * Time for a new handle: finish the old one off first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
	 * then get a new one properly to avoid leaks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
	 */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1933
	if (got_handle) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1934
		zonecfg_fini_handle(handle);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1935
		if ((handle = zonecfg_init_handle()) == NULL) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1936
			zone_perror(execname, Z_NOMEM, TRUE);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1937
			exit(Z_ERR);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1938
		}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1939
		if ((err = zonecfg_get_handle(zone, handle)) != Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1940
			/* If there was no zone before, that's OK */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1941
			if (err != Z_NO_ZONE)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1942
				zone_perror(zone, err, TRUE);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1943
			got_handle = FALSE;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  1944
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
fill_in_fstab(cmd_t *cmd, struct zone_fstab *fstab, bool fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
	int err, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
	if ((err = initialize(TRUE)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
		return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
1086
3203d67bd775 6310003 cannot remove multiple fs resources in one zonecfg instance
vp157776
parents: 789
diff changeset
  1957
	bzero(fstab, sizeof (*fstab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
	for (i = 0; i < cmd->cmd_prop_nv_pairs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
		pp = cmd->cmd_property_ptr[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
		if (pp->pv_type != PROP_VAL_SIMPLE || pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
			zerr(gettext("A simple value was expected here."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
		switch (cmd->cmd_prop_name[i]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
		case PT_DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
			(void) strlcpy(fstab->zone_fs_dir, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
			    sizeof (fstab->zone_fs_dir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
		case PT_SPECIAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
			(void) strlcpy(fstab->zone_fs_special, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
			    sizeof (fstab->zone_fs_special));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
		case PT_RAW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
			(void) strlcpy(fstab->zone_fs_raw, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
			    sizeof (fstab->zone_fs_raw));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
		case PT_TYPE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
			(void) strlcpy(fstab->zone_fs_type, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
			    sizeof (fstab->zone_fs_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
			zone_perror(pt_to_str(cmd->cmd_prop_name[i]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
			    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
	if (fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
	return (zonecfg_lookup_filesystem(handle, fstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
fill_in_ipdtab(cmd_t *cmd, struct zone_fstab *ipdtab, bool fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
	int err, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
	if ((err = initialize(TRUE)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
		return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
1086
3203d67bd775 6310003 cannot remove multiple fs resources in one zonecfg instance
vp157776
parents: 789
diff changeset
  2002
	bzero(ipdtab, sizeof (*ipdtab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
	for (i = 0; i < cmd->cmd_prop_nv_pairs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
		pp = cmd->cmd_property_ptr[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
		if (pp->pv_type != PROP_VAL_SIMPLE || pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
			zerr(gettext("A simple value was expected here."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
		switch (cmd->cmd_prop_name[i]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
		case PT_DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
			(void) strlcpy(ipdtab->zone_fs_dir, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
			    sizeof (ipdtab->zone_fs_dir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
			zone_perror(pt_to_str(cmd->cmd_prop_name[i]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
			    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
	if (fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
	return (zonecfg_lookup_ipd(handle, ipdtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
fill_in_nwiftab(cmd_t *cmd, struct zone_nwiftab *nwiftab, bool fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
	int err, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
	if ((err = initialize(TRUE)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
		return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
1086
3203d67bd775 6310003 cannot remove multiple fs resources in one zonecfg instance
vp157776
parents: 789
diff changeset
  2035
	bzero(nwiftab, sizeof (*nwiftab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
	for (i = 0; i < cmd->cmd_prop_nv_pairs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
		pp = cmd->cmd_property_ptr[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
		if (pp->pv_type != PROP_VAL_SIMPLE || pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
			zerr(gettext("A simple value was expected here."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
		switch (cmd->cmd_prop_name[i]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
		case PT_ADDRESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
			(void) strlcpy(nwiftab->zone_nwif_address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
			    pp->pv_simple, sizeof (nwiftab->zone_nwif_address));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
		case PT_PHYSICAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
			(void) strlcpy(nwiftab->zone_nwif_physical,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
			    pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
			    sizeof (nwiftab->zone_nwif_physical));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
			zone_perror(pt_to_str(cmd->cmd_prop_name[i]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
			    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
	if (fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
	err = zonecfg_lookup_nwif(handle, nwiftab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
fill_in_devtab(cmd_t *cmd, struct zone_devtab *devtab, bool fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
	int err, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
	if ((err = initialize(TRUE)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
		return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
1086
3203d67bd775 6310003 cannot remove multiple fs resources in one zonecfg instance
vp157776
parents: 789
diff changeset
  2074
	bzero(devtab, sizeof (*devtab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
	for (i = 0; i < cmd->cmd_prop_nv_pairs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
		pp = cmd->cmd_property_ptr[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
		if (pp->pv_type != PROP_VAL_SIMPLE || pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
			zerr(gettext("A simple value was expected here."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
		switch (cmd->cmd_prop_name[i]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
		case PT_MATCH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
			(void) strlcpy(devtab->zone_dev_match, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
			    sizeof (devtab->zone_dev_match));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
			zone_perror(pt_to_str(cmd->cmd_prop_name[i]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
			    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
	if (fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
	err = zonecfg_lookup_dev(handle, devtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
fill_in_rctltab(cmd_t *cmd, struct zone_rctltab *rctltab, bool fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
	int err, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
	if ((err = initialize(TRUE)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
		return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
1086
3203d67bd775 6310003 cannot remove multiple fs resources in one zonecfg instance
vp157776
parents: 789
diff changeset
  2108
	bzero(rctltab, sizeof (*rctltab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
	for (i = 0; i < cmd->cmd_prop_nv_pairs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
		pp = cmd->cmd_property_ptr[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
		if (pp->pv_type != PROP_VAL_SIMPLE || pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
			zerr(gettext("A simple value was expected here."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
		switch (cmd->cmd_prop_name[i]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
		case PT_NAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
			(void) strlcpy(rctltab->zone_rctl_name, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
			    sizeof (rctltab->zone_rctl_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
			zone_perror(pt_to_str(cmd->cmd_prop_name[i]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
			    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
	if (fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
	err = zonecfg_lookup_rctl(handle, rctltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
fill_in_attrtab(cmd_t *cmd, struct zone_attrtab *attrtab, bool fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
	int err, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
	if ((err = initialize(TRUE)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
		return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
1086
3203d67bd775 6310003 cannot remove multiple fs resources in one zonecfg instance
vp157776
parents: 789
diff changeset
  2142
	bzero(attrtab, sizeof (*attrtab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
	for (i = 0; i < cmd->cmd_prop_nv_pairs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
		pp = cmd->cmd_property_ptr[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
		if (pp->pv_type != PROP_VAL_SIMPLE || pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
			zerr(gettext("A simple value was expected here."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
		switch (cmd->cmd_prop_name[i]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
		case PT_NAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
			(void) strlcpy(attrtab->zone_attr_name, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
			    sizeof (attrtab->zone_attr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
		case PT_TYPE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
			(void) strlcpy(attrtab->zone_attr_type, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
			    sizeof (attrtab->zone_attr_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
		case PT_VALUE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
			(void) strlcpy(attrtab->zone_attr_value, pp->pv_simple,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
			    sizeof (attrtab->zone_attr_value));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
			zone_perror(pt_to_str(cmd->cmd_prop_name[i]),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
			    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
			return (Z_INSUFFICIENT_SPEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
	if (fill_in_only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
	err = zonecfg_lookup_attr(handle, attrtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2175
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2176
fill_in_dstab(cmd_t *cmd, struct zone_dstab *dstab, bool fill_in_only)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2177
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2178
	int err, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2179
	property_value_ptr_t pp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2180
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2181
	if ((err = initialize(TRUE)) != Z_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2182
		return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2183
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2184
	dstab->zone_dataset_name[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2185
	for (i = 0; i < cmd->cmd_prop_nv_pairs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2186
		pp = cmd->cmd_property_ptr[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2187
		if (pp->pv_type != PROP_VAL_SIMPLE || pp->pv_simple == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2188
			zerr(gettext("A simple value was expected here."));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2189
			saw_error = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2190
			return (Z_INSUFFICIENT_SPEC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2191
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2192
		switch (cmd->cmd_prop_name[i]) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2193
		case PT_NAME:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2194
			(void) strlcpy(dstab->zone_dataset_name, pp->pv_simple,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2195
			    sizeof (dstab->zone_dataset_name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2196
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2197
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2198
			zone_perror(pt_to_str(cmd->cmd_prop_name[i]),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2199
			    Z_NO_PROPERTY_TYPE, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2200
			return (Z_INSUFFICIENT_SPEC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2201
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2202
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2203
	if (fill_in_only)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2204
		return (Z_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2205
	return (zonecfg_lookup_ds(handle, dstab));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2206
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2207
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
remove_resource(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
	int err, type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
	struct zone_fstab fstab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
	struct zone_nwiftab nwiftab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
	struct zone_devtab devtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
	struct zone_attrtab attrtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
	struct zone_rctltab rctltab;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2217
	struct zone_dstab dstab;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
	if ((type = cmd->cmd_res_type) == RT_UNKNOWN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
		long_usage(CMD_REMOVE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
	switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
		if ((err = fill_in_fstab(cmd, &fstab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
			z_cmd_rt_perror(CMD_REMOVE, RT_FS, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
		if ((err = zonecfg_delete_filesystem(handle, &fstab)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
			z_cmd_rt_perror(CMD_REMOVE, RT_FS, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
		zonecfg_free_fs_option_list(fstab.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
	case RT_IPD:
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2240
		if (state_atleast(ZONE_STATE_INSTALLED)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
			zerr(gettext("Zone %s already installed; %s %s not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
			    "allowed."), zone, cmd_to_str(CMD_REMOVE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
			    rt_to_str(RT_IPD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
		if ((err = fill_in_ipdtab(cmd, &fstab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
			z_cmd_rt_perror(CMD_REMOVE, RT_IPD, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
		if ((err = zonecfg_delete_ipd(handle, &fstab)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
			z_cmd_rt_perror(CMD_REMOVE, RT_IPD, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
	case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
		if ((err = fill_in_nwiftab(cmd, &nwiftab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
			z_cmd_rt_perror(CMD_REMOVE, RT_NET, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
		if ((err = zonecfg_delete_nwif(handle, &nwiftab)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
			z_cmd_rt_perror(CMD_REMOVE, RT_NET, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
	case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
		if ((err = fill_in_devtab(cmd, &devtab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
			z_cmd_rt_perror(CMD_REMOVE, RT_DEVICE, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
		if ((err = zonecfg_delete_dev(handle, &devtab)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
			z_cmd_rt_perror(CMD_REMOVE, RT_DEVICE, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
		if ((err = fill_in_rctltab(cmd, &rctltab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
			z_cmd_rt_perror(CMD_REMOVE, RT_RCTL, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
		if ((err = zonecfg_delete_rctl(handle, &rctltab)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
			z_cmd_rt_perror(CMD_REMOVE, RT_RCTL, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
		zonecfg_free_rctl_value_list(rctltab.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
	case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
		if ((err = fill_in_attrtab(cmd, &attrtab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
			z_cmd_rt_perror(CMD_REMOVE, RT_ATTR, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
		if ((err = zonecfg_delete_attr(handle, &attrtab)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
			z_cmd_rt_perror(CMD_REMOVE, RT_ATTR, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2296
	case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2297
		if ((err = fill_in_dstab(cmd, &dstab, FALSE)) != Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2298
			z_cmd_rt_perror(CMD_REMOVE, RT_DATASET, err, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2299
			return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2300
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2301
		if ((err = zonecfg_delete_ds(handle, &dstab)) != Z_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2302
			z_cmd_rt_perror(CMD_REMOVE, RT_DATASET, err, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2303
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2304
			need_to_commit = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2305
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
		zone_perror(rt_to_str(type), Z_NO_RESOURCE_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
		long_usage(CMD_REMOVE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
		usage(FALSE, HELP_RESOURCES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
remove_property(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
	char *prop_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
	int err, res_type, prop_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
	struct zone_rctlvaltab *rctlvaltab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
	complex_property_ptr_t cx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
	res_type = resource_scope;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
	prop_type = cmd->cmd_prop_name[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
	if (res_type == RT_UNKNOWN || prop_type == PT_UNKNOWN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
		long_usage(CMD_REMOVE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
	if (cmd->cmd_prop_nv_pairs != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
		long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
	switch (res_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
		if (prop_type != PT_OPTIONS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
			long_usage(CMD_REMOVE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
		pp = cmd->cmd_property_ptr[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
		if (pp->pv_type == PROP_VAL_COMPLEX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
			zerr(gettext("A %s or %s value was expected here."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
			    pvt_to_str(PROP_VAL_SIMPLE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
			    pvt_to_str(PROP_VAL_LIST));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
		if (pp->pv_type == PROP_VAL_SIMPLE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
			if (pp->pv_simple == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
				long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
			prop_id = pp->pv_simple;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
			err = zonecfg_remove_fs_option(&in_progress_fstab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
			    prop_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
			if (err != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
				zone_perror(pt_to_str(prop_type), err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
			list_property_ptr_t list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
			for (list = pp->pv_list; list != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
			    list = list->lp_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
				prop_id = list->lp_simple;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
				if (prop_id == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
				err = zonecfg_remove_fs_option(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
				    &in_progress_fstab, prop_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
				if (err != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
					zone_perror(pt_to_str(prop_type), err,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
					    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
		if (prop_type != PT_VALUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
			long_usage(CMD_REMOVE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
		pp = cmd->cmd_property_ptr[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
		if (pp->pv_type != PROP_VAL_COMPLEX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
			zerr(gettext("A %s value was expected here."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
			    pvt_to_str(PROP_VAL_COMPLEX));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
		if ((rctlvaltab = alloc_rctlvaltab()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
			zone_perror(zone, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
			exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
		for (cx = pp->pv_complex; cx != NULL; cx = cx->cp_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
			switch (cx->cp_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
			case PT_PRIV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
				(void) strlcpy(rctlvaltab->zone_rctlval_priv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
				    cx->cp_value,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
				    sizeof (rctlvaltab->zone_rctlval_priv));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
			case PT_LIMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
				(void) strlcpy(rctlvaltab->zone_rctlval_limit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
				    cx->cp_value,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
				    sizeof (rctlvaltab->zone_rctlval_limit));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
			case PT_ACTION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
				(void) strlcpy(rctlvaltab->zone_rctlval_action,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
				    cx->cp_value,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
				    sizeof (rctlvaltab->zone_rctlval_action));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
				zone_perror(pt_to_str(prop_type),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
				    Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
				long_usage(CMD_ADD, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
				usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
				zonecfg_free_rctl_value_list(rctlvaltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
		rctlvaltab->zone_rctlval_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
		err = zonecfg_remove_rctl_value(&in_progress_rctltab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
		    rctlvaltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
		if (err != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
			zone_perror(pt_to_str(prop_type), err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
		zonecfg_free_rctl_value_list(rctlvaltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
		zone_perror(rt_to_str(res_type), Z_NO_RESOURCE_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
		long_usage(CMD_REMOVE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
		usage(FALSE, HELP_RESOURCES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
remove_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
	if (zone_is_read_only(CMD_REMOVE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
	if (global_scope)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
		remove_resource(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
		remove_property(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
select_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
	int type, err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
	if (zone_is_read_only(CMD_SELECT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
	if (global_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
		global_scope = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
		resource_scope = cmd->cmd_res_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
		end_op = CMD_SELECT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
		scope_usage(CMD_SELECT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
	if ((type = cmd->cmd_res_type) == RT_UNKNOWN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
		long_usage(CMD_SELECT, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
	switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
		if ((err = fill_in_fstab(cmd, &old_fstab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
			z_cmd_rt_perror(CMD_SELECT, RT_FS, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
			global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
		bcopy(&old_fstab, &in_progress_fstab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
		    sizeof (struct zone_fstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	case RT_IPD:
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2492
		if (state_atleast(ZONE_STATE_INCOMPLETE)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
			zerr(gettext("Zone %s not in %s state; %s %s not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
			    "allowed."), zone,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
			    zone_state_str(ZONE_STATE_CONFIGURED),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
			    cmd_to_str(CMD_SELECT), rt_to_str(RT_IPD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
			global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
			end_op = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
		if ((err = fill_in_ipdtab(cmd, &old_ipdtab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
			z_cmd_rt_perror(CMD_SELECT, RT_IPD, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
			global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
		bcopy(&old_ipdtab, &in_progress_ipdtab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
		    sizeof (struct zone_fstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
	case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
		if ((err = fill_in_nwiftab(cmd, &old_nwiftab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
			z_cmd_rt_perror(CMD_SELECT, RT_NET, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
			global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
		bcopy(&old_nwiftab, &in_progress_nwiftab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
		    sizeof (struct zone_nwiftab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
	case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
		if ((err = fill_in_devtab(cmd, &old_devtab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
			z_cmd_rt_perror(CMD_SELECT, RT_DEVICE, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
			global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
		bcopy(&old_devtab, &in_progress_devtab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
		    sizeof (struct zone_devtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
		if ((err = fill_in_rctltab(cmd, &old_rctltab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
			z_cmd_rt_perror(CMD_SELECT, RT_RCTL, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
			global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
		bcopy(&old_rctltab, &in_progress_rctltab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
		    sizeof (struct zone_rctltab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
	case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
		if ((err = fill_in_attrtab(cmd, &old_attrtab, FALSE)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
			z_cmd_rt_perror(CMD_SELECT, RT_ATTR, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
			global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
		bcopy(&old_attrtab, &in_progress_attrtab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
		    sizeof (struct zone_attrtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2540
	case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2541
		if ((err = fill_in_dstab(cmd, &old_dstab, FALSE)) != Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2542
			z_cmd_rt_perror(CMD_SELECT, RT_DATASET, err, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2543
			global_scope = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2544
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2545
		bcopy(&old_dstab, &in_progress_dstab,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2546
		    sizeof (struct zone_dstab));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2547
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
		zone_perror(rt_to_str(type), Z_NO_RESOURCE_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
		long_usage(CMD_SELECT, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
		usage(FALSE, HELP_RESOURCES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
 * Network "addresses" can be one of the following forms:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
 *	<IPv4 address>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
 *	<IPv4 address>/<prefix length>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
 *	<IPv6 address>/<prefix length>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
 *	<host name>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
 *	<host name>/<prefix length>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
 * In other words, the "/" followed by a prefix length is allowed but not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
 * required for IPv4 addresses and host names, and required for IPv6 addresses.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
 * If a prefix length is given, it must be in the allowable range: 0 to 32 for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
 * IPv4 addresses and host names, 0 to 128 for IPv6 addresses.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
 * Host names must start with an alpha-numeric character, and all subsequent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
 * characters must be either alpha-numeric or "-".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
validate_net_address_syntax(char *address)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
	char *slashp, part1[MAXHOSTNAMELEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
	struct in6_addr in6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
	struct in_addr in4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
	int prefixlen, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
	 * Copy the part before any '/' into part1 or copy the whole
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
	 * thing if there is no '/'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
	if ((slashp = strchr(address, '/')) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
		*slashp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
		(void) strlcpy(part1, address, sizeof (part1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
		*slashp = '/';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
		prefixlen = atoi(++slashp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
		(void) strlcpy(part1, address, sizeof (part1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
	if (inet_pton(AF_INET6, part1, &in6) == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
		if (slashp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
			zerr(gettext("%s: IPv6 addresses "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
			    "require /prefix-length suffix."), address);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
			return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
		if (prefixlen < 0 || prefixlen > 128) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
			zerr(gettext("%s: IPv6 address "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
			    "prefix lengths must be 0 - 128."), address);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
			return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
	/* At this point, any /prefix must be for IPv4. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
	if (slashp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
		if (prefixlen < 0 || prefixlen > 32) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
			zerr(gettext("%s: IPv4 address "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
			    "prefix lengths must be 0 - 32."), address);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
			return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
	if (inet_pton(AF_INET, part1, &in4) == 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
	/* address may also be a host name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
	if (!isalnum(part1[0])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
		zerr(gettext("%s: bogus host name or network address syntax"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
		    part1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
		usage(FALSE, HELP_NETADDR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
	for (i = 1; part1[i]; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
		if (!isalnum(part1[i]) && part1[i] != '-' && part1[i] != '.') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
			zerr(gettext("%s: bogus host name or "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
			    "network address syntax"), part1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
			usage(FALSE, HELP_NETADDR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
			return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
	return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
validate_net_physical_syntax(char *ifname)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
	if (strchr(ifname, ':') == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
		return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
	zerr(gettext("%s: physical interface name required; "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
	    "logical interface name not allowed"), ifname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
	return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
valid_fs_type(const char *type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
	 * Is this a valid path component?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
	if (strlen(type) + 1 > MAXNAMELEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
		return (B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
	 * Make sure a bad value for "type" doesn't make
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
	 * /usr/lib/fs/<type>/mount turn into something else.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
	if (strchr(type, '/') != NULL || type[0] == '\0' ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
	    strcmp(type, ".") == 0 || strcmp(type, "..") == 0)
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2660
		return (B_FALSE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
	 * More detailed verification happens later by zoneadm(1m).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
	return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
set_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
	char *prop_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
	int err, res_type, prop_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
	property_value_ptr_t pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
	boolean_t autoboot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
	if (zone_is_read_only(CMD_SET))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
	prop_type = cmd->cmd_prop_name[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
	if (global_scope) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2682
		if (prop_type == PT_ZONENAME) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2683
			res_type = RT_ZONENAME;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2684
		} else if (prop_type == PT_ZONEPATH) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
			res_type = RT_ZONEPATH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
		} else if (prop_type == PT_AUTOBOOT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
			res_type = RT_AUTOBOOT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
		} else if (prop_type == PT_POOL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
			res_type = RT_POOL;
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2690
		} else if (prop_type == PT_LIMITPRIV) {
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2691
			res_type = RT_LIMITPRIV;
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2692
		} else if (prop_type == PT_BOOTARGS) {
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2693
			res_type = RT_BOOTARGS;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
			zerr(gettext("Cannot set a resource-specific property "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
			    "from the global scope."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
		res_type = resource_scope;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
	pp = cmd->cmd_property_ptr[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
	 * A nasty expression but not that complicated:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
	 * 1. fs options are simple or list (tested below)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
	 * 2. rctl value's are complex or list (tested below)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
	 * Anything else should be simple.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
	if (!(res_type == RT_FS && prop_type == PT_OPTIONS) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
	    !(res_type == RT_RCTL && prop_type == PT_VALUE) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
	    (pp->pv_type != PROP_VAL_SIMPLE ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
	    (prop_id = pp->pv_simple) == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
		zerr(gettext("A %s value was expected here."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
		    pvt_to_str(PROP_VAL_SIMPLE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
	if (prop_type == PT_UNKNOWN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
		long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2725
	/*
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2726
	 * Special case: the user can change the zone name prior to 'create';
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2727
	 * if the zone already exists, we fall through letting initialize()
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2728
	 * and the rest of the logic run.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2729
	 */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2730
	if (res_type == RT_ZONENAME && got_handle == FALSE &&
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2731
	    !state_atleast(ZONE_STATE_CONFIGURED)) {
1497
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
  2732
		if ((err = zonecfg_validate_zonename(prop_id)) != Z_OK) {
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
  2733
			zone_perror(prop_id, err, TRUE);
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
  2734
			usage(FALSE, HELP_SYNTAX);
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
  2735
			return;
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
  2736
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2737
		(void) strlcpy(zone, prop_id, sizeof (zone));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2738
		return;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2739
	}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2740
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
	switch (res_type) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2745
	case RT_ZONENAME:
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2746
		if ((err = zonecfg_set_name(handle, prop_id)) != Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2747
			/*
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2748
			 * Use prop_id instead of 'zone' here, since we're
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2749
			 * reporting a problem about the *new* zonename.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2750
			 */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2751
			zone_perror(prop_id, err, TRUE);
1497
3fc5ec77db50 6390074 zonecfg 'set zonename' has rough edges
dp
parents: 1086
diff changeset
  2752
			usage(FALSE, HELP_SYNTAX);
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2753
		} else {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2754
			need_to_commit = TRUE;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2755
			(void) strlcpy(zone, prop_id, sizeof (zone));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2756
		}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2757
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
	case RT_ZONEPATH:
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  2759
		if (state_atleast(ZONE_STATE_INSTALLED)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
			zerr(gettext("Zone %s already installed; %s %s not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
			    "allowed."), zone, cmd_to_str(CMD_SET),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
			    rt_to_str(RT_ZONEPATH));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
		if (validate_zonepath_syntax(prop_id) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
		if ((err = zonecfg_set_zonepath(handle, prop_id)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
			zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
	case RT_AUTOBOOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
		if (strcmp(prop_id, "true") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
			autoboot = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
		} else if (strcmp(prop_id, "false") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
			autoboot = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
			zerr(gettext("%s value must be '%s' or '%s'."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
			    pt_to_str(PT_AUTOBOOT), "true", "false");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
		if ((err = zonecfg_set_autoboot(handle, autoboot)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
			zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
	case RT_POOL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
		if ((err = zonecfg_set_pool(handle, prop_id)) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
			zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
			need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
		return;
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2796
	case RT_LIMITPRIV:
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2797
		if ((err = zonecfg_set_limitpriv(handle, prop_id)) != Z_OK)
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2798
			zone_perror(zone, err, TRUE);
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2799
		else
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2800
			need_to_commit = TRUE;
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  2801
		return;
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2802
	case RT_BOOTARGS:
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2803
		if ((err = zonecfg_set_bootargs(handle, prop_id)) != Z_OK)
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2804
			zone_perror(zone, err, TRUE);
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2805
		else
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2806
			need_to_commit = TRUE;
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  2807
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
		switch (prop_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
		case PT_DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
			(void) strlcpy(in_progress_fstab.zone_fs_dir, prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
			    sizeof (in_progress_fstab.zone_fs_dir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
		case PT_SPECIAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
			(void) strlcpy(in_progress_fstab.zone_fs_special,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
			    sizeof (in_progress_fstab.zone_fs_special));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
		case PT_RAW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
			(void) strlcpy(in_progress_fstab.zone_fs_raw,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
			    prop_id, sizeof (in_progress_fstab.zone_fs_raw));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
		case PT_TYPE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
			if (!valid_fs_type(prop_id)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
				zerr(gettext("\"%s\" is not a valid %s."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
				    prop_id, pt_to_str(PT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
			(void) strlcpy(in_progress_fstab.zone_fs_type, prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
			    sizeof (in_progress_fstab.zone_fs_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
		case PT_OPTIONS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
			if (pp->pv_type != PROP_VAL_SIMPLE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
			    pp->pv_type != PROP_VAL_LIST) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
				zerr(gettext("A %s or %s value was expected "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
				    "here."), pvt_to_str(PROP_VAL_SIMPLE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2838
				    pvt_to_str(PROP_VAL_LIST));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
			zonecfg_free_fs_option_list(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
			    in_progress_fstab.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
			in_progress_fstab.zone_fs_options = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
			if (!(pp->pv_type == PROP_VAL_LIST &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
			    pp->pv_list == NULL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
				add_property(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
		zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
		long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
		usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
	case RT_IPD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
		switch (prop_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
		case PT_DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
			(void) strlcpy(in_progress_ipdtab.zone_fs_dir, prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
			    sizeof (in_progress_ipdtab.zone_fs_dir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
		zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
		long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
		usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
	case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
		switch (prop_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
		case PT_ADDRESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
			if (validate_net_address_syntax(prop_id) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
			(void) strlcpy(in_progress_nwiftab.zone_nwif_address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
			    sizeof (in_progress_nwiftab.zone_nwif_address));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
		case PT_PHYSICAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
			if (validate_net_physical_syntax(prop_id) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
			(void) strlcpy(in_progress_nwiftab.zone_nwif_physical,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
			    sizeof (in_progress_nwiftab.zone_nwif_physical));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
			long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
	case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
		switch (prop_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
		case PT_MATCH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
			(void) strlcpy(in_progress_devtab.zone_dev_match,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
			    sizeof (in_progress_devtab.zone_dev_match));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
			long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
		switch (prop_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
		case PT_NAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
			if (!zonecfg_valid_rctlname(prop_id)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
				zerr(gettext("'%s' is not a valid zone %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
				    "name."), prop_id, rt_to_str(RT_RCTL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
			(void) strlcpy(in_progress_rctltab.zone_rctl_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
			    sizeof (in_progress_rctltab.zone_rctl_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
		case PT_VALUE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
			if (pp->pv_type != PROP_VAL_COMPLEX &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
			    pp->pv_type != PROP_VAL_LIST) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
				zerr(gettext("A %s or %s value was expected "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
				    "here."), pvt_to_str(PROP_VAL_COMPLEX),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
				    pvt_to_str(PROP_VAL_LIST));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
			zonecfg_free_rctl_value_list(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
			    in_progress_rctltab.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
			in_progress_rctltab.zone_rctl_valptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
			if (!(pp->pv_type == PROP_VAL_LIST &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
			    pp->pv_list == NULL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2938
				add_property(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2939
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2941
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
			long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
	case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2949
		switch (prop_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
		case PT_NAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
			(void) strlcpy(in_progress_attrtab.zone_attr_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
			    sizeof (in_progress_attrtab.zone_attr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
		case PT_TYPE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
			(void) strlcpy(in_progress_attrtab.zone_attr_type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2957
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2958
			    sizeof (in_progress_attrtab.zone_attr_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
		case PT_VALUE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2961
			(void) strlcpy(in_progress_attrtab.zone_attr_value,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2962
			    prop_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2963
			    sizeof (in_progress_attrtab.zone_attr_value));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
			zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
			    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
			long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
			usage(FALSE, HELP_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2973
	case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2974
		switch (prop_type) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2975
		case PT_NAME:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2976
			(void) strlcpy(in_progress_dstab.zone_dataset_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2977
			    prop_id,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2978
			    sizeof (in_progress_dstab.zone_dataset_name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2979
			return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2980
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2981
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2982
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2983
		zone_perror(pt_to_str(prop_type), Z_NO_PROPERTY_TYPE, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2984
		long_usage(CMD_SET, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2985
		usage(FALSE, HELP_PROPS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  2986
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
		zone_perror(rt_to_str(res_type), Z_NO_RESOURCE_TYPE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
		long_usage(CMD_SET, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2990
		usage(FALSE, HELP_RESOURCES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2991
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2992
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2993
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
output_prop(FILE *fp, int pnum, char *pval, bool print_notspec)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2997
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2998
	char *qstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3000
	if (*pval != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
		qstr = quoteit(pval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
		(void) fprintf(fp, "\t%s: %s\n", pt_to_str(pnum), qstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
		free(qstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
	} else if (print_notspec)
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3005
		(void) fprintf(fp, gettext("\t%s not specified\n"),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3006
		    pt_to_str(pnum));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3007
}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3008
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3009
static void
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3010
info_zonename(zone_dochandle_t handle, FILE *fp)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3011
{
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3012
	char zonename[ZONENAME_MAX];
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3013
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3014
	if (zonecfg_get_name(handle, zonename, sizeof (zonename)) == Z_OK)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3015
		(void) fprintf(fp, "%s: %s\n", pt_to_str(PT_ZONENAME),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3016
		    zonename);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3017
	else
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3018
		(void) fprintf(fp, gettext("%s not specified\n"),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3019
		    pt_to_str(PT_ZONENAME));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3021
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3022
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3023
info_zonepath(zone_dochandle_t handle, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3024
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
	char zonepath[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3026
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3027
	if (zonecfg_get_zonepath(handle, zonepath, sizeof (zonepath)) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3028
		(void) fprintf(fp, "%s: %s\n", pt_to_str(PT_ZONEPATH),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3029
		    zonepath);
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3030
	else {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3031
		(void) fprintf(fp, gettext("%s not specified\n"),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3032
		    pt_to_str(PT_ZONEPATH));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3033
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3037
info_autoboot(zone_dochandle_t handle, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3038
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3039
	boolean_t autoboot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3040
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3042
	if ((err = zonecfg_get_autoboot(handle, &autoboot)) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3043
		(void) fprintf(fp, "%s: %s\n", pt_to_str(PT_AUTOBOOT),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
		    autoboot ? "true" : "false");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
info_pool(zone_dochandle_t handle, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
	char pool[MAXNAMELEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
	if ((err = zonecfg_get_pool(handle, pool, sizeof (pool))) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3056
		(void) fprintf(fp, "%s: %s\n", pt_to_str(PT_POOL), pool);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3057
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3058
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3059
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
static void
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3062
info_limitpriv(zone_dochandle_t handle, FILE *fp)
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3063
{
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3064
	char *limitpriv;
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3065
	int err;
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3066
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3067
	if ((err = zonecfg_get_limitpriv(handle, &limitpriv)) == Z_OK) {
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3068
		(void) fprintf(fp, "%s: %s\n", pt_to_str(PT_LIMITPRIV),
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3069
		    limitpriv);
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3070
		free(limitpriv);
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3071
	} else {
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3072
		zone_perror(zone, err, TRUE);
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3073
	}
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3074
}
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3075
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3076
static void
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3077
info_bootargs(zone_dochandle_t handle, FILE *fp)
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3078
{
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3079
	char bootargs[BOOTARGS_MAX];
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3080
	int err;
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3081
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3082
	if ((err = zonecfg_get_bootargs(handle, bootargs,
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3083
	    sizeof (bootargs))) == Z_OK) {
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3084
		(void) fprintf(fp, "%s: %s\n", pt_to_str(PT_BOOTARGS),
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3085
		    bootargs);
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3086
	} else {
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3087
		zone_perror(zone, err, TRUE);
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3088
	}
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3089
}
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3090
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3091
static void
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3092
output_fs(FILE *fp, struct zone_fstab *fstab)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3093
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3094
	zone_fsopt_t *this;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3096
	(void) fprintf(fp, "%s:\n", rt_to_str(RT_FS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3097
	output_prop(fp, PT_DIR, fstab->zone_fs_dir, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3098
	output_prop(fp, PT_SPECIAL, fstab->zone_fs_special, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3099
	output_prop(fp, PT_RAW, fstab->zone_fs_raw, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3100
	output_prop(fp, PT_TYPE, fstab->zone_fs_type, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3101
	(void) fprintf(fp, "\t%s: [", pt_to_str(PT_OPTIONS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3102
	for (this = fstab->zone_fs_options; this != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3103
	    this = this->zone_fsopt_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3104
		if (strchr(this->zone_fsopt_opt, '='))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3105
			(void) fprintf(fp, "\"%s\"", this->zone_fsopt_opt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3106
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3107
			(void) fprintf(fp, "%s", this->zone_fsopt_opt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3108
		if (this->zone_fsopt_next != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3109
			(void) fprintf(fp, ",");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3110
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3111
	(void) fprintf(fp, "]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3112
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3114
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3115
output_ipd(FILE *fp, struct zone_fstab *ipdtab)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3116
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3117
	(void) fprintf(fp, "%s:\n", rt_to_str(RT_IPD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3118
	output_prop(fp, PT_DIR, ipdtab->zone_fs_dir, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3119
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3121
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3122
info_fs(zone_dochandle_t handle, FILE *fp, cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3123
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3124
	struct zone_fstab lookup, user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3125
	bool output = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3127
	if (zonecfg_setfsent(handle) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3128
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3129
	while (zonecfg_getfsent(handle, &lookup) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3130
		if (cmd->cmd_prop_nv_pairs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3131
			output_fs(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3132
			goto loopend;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3133
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3134
		if (fill_in_fstab(cmd, &user, TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3135
			goto loopend;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3136
		if (strlen(user.zone_fs_dir) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3137
		    strcmp(user.zone_fs_dir, lookup.zone_fs_dir) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3138
			goto loopend;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3139
		if (strlen(user.zone_fs_special) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3140
		    strcmp(user.zone_fs_special, lookup.zone_fs_special) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3141
			goto loopend;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3142
		if (strlen(user.zone_fs_type) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3143
		    strcmp(user.zone_fs_type, lookup.zone_fs_type) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3144
			goto loopend;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3145
		output_fs(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3146
		output = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3147
loopend:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3148
		zonecfg_free_fs_option_list(lookup.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3149
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3150
	(void) zonecfg_endfsent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3151
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3152
	 * If a property n/v pair was specified, warn the user if there was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3153
	 * nothing to output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3154
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3155
	if (!output && cmd->cmd_prop_nv_pairs > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3156
		(void) printf(gettext("No such %s resource.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3157
		    rt_to_str(RT_FS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3158
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3160
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3161
info_ipd(zone_dochandle_t handle, FILE *fp, cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3162
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3163
	struct zone_fstab lookup, user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3164
	bool output = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3166
	if (zonecfg_setipdent(handle) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3167
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3168
	while (zonecfg_getipdent(handle, &lookup) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3169
		if (cmd->cmd_prop_nv_pairs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3170
			output_ipd(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3171
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3172
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3173
		if (fill_in_ipdtab(cmd, &user, TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3174
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3175
		if (strlen(user.zone_fs_dir) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3176
		    strcmp(user.zone_fs_dir, lookup.zone_fs_dir) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3177
			continue;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3178
		output_ipd(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3179
		output = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3180
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3181
	(void) zonecfg_endipdent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3182
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3183
	 * If a property n/v pair was specified, warn the user if there was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3184
	 * nothing to output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3185
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3186
	if (!output && cmd->cmd_prop_nv_pairs > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3187
		(void) printf(gettext("No such %s resource.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3188
		    rt_to_str(RT_IPD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3189
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3191
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3192
output_net(FILE *fp, struct zone_nwiftab *nwiftab)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3193
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3194
	(void) fprintf(fp, "%s:\n", rt_to_str(RT_NET));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3195
	output_prop(fp, PT_ADDRESS, nwiftab->zone_nwif_address, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3196
	output_prop(fp, PT_PHYSICAL, nwiftab->zone_nwif_physical, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3197
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3199
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3200
info_net(zone_dochandle_t handle, FILE *fp, cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3201
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3202
	struct zone_nwiftab lookup, user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3203
	bool output = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3205
	if (zonecfg_setnwifent(handle) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3206
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3207
	while (zonecfg_getnwifent(handle, &lookup) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3208
		if (cmd->cmd_prop_nv_pairs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3209
			output_net(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3210
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3211
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3212
		if (fill_in_nwiftab(cmd, &user, TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3213
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3214
		if (strlen(user.zone_nwif_physical) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3215
		    strcmp(user.zone_nwif_physical,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3216
		    lookup.zone_nwif_physical) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3217
			continue;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3218
		if (strlen(user.zone_nwif_address) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3219
		    !zonecfg_same_net_address(user.zone_nwif_address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3220
		    lookup.zone_nwif_address))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3221
			continue;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3222
		output_net(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3223
		output = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3224
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3225
	(void) zonecfg_endnwifent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3226
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3227
	 * If a property n/v pair was specified, warn the user if there was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3228
	 * nothing to output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3229
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3230
	if (!output && cmd->cmd_prop_nv_pairs > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3231
		(void) printf(gettext("No such %s resource.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3232
		    rt_to_str(RT_NET));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3233
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3235
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3236
output_dev(FILE *fp, struct zone_devtab *devtab)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3237
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3238
	(void) fprintf(fp, "%s\n", rt_to_str(RT_DEVICE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3239
	output_prop(fp, PT_MATCH, devtab->zone_dev_match, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3240
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3242
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3243
info_dev(zone_dochandle_t handle, FILE *fp, cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3244
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3245
	struct zone_devtab lookup, user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3246
	bool output = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3248
	if (zonecfg_setdevent(handle) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3249
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3250
	while (zonecfg_getdevent(handle, &lookup) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3251
		if (cmd->cmd_prop_nv_pairs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3252
			output_dev(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3253
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3254
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3255
		if (fill_in_devtab(cmd, &user, TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3256
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3257
		if (strlen(user.zone_dev_match) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3258
		    strcmp(user.zone_dev_match, lookup.zone_dev_match) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3259
			continue;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3260
		output_dev(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3261
		output = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3262
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3263
	(void) zonecfg_enddevent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3264
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3265
	 * If a property n/v pair was specified, warn the user if there was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3266
	 * nothing to output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3267
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3268
	if (!output && cmd->cmd_prop_nv_pairs > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3269
		(void) printf(gettext("No such %s resource.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3270
		    rt_to_str(RT_DEVICE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3271
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3273
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3274
output_rctl(FILE *fp, struct zone_rctltab *rctltab)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3275
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3276
	struct zone_rctlvaltab *valptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3278
	(void) fprintf(fp, "%s:\n", rt_to_str(RT_RCTL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3279
	output_prop(fp, PT_NAME, rctltab->zone_rctl_name, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3280
	for (valptr = rctltab->zone_rctl_valptr; valptr != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3281
	    valptr = valptr->zone_rctlval_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3282
		fprintf(fp, "\t%s: (%s=%s,%s=%s,%s=%s)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3283
		    pt_to_str(PT_VALUE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3284
		    pt_to_str(PT_PRIV), valptr->zone_rctlval_priv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3285
		    pt_to_str(PT_LIMIT), valptr->zone_rctlval_limit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3286
		    pt_to_str(PT_ACTION), valptr->zone_rctlval_action);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3287
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3288
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3290
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3291
info_rctl(zone_dochandle_t handle, FILE *fp, cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3292
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3293
	struct zone_rctltab lookup, user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3294
	bool output = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3295
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3296
	if (zonecfg_setrctlent(handle) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3297
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3298
	while (zonecfg_getrctlent(handle, &lookup) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3299
		if (cmd->cmd_prop_nv_pairs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3300
			output_rctl(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3301
		} else if (fill_in_rctltab(cmd, &user, TRUE) == Z_OK &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3302
		    (strlen(user.zone_rctl_name) == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3303
		    strcmp(user.zone_rctl_name, lookup.zone_rctl_name) == 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3304
			output_rctl(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3305
			output = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3306
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3307
		zonecfg_free_rctl_value_list(lookup.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3308
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3309
	(void) zonecfg_endrctlent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3310
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3311
	 * If a property n/v pair was specified, warn the user if there was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3312
	 * nothing to output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3313
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3314
	if (!output && cmd->cmd_prop_nv_pairs > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3315
		(void) printf(gettext("No such %s resource.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3316
		    rt_to_str(RT_RCTL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3317
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3319
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3320
output_attr(FILE *fp, struct zone_attrtab *attrtab)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3321
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3322
	(void) fprintf(fp, "%s:\n", rt_to_str(RT_ATTR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3323
	output_prop(fp, PT_NAME, attrtab->zone_attr_name, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3324
	output_prop(fp, PT_TYPE, attrtab->zone_attr_type, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3325
	output_prop(fp, PT_VALUE, attrtab->zone_attr_value, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3326
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3328
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3329
info_attr(zone_dochandle_t handle, FILE *fp, cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3330
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3331
	struct zone_attrtab lookup, user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3332
	bool output = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3334
	if (zonecfg_setattrent(handle) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3335
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3336
	while (zonecfg_getattrent(handle, &lookup) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3337
		if (cmd->cmd_prop_nv_pairs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3338
			output_attr(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3339
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3340
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3341
		if (fill_in_attrtab(cmd, &user, TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3342
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3343
		if (strlen(user.zone_attr_name) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3344
		    strcmp(user.zone_attr_name, lookup.zone_attr_name) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3345
			continue;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3346
		if (strlen(user.zone_attr_type) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3347
		    strcmp(user.zone_attr_type, lookup.zone_attr_type) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3348
			continue;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3349
		if (strlen(user.zone_attr_value) > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3350
		    strcmp(user.zone_attr_value, lookup.zone_attr_value) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3351
			continue;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3352
		output_attr(fp, &lookup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3353
		output = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3354
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3355
	(void) zonecfg_endattrent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3356
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3357
	 * If a property n/v pair was specified, warn the user if there was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3358
	 * nothing to output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3359
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3360
	if (!output && cmd->cmd_prop_nv_pairs > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3361
		(void) printf(gettext("No such %s resource.\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3362
		    rt_to_str(RT_ATTR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3363
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3364
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3365
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3366
output_ds(FILE *fp, struct zone_dstab *dstab)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3367
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3368
	(void) fprintf(fp, "%s:\n", rt_to_str(RT_DATASET));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3369
	output_prop(fp, PT_NAME, dstab->zone_dataset_name, B_TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3370
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3371
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3372
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3373
info_ds(zone_dochandle_t handle, FILE *fp, cmd_t *cmd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3374
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3375
	struct zone_dstab lookup, user;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3376
	bool output = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3377
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3378
	if (zonecfg_setdevent(handle) != Z_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3379
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3380
	while (zonecfg_getdsent(handle, &lookup) == Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3381
		if (cmd->cmd_prop_nv_pairs == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3382
			output_ds(fp, &lookup);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3383
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3384
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3385
		if (fill_in_dstab(cmd, &user, TRUE) != Z_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3386
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3387
		if (strlen(user.zone_dataset_name) > 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3388
		    strcmp(user.zone_dataset_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3389
		    lookup.zone_dataset_name) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3390
			continue;	/* no match */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3391
		output_ds(fp, &lookup);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3392
		output = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3393
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3394
	(void) zonecfg_enddsent(handle);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3395
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3396
	 * If a property n/v pair was specified, warn the user if there was
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3397
	 * nothing to output.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3398
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3399
	if (!output && cmd->cmd_prop_nv_pairs > 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3400
		(void) printf(gettext("No such %s resource.\n"),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3401
		    rt_to_str(RT_DATASET));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3402
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3403
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3404
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3405
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3406
info_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3407
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3408
	FILE *fp = stdout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3409
	bool need_to_close = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3410
	char *pager;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3412
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3414
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3415
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3417
	/* don't page error output */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3418
	if (interactive_mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3419
		if ((pager = getenv("PAGER")) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3420
			pager = PAGER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3421
		if ((fp = popen(pager, "w")) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3422
			need_to_close = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3423
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3424
			fp = stdout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3425
		setbuf(fp, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3426
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3428
	if (!global_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3429
		switch (resource_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3430
		case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3431
			output_fs(fp, &in_progress_fstab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3432
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3433
		case RT_IPD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3434
			output_ipd(fp, &in_progress_ipdtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3435
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3436
		case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3437
			output_net(fp, &in_progress_nwiftab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3438
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3439
		case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3440
			output_dev(fp, &in_progress_devtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3441
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3442
		case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3443
			output_rctl(fp, &in_progress_rctltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3444
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3445
		case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3446
			output_attr(fp, &in_progress_attrtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3447
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3448
		case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3449
			output_ds(fp, &in_progress_dstab);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3450
			break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3451
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3452
		goto cleanup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3453
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3455
	switch (cmd->cmd_res_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3456
	case RT_UNKNOWN:
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3457
		info_zonename(handle, fp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3458
		info_zonepath(handle, fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3459
		info_autoboot(handle, fp);
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3460
		info_bootargs(handle, fp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3461
		info_pool(handle, fp);
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3462
		info_limitpriv(handle, fp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3463
		info_ipd(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3464
		info_fs(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3465
		info_net(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3466
		info_dev(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3467
		info_rctl(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3468
		info_attr(handle, fp, cmd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3469
		info_ds(handle, fp, cmd);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3470
		break;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3471
	case RT_ZONENAME:
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3472
		info_zonename(handle, fp);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3473
		break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3474
	case RT_ZONEPATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3475
		info_zonepath(handle, fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3476
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3477
	case RT_AUTOBOOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3478
		info_autoboot(handle, fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3479
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3480
	case RT_POOL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3481
		info_pool(handle, fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3482
		break;
1645
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3483
	case RT_LIMITPRIV:
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3484
		info_limitpriv(handle, fp);
5c204cdba7d2 PSARC 2006/124 Configurable Privileges for Zones
comay
parents: 1634
diff changeset
  3485
		break;
2267
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3486
	case RT_BOOTARGS:
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3487
		info_bootargs(handle, fp);
c5d9a656170f PSARC/2006/269 Zone Boot Arguments II
dp
parents: 1645
diff changeset
  3488
		break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3489
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3490
		info_fs(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3491
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3492
	case RT_IPD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3493
		info_ipd(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3494
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3495
	case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3496
		info_net(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3497
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3498
	case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3499
		info_dev(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3500
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3501
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3502
		info_rctl(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3503
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3504
	case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3505
		info_attr(handle, fp, cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3506
		break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3507
	case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3508
		info_ds(handle, fp, cmd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3509
		break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3510
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3511
		zone_perror(rt_to_str(cmd->cmd_res_type), Z_NO_RESOURCE_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3512
		    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3513
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3515
cleanup:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3516
	if (need_to_close)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3517
		(void) pclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3518
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3519
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3520
/*
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3521
 * Helper function for verify-- checks that a required string property
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3522
 * exists.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3523
 */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3524
static void
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3525
check_reqd_prop(char *attr, int rt, int pt, int *ret_val)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3526
{
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3527
	if (strlen(attr) == 0) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3528
		zerr(gettext("%s: %s not specified"), rt_to_str(rt),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3529
		    pt_to_str(pt));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3530
		saw_error = TRUE;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3531
		if (*ret_val == Z_OK)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3532
			*ret_val = Z_REQD_PROPERTY_MISSING;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3533
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3534
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3536
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3537
 * See the DTD for which attributes are required for which resources.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3538
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3539
 * This function can be called by commit_func(), which needs to save things,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3540
 * in addition to the general call from parse_and_run(), which doesn't need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3541
 * things saved.  Since the parameters are standardized, we distinguish by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3542
 * having commit_func() call here with cmd->cmd_arg set to "save" to indicate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3543
 * that a save is needed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3544
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3545
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3546
verify_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3547
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3548
	struct zone_nwiftab nwiftab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3549
	struct zone_fstab fstab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3550
	struct zone_attrtab attrtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3551
	struct zone_rctltab rctltab;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3552
	struct zone_dstab dstab;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3553
	char zonepath[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3554
	int err, ret_val = Z_OK, arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3555
	bool save = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3556
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3557
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3558
	if ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3559
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3560
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3561
			longer_usage(CMD_VERIFY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3562
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3563
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3564
			short_usage(CMD_VERIFY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3565
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3566
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3567
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3568
	if (optind > cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3569
		short_usage(CMD_VERIFY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3570
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3571
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3573
	if (zone_is_read_only(CMD_VERIFY))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3574
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3576
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3578
	if (cmd->cmd_argc > 0 && (strcmp(cmd->cmd_argv[0], "save") == 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3579
		save = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3580
	if (initialize(TRUE) != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3581
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3583
	if (zonecfg_get_zonepath(handle, zonepath, sizeof (zonepath)) != Z_OK) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3584
		zerr(gettext("%s not specified"), pt_to_str(PT_ZONEPATH));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3585
		ret_val = Z_REQD_RESOURCE_MISSING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3586
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3587
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3588
	if (strlen(zonepath) == 0) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3589
		zerr(gettext("%s cannot be empty."), pt_to_str(PT_ZONEPATH));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3590
		ret_val = Z_REQD_RESOURCE_MISSING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3591
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3592
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3594
	if ((err = zonecfg_setipdent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3595
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3596
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3597
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3598
	while (zonecfg_getipdent(handle, &fstab) == Z_OK) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3599
		check_reqd_prop(fstab.zone_fs_dir, RT_IPD, PT_DIR, &ret_val);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3600
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3601
	(void) zonecfg_endipdent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3603
	if ((err = zonecfg_setfsent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3604
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3605
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3606
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3607
	while (zonecfg_getfsent(handle, &fstab) == Z_OK) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3608
		check_reqd_prop(fstab.zone_fs_dir, RT_FS, PT_DIR, &ret_val);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3609
		check_reqd_prop(fstab.zone_fs_special, RT_FS, PT_SPECIAL,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3610
		    &ret_val);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3611
		check_reqd_prop(fstab.zone_fs_type, RT_FS, PT_TYPE, &ret_val);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3612
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3613
		zonecfg_free_fs_option_list(fstab.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3614
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3615
	(void) zonecfg_endfsent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3617
	if ((err = zonecfg_setnwifent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3618
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3619
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3620
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3621
	while (zonecfg_getnwifent(handle, &nwiftab) == Z_OK) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3622
		check_reqd_prop(nwiftab.zone_nwif_address, RT_NET,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3623
		    PT_ADDRESS, &ret_val);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3624
		check_reqd_prop(nwiftab.zone_nwif_physical, RT_NET,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3625
		    PT_PHYSICAL, &ret_val);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3626
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3627
	(void) zonecfg_endnwifent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3629
	if ((err = zonecfg_setrctlent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3630
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3631
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3632
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3633
	while (zonecfg_getrctlent(handle, &rctltab) == Z_OK) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3634
		check_reqd_prop(rctltab.zone_rctl_name, RT_RCTL, PT_NAME,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3635
		    &ret_val);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3636
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3637
		if (rctltab.zone_rctl_valptr == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3638
			zerr(gettext("%s: no %s specified"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3639
			    rt_to_str(RT_RCTL), pt_to_str(PT_VALUE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3640
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3641
			if (ret_val == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3642
				ret_val = Z_REQD_PROPERTY_MISSING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3643
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3644
			zonecfg_free_rctl_value_list(rctltab.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3645
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3646
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3647
	(void) zonecfg_endrctlent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3649
	if ((err = zonecfg_setattrent(handle)) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3650
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3651
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3652
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3653
	while (zonecfg_getattrent(handle, &attrtab) == Z_OK) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3654
		check_reqd_prop(attrtab.zone_attr_name, RT_ATTR, PT_NAME,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3655
		    &ret_val);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3656
		check_reqd_prop(attrtab.zone_attr_type, RT_ATTR, PT_TYPE,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3657
		    &ret_val);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3658
		check_reqd_prop(attrtab.zone_attr_value, RT_ATTR, PT_VALUE,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3659
		    &ret_val);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3660
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3661
	(void) zonecfg_endattrent(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3662
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3663
	if ((err = zonecfg_setdsent(handle)) != Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3664
		zone_perror(zone, err, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3665
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3666
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3667
	while (zonecfg_getdsent(handle, &dstab) == Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3668
		if (strlen(dstab.zone_dataset_name) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3669
			zerr("%s: %s %s", rt_to_str(RT_DATASET),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3670
			    pt_to_str(PT_NAME), gettext("not specified"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3671
			saw_error = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3672
			if (ret_val == Z_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3673
				ret_val = Z_REQD_PROPERTY_MISSING;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3674
		} else if (!zfs_name_valid(dstab.zone_dataset_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3675
		    ZFS_TYPE_FILESYSTEM)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3676
			zerr("%s: %s %s", rt_to_str(RT_DATASET),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3677
			    pt_to_str(PT_NAME), gettext("invalid"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3678
			saw_error = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3679
			if (ret_val == Z_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3680
				ret_val = Z_BAD_PROPERTY;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3681
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3682
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3683
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3684
	(void) zonecfg_enddsent(handle);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3685
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3686
	if (!global_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3687
		zerr(gettext("resource specification incomplete"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3688
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3689
		if (ret_val == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3690
			ret_val = Z_INSUFFICIENT_SPEC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3691
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3693
	if (save) {
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3694
		if (ret_val == Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3695
			if ((ret_val = zonecfg_save(handle)) == Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3696
				need_to_commit = FALSE;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3697
				(void) strlcpy(revert_zone, zone,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3698
				    sizeof (revert_zone));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3699
			}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3700
		} else {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3701
			zerr(gettext("Zone %s failed to verify"), zone);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3702
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3703
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3704
	if (ret_val != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3705
		zone_perror(zone, ret_val, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3706
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3708
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3709
cancel_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3710
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3711
	int arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3712
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3713
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3715
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3716
	if ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3717
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3718
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3719
			longer_usage(CMD_CANCEL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3720
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3721
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3722
			short_usage(CMD_CANCEL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3723
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3724
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3725
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3726
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3727
		short_usage(CMD_CANCEL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3728
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3729
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3731
	if (global_scope)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3732
		scope_usage(CMD_CANCEL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3733
	global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3734
	zonecfg_free_fs_option_list(in_progress_fstab.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3735
	bzero(&in_progress_fstab, sizeof (in_progress_fstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3736
	bzero(&in_progress_nwiftab, sizeof (in_progress_nwiftab));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3737
	bzero(&in_progress_ipdtab, sizeof (in_progress_ipdtab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3738
	bzero(&in_progress_devtab, sizeof (in_progress_devtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3739
	zonecfg_free_rctl_value_list(in_progress_rctltab.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3740
	bzero(&in_progress_rctltab, sizeof (in_progress_rctltab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3741
	bzero(&in_progress_attrtab, sizeof (in_progress_attrtab));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3742
	bzero(&in_progress_dstab, sizeof (in_progress_dstab));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3743
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3745
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3746
validate_attr_name(char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3747
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3748
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3750
	if (!isalnum(name[0])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3751
		zerr(gettext("Invalid %s %s %s: must start with an alpha-"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3752
		    "numeric character."), rt_to_str(RT_ATTR),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3753
		    pt_to_str(PT_NAME), name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3754
		return (Z_INVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3755
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3756
	for (i = 1; name[i]; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3757
		if (!isalnum(name[i]) && name[i] != '-' && name[i] != '.') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3758
			zerr(gettext("Invalid %s %s %s: can only contain "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3759
			    "alpha-numeric characters, plus '-' and '.'."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3760
			    rt_to_str(RT_ATTR), pt_to_str(PT_NAME), name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3761
			return (Z_INVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3762
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3763
	return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3764
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3766
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3767
validate_attr_type_val(struct zone_attrtab *attrtab)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3768
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3769
	boolean_t boolval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3770
	int64_t intval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3771
	char strval[MAXNAMELEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3772
	uint64_t uintval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3773
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3774
	if (strcmp(attrtab->zone_attr_type, "boolean") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3775
		if (zonecfg_get_attr_boolean(attrtab, &boolval) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3776
			return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3777
		zerr(gettext("invalid %s value for %s=%s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3778
		    rt_to_str(RT_ATTR), pt_to_str(PT_TYPE), "boolean");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3779
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3780
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3782
	if (strcmp(attrtab->zone_attr_type, "int") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3783
		if (zonecfg_get_attr_int(attrtab, &intval) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3784
			return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3785
		zerr(gettext("invalid %s value for %s=%s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3786
		    rt_to_str(RT_ATTR), pt_to_str(PT_TYPE), "int");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3787
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3788
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3789
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3790
	if (strcmp(attrtab->zone_attr_type, "string") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3791
		if (zonecfg_get_attr_string(attrtab, strval,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3792
		    sizeof (strval)) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3793
			return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3794
		zerr(gettext("invalid %s value for %s=%s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3795
		    rt_to_str(RT_ATTR), pt_to_str(PT_TYPE), "string");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3796
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3797
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3799
	if (strcmp(attrtab->zone_attr_type, "uint") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3800
		if (zonecfg_get_attr_uint(attrtab, &uintval) == Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3801
			return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3802
		zerr(gettext("invalid %s value for %s=%s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3803
		    rt_to_str(RT_ATTR), pt_to_str(PT_TYPE), "uint");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3804
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3805
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3807
	zerr(gettext("invalid %s %s '%s'"), rt_to_str(RT_ATTR),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3808
	    pt_to_str(PT_TYPE), attrtab->zone_attr_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3809
	return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3810
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3811
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3812
/*
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3813
 * Helper function for end_func-- checks the existence of a given property
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3814
 * and emits a message if not specified.
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3815
 */
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3816
static int
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3817
end_check_reqd(char *attr, int pt, bool *validation_failed)
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3818
{
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3819
	if (strlen(attr) == 0) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3820
		*validation_failed = TRUE;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3821
		zerr(gettext("%s not specified"), pt_to_str(pt));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3822
		return (Z_ERR);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3823
	}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3824
	return (Z_OK);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3825
}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3826
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3827
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3828
end_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3829
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3830
	bool validation_failed = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3831
	struct zone_fstab tmp_fstab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3832
	struct zone_nwiftab tmp_nwiftab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3833
	struct zone_devtab tmp_devtab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3834
	struct zone_rctltab tmp_rctltab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3835
	struct zone_attrtab tmp_attrtab;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  3836
	struct zone_dstab tmp_dstab;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3837
	int err, arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3839
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3840
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3841
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3842
	if ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3843
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3844
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3845
			longer_usage(CMD_END);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3846
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3847
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3848
			short_usage(CMD_END);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3849
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3850
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3851
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3852
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3853
		short_usage(CMD_END);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3854
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3855
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3857
	if (global_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3858
		scope_usage(CMD_END);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3859
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3860
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3862
	assert(end_op == CMD_ADD || end_op == CMD_SELECT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3864
	switch (resource_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3865
	case RT_FS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3866
		/* First make sure everything was filled in. */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3867
		if (end_check_reqd(in_progress_fstab.zone_fs_dir,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3868
		    PT_DIR, &validation_failed) == Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3869
			if (in_progress_fstab.zone_fs_dir[0] != '/') {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3870
				zerr(gettext("%s %s is not an absolute path."),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3871
				    pt_to_str(PT_DIR),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3872
				    in_progress_fstab.zone_fs_dir);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3873
				validation_failed = TRUE;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3874
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3875
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3876
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3877
		(void) end_check_reqd(in_progress_fstab.zone_fs_special,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3878
		    PT_SPECIAL, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3879
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3880
		if (in_progress_fstab.zone_fs_raw[0] != '\0' &&
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3881
		    in_progress_fstab.zone_fs_raw[0] != '/') {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3882
			zerr(gettext("%s %s is not an absolute path."),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3883
			    pt_to_str(PT_RAW),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3884
			    in_progress_fstab.zone_fs_raw);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3885
			validation_failed = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3886
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3887
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3888
		(void) end_check_reqd(in_progress_fstab.zone_fs_type, PT_TYPE,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3889
		    &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3890
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3891
		if (validation_failed) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3892
			saw_error = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3893
			return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3894
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3895
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3896
		if (end_op == CMD_ADD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3897
			/* Make sure there isn't already one like this. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3898
			bzero(&tmp_fstab, sizeof (tmp_fstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3899
			(void) strlcpy(tmp_fstab.zone_fs_dir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3900
			    in_progress_fstab.zone_fs_dir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3901
			    sizeof (tmp_fstab.zone_fs_dir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3902
			err = zonecfg_lookup_filesystem(handle, &tmp_fstab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3903
			zonecfg_free_fs_option_list(tmp_fstab.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3904
			if (err == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3905
				zerr(gettext("A %s resource "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3906
				    "with the %s '%s' already exists."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3907
				    rt_to_str(RT_FS), pt_to_str(PT_DIR),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3908
				    in_progress_fstab.zone_fs_dir);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3909
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3910
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3911
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3912
			err = zonecfg_add_filesystem(handle,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3913
			    &in_progress_fstab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3914
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3915
			err = zonecfg_modify_filesystem(handle, &old_fstab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3916
			    &in_progress_fstab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3917
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3918
		zonecfg_free_fs_option_list(in_progress_fstab.zone_fs_options);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3919
		in_progress_fstab.zone_fs_options = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3920
		break;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3921
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3922
	case RT_IPD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3923
		/* First make sure everything was filled in. */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3924
		if (end_check_reqd(in_progress_ipdtab.zone_fs_dir, PT_DIR,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3925
		    &validation_failed) == Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3926
			if (in_progress_ipdtab.zone_fs_dir[0] != '/') {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3927
				zerr(gettext("%s %s is not an absolute path."),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3928
				    pt_to_str(PT_DIR),
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3929
				    in_progress_ipdtab.zone_fs_dir);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3930
				validation_failed = TRUE;
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3931
			}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3932
		}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3933
		if (validation_failed) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3934
			saw_error = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3935
			return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3936
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3937
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3938
		if (end_op == CMD_ADD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3939
			/* Make sure there isn't already one like this. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3940
			bzero(&tmp_fstab, sizeof (tmp_fstab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3941
			(void) strlcpy(tmp_fstab.zone_fs_dir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3942
			    in_progress_ipdtab.zone_fs_dir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3943
			    sizeof (tmp_fstab.zone_fs_dir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3944
			err = zonecfg_lookup_ipd(handle, &tmp_fstab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3945
			if (err == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3946
				zerr(gettext("An %s resource "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3947
				    "with the %s '%s' already exists."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3948
				    rt_to_str(RT_IPD), pt_to_str(PT_DIR),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3949
				    in_progress_ipdtab.zone_fs_dir);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3950
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3951
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3952
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3953
			err = zonecfg_add_ipd(handle, &in_progress_ipdtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3954
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3955
			err = zonecfg_modify_ipd(handle, &old_ipdtab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3956
			    &in_progress_ipdtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3957
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3958
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3959
	case RT_NET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3960
		/* First make sure everything was filled in. */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3961
		(void) end_check_reqd(in_progress_nwiftab.zone_nwif_physical,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3962
		    PT_PHYSICAL, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3963
		(void) end_check_reqd(in_progress_nwiftab.zone_nwif_address,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3964
		    PT_ADDRESS, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3965
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3966
		if (validation_failed) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3967
			saw_error = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3968
			return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3969
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3970
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3971
		if (end_op == CMD_ADD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3972
			/* Make sure there isn't already one like this. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3973
			bzero(&tmp_nwiftab, sizeof (tmp_nwiftab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3974
			(void) strlcpy(tmp_nwiftab.zone_nwif_address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3975
			    in_progress_nwiftab.zone_nwif_address,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3976
			    sizeof (tmp_nwiftab.zone_nwif_address));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3977
			if (zonecfg_lookup_nwif(handle, &tmp_nwiftab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3978
				zerr(gettext("A %s resource "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3979
				    "with the %s '%s' already exists."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3980
				    rt_to_str(RT_NET), pt_to_str(PT_ADDRESS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3981
				    in_progress_nwiftab.zone_nwif_address);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3982
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3983
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3984
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3985
			err = zonecfg_add_nwif(handle, &in_progress_nwiftab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3986
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3987
			err = zonecfg_modify_nwif(handle, &old_nwiftab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3988
			    &in_progress_nwiftab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3989
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3990
		break;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3991
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3992
	case RT_DEVICE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3993
		/* First make sure everything was filled in. */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3994
		(void) end_check_reqd(in_progress_devtab.zone_dev_match,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3995
		    PT_MATCH, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3996
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3997
		if (validation_failed) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3998
			saw_error = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  3999
			return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4000
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4001
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4002
		if (end_op == CMD_ADD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4003
			/* Make sure there isn't already one like this. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4004
			(void) strlcpy(tmp_devtab.zone_dev_match,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4005
			    in_progress_devtab.zone_dev_match,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4006
			    sizeof (tmp_devtab.zone_dev_match));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4007
			if (zonecfg_lookup_dev(handle, &tmp_devtab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4008
				zerr(gettext("A %s resource with the %s '%s' "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4009
				    "already exists."), rt_to_str(RT_DEVICE),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4010
				    pt_to_str(PT_MATCH),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4011
				    in_progress_devtab.zone_dev_match);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4012
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4013
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4014
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4015
			err = zonecfg_add_dev(handle, &in_progress_devtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4016
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4017
			err = zonecfg_modify_dev(handle, &old_devtab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4018
			    &in_progress_devtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4019
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4020
		break;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4021
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4022
	case RT_RCTL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4023
		/* First make sure everything was filled in. */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4024
		(void) end_check_reqd(in_progress_rctltab.zone_rctl_name,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4025
		    PT_NAME, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4026
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4027
		if (in_progress_rctltab.zone_rctl_valptr == NULL) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4028
			zerr(gettext("no %s specified"), pt_to_str(PT_VALUE));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4029
			validation_failed = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4030
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4031
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4032
		if (validation_failed) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4033
			saw_error = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4034
			return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4035
		}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4036
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4037
		if (end_op == CMD_ADD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4038
			/* Make sure there isn't already one like this. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4039
			(void) strlcpy(tmp_rctltab.zone_rctl_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4040
			    in_progress_rctltab.zone_rctl_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4041
			    sizeof (tmp_rctltab.zone_rctl_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4042
			tmp_rctltab.zone_rctl_valptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4043
			err = zonecfg_lookup_rctl(handle, &tmp_rctltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4044
			zonecfg_free_rctl_value_list(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4045
			    tmp_rctltab.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4046
			if (err == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4047
				zerr(gettext("A %s resource "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4048
				    "with the %s '%s' already exists."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4049
				    rt_to_str(RT_RCTL), pt_to_str(PT_NAME),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4050
				    in_progress_rctltab.zone_rctl_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4051
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4052
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4053
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4054
			err = zonecfg_add_rctl(handle, &in_progress_rctltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4055
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4056
			err = zonecfg_modify_rctl(handle, &old_rctltab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4057
			    &in_progress_rctltab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4058
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4059
		if (err == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4060
			zonecfg_free_rctl_value_list(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4061
			    in_progress_rctltab.zone_rctl_valptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4062
			in_progress_rctltab.zone_rctl_valptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4063
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4064
		break;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4065
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4066
	case RT_ATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4067
		/* First make sure everything was filled in. */
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4068
		(void) end_check_reqd(in_progress_attrtab.zone_attr_name,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4069
		    PT_NAME, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4070
		(void) end_check_reqd(in_progress_attrtab.zone_attr_type,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4071
		    PT_TYPE, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4072
		(void) end_check_reqd(in_progress_attrtab.zone_attr_value,
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4073
		    PT_VALUE, &validation_failed);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4074
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4075
		if (validate_attr_name(in_progress_attrtab.zone_attr_name) !=
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4076
		    Z_OK)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4077
			validation_failed = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4078
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4079
		if (validate_attr_type_val(&in_progress_attrtab) != Z_OK)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4080
			validation_failed = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4081
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4082
		if (validation_failed) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4083
			saw_error = TRUE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4084
			return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4085
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4086
		if (end_op == CMD_ADD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4087
			/* Make sure there isn't already one like this. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4088
			bzero(&tmp_attrtab, sizeof (tmp_attrtab));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4089
			(void) strlcpy(tmp_attrtab.zone_attr_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4090
			    in_progress_attrtab.zone_attr_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4091
			    sizeof (tmp_attrtab.zone_attr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4092
			if (zonecfg_lookup_attr(handle, &tmp_attrtab) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4093
				zerr(gettext("An %s resource "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4094
				    "with the %s '%s' already exists."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4095
				    rt_to_str(RT_ATTR), pt_to_str(PT_NAME),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4096
				    in_progress_attrtab.zone_attr_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4097
				saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4098
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4099
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4100
			err = zonecfg_add_attr(handle, &in_progress_attrtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4101
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4102
			err = zonecfg_modify_attr(handle, &old_attrtab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4103
			    &in_progress_attrtab);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4104
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4105
		break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4106
	case RT_DATASET:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4107
		/* First make sure everything was filled in. */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4108
		if (strlen(in_progress_dstab.zone_dataset_name) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4109
			zerr("%s %s", pt_to_str(PT_NAME),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4110
			    gettext("not specified"));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4111
			saw_error = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4112
			validation_failed = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4113
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4114
		if (validation_failed)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4115
			return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4116
		if (end_op == CMD_ADD) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4117
			/* Make sure there isn't already one like this. */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4118
			bzero(&tmp_dstab, sizeof (tmp_dstab));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4119
			(void) strlcpy(tmp_dstab.zone_dataset_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4120
			    in_progress_dstab.zone_dataset_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4121
			    sizeof (tmp_dstab.zone_dataset_name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4122
			err = zonecfg_lookup_ds(handle, &tmp_dstab);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4123
			if (err == Z_OK) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4124
				zerr(gettext("A %s resource "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4125
				    "with the %s '%s' already exists."),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4126
				    rt_to_str(RT_DATASET), pt_to_str(PT_NAME),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4127
				    in_progress_dstab.zone_dataset_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4128
				saw_error = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4129
				return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4130
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4131
			err = zonecfg_add_ds(handle, &in_progress_dstab);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4132
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4133
			err = zonecfg_modify_ds(handle, &old_dstab,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4134
			    &in_progress_dstab);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4135
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 565
diff changeset
  4136
		break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4137
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4138
		zone_perror(rt_to_str(resource_scope), Z_NO_RESOURCE_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4139
		    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4140
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4141
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4142
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4144
	if (err != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4145
		zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4146
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4147
		need_to_commit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4148
		global_scope = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4149
		end_op = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4150
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4151
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4153
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4154
commit_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4155
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4156
	int arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4158
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4159
	if ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4160
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4161
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4162
			longer_usage(CMD_COMMIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4163
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4164
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4165
			short_usage(CMD_COMMIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4166
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4167
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4168
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4169
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4170
		short_usage(CMD_COMMIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4171
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4172
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4174
	if (zone_is_read_only(CMD_COMMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4175
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4177
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4179
	cmd->cmd_argc = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4180
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4181
	 * cmd_arg normally comes from a strdup() in the lexer, and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4182
	 * whole cmd structure and its (char *) attributes are freed at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4183
	 * the completion of each command, so the strdup() below is needed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4184
	 * to match this and prevent a core dump from trying to free()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4185
	 * something that can't be.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4186
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4187
	if ((cmd->cmd_argv[0] = strdup("save")) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4188
		zone_perror(zone, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4189
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4190
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4191
	cmd->cmd_argv[1] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4192
	verify_func(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4193
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4195
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4196
revert_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4197
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4198
	char line[128];	/* enough to ask a question */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4199
	bool force = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4200
	int err, arg, answer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4202
	optind = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4203
	while ((arg = getopt(cmd->cmd_argc, cmd->cmd_argv, "?F")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4204
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4205
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4206
			longer_usage(CMD_REVERT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4207
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4208
		case 'F':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4209
			force = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4210
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4211
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4212
			short_usage(CMD_REVERT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4213
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4214
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4215
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4216
	if (optind != cmd->cmd_argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4217
		short_usage(CMD_REVERT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4218
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4219
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4221
	if (zone_is_read_only(CMD_REVERT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4222
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4224
	if (zonecfg_check_handle(handle) != Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4225
		zerr(gettext("No changes to revert."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4226
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4227
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4228
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4230
	if (!force) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4231
		(void) snprintf(line, sizeof (line),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4232
		    gettext("Are you sure you want to revert"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4233
		if ((answer = ask_yesno(FALSE, line)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4234
			zerr(gettext("Input not from terminal and -F not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4235
			    "specified:\n%s command ignored, exiting."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4236
			    cmd_to_str(CMD_REVERT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4237
			exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4238
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4239
		if (answer != 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4240
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4241
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4243
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4244
	 * Time for a new handle: finish the old one off first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4245
	 * then get a new one properly to avoid leaks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4246
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4247
	zonecfg_fini_handle(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4248
	if ((handle = zonecfg_init_handle()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4249
		zone_perror(execname, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4250
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4251
	}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4252
	if ((err = zonecfg_get_handle(revert_zone, handle)) != Z_OK) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4253
		saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4254
		got_handle = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4255
		if (err == Z_NO_ZONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4256
			zerr(gettext("%s: no such saved zone to revert to."),
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4257
			    revert_zone);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4258
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4259
			zone_perror(zone, err, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4260
	}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4261
	(void) strlcpy(zone, revert_zone, sizeof (zone));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4262
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4263
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4264
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4265
help_func(cmd_t *cmd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4266
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4267
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4269
	assert(cmd != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4271
	if (cmd->cmd_argc == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4272
		usage(TRUE, global_scope ? HELP_SUBCMDS : HELP_RES_SCOPE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4273
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4274
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4275
	if (strcmp(cmd->cmd_argv[0], "usage") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4276
		usage(TRUE, HELP_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4277
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4278
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4279
	if (strcmp(cmd->cmd_argv[0], "commands") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4280
		usage(TRUE, HELP_SUBCMDS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4281
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4282
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4283
	if (strcmp(cmd->cmd_argv[0], "syntax") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4284
		usage(TRUE, HELP_SYNTAX | HELP_RES_PROPS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4285
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4286
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4287
	if (strcmp(cmd->cmd_argv[0], "-?") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4288
		longer_usage(CMD_HELP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4289
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4290
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4292
	for (i = 0; i <= CMD_MAX; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4293
		if (strcmp(cmd->cmd_argv[0], cmd_to_str(i)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4294
			longer_usage(i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4295
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4296
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4297
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4298
	/* We do not use zerr() here because we do not want its extra \n. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4299
	(void) fprintf(stderr, gettext("Unknown help subject %s.  "),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4300
	    cmd->cmd_argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4301
	usage(FALSE, HELP_META);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4302
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4304
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4305
string_to_yyin(char *string)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4306
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4307
	if ((yyin = tmpfile()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4308
		zone_perror(execname, Z_TEMP_FILE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4309
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4310
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4311
	if (fwrite(string, strlen(string), 1, yyin) != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4312
		zone_perror(execname, Z_TEMP_FILE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4313
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4314
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4315
	if (fseek(yyin, 0, SEEK_SET) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4316
		zone_perror(execname, Z_TEMP_FILE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4317
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4318
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4319
	return (Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4320
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4322
/* This is the back-end helper function for read_input() below. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4324
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4325
cleanup()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4326
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4327
	int answer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4328
	cmd_t *cmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4330
	if (!interactive_mode && !cmd_file_mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4331
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4332
		 * If we're not in interactive mode, and we're not in command
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4333
		 * file mode, then we must be in commands-from-the-command-line
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4334
		 * mode.  As such, we can't loop back and ask for more input.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4335
		 * It was OK to prompt for such things as whether or not to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4336
		 * really delete a zone in the command handler called from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4337
		 * yyparse() above, but "really quit?" makes no sense in this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4338
		 * context.  So disable prompting.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4339
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4340
		ok_to_prompt = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4341
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4342
	if (!global_scope) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4343
		if (!time_to_exit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4344
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4345
			 * Just print a simple error message in the -1 case,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4346
			 * since exit_func() already handles that case, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4347
			 * EOF means we are finished anyway.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4348
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4349
			answer = ask_yesno(FALSE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4350
			    gettext("Resource incomplete; really quit"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4351
			if (answer == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4352
				zerr(gettext("Resource incomplete."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4353
				return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4354
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4355
			if (answer != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4356
				yyin = stdin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4357
				return (Z_REPEAT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4358
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4359
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4360
			saw_error = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4361
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4362
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4363
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4364
	 * Make sure we tried something and that the handle checks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4365
	 * out, or we would get a false error trying to commit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4366
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4367
	if (need_to_commit && zonecfg_check_handle(handle) == Z_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4368
		if ((cmd = alloc_cmd()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4369
			zone_perror(zone, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4370
			return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4371
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4372
		cmd->cmd_argc = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4373
		cmd->cmd_argv[0] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4374
		commit_func(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4375
		free_cmd(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4376
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4377
		 * need_to_commit will get set back to FALSE if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4378
		 * configuration is saved successfully.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4379
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4380
		if (need_to_commit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4381
			if (force_exit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4382
				zerr(gettext("Configuration not saved."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4383
				return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4384
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4385
			answer = ask_yesno(FALSE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4386
			    gettext("Configuration not saved; really quit"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4387
			if (answer == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4388
				zerr(gettext("Configuration not saved."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4389
				return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4390
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4391
			if (answer != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4392
				time_to_exit = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4393
				yyin = stdin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4394
				return (Z_REPEAT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4395
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4396
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4397
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4398
	return ((need_to_commit || saw_error) ? Z_ERR : Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4399
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4401
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4402
 * read_input() is the driver of this program.  It is a wrapper around
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4403
 * yyparse(), printing appropriate prompts when needed, checking for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4404
 * exit conditions and reacting appropriately [the latter in its cleanup()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4405
 * helper function].
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4406
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4407
 * Like most zonecfg functions, it returns Z_OK or Z_ERR, *or* Z_REPEAT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4408
 * so do_interactive() knows that we are not really done (i.e, we asked
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4409
 * the user if we should really quit and the user said no).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4410
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4411
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4412
read_input()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4413
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4414
	bool yyin_is_a_tty = isatty(fileno(yyin));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4415
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4416
	 * The prompt is "e:z> " or "e:z:r> " where e is execname, z is zone
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4417
	 * and r is resource_scope: 5 is for the two ":"s + "> " + terminator.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4418
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4419
	char prompt[MAXPATHLEN + ZONENAME_MAX + MAX_RT_STRLEN + 5], *line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4421
	/* yyin should have been set to the appropriate (FILE *) if not stdin */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4422
	newline_terminated = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4423
	for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4424
		if (yyin_is_a_tty) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4425
			if (newline_terminated) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4426
				if (global_scope)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4427
					(void) snprintf(prompt, sizeof (prompt),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4428
					    "%s:%s> ", execname, zone);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4429
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4430
					(void) snprintf(prompt, sizeof (prompt),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4431
					    "%s:%s:%s> ", execname, zone,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4432
					    rt_to_str(resource_scope));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4433
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4434
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4435
			 * If the user hits ^C then we want to catch it and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4436
			 * start over.  If the user hits EOF then we want to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4437
			 * bail out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4438
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4439
			line = gl_get_line(gl, prompt, NULL, -1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4440
			if (gl_return_status(gl) == GLR_SIGNAL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4441
				gl_abandon_line(gl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4442
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4443
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4444
			if (line == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4445
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4446
			(void) string_to_yyin(line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4447
			while (!feof(yyin))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4448
				yyparse();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4449
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4450
			yyparse();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4451
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4452
		/* Bail out on an error in command file mode. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4453
		if (saw_error && cmd_file_mode && !interactive_mode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4454
			time_to_exit = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4455
		if (time_to_exit || (!yyin_is_a_tty && feof(yyin)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4456
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4457
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4458
	return (cleanup());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4459
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4461
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4462
 * This function is used in the zonecfg-interactive-mode scenario: it just
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4463
 * calls read_input() until we are done.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4464
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4466
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4467
do_interactive(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4468
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4469
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4471
	interactive_mode = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4472
	if (!read_only_mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4473
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4474
		 * Try to set things up proactively in interactive mode, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4475
		 * that if the zone in question does not exist yet, we can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4476
		 * provide the user with a clue.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4477
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4478
		(void) initialize(FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4479
	}
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4480
	do {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4481
		err = read_input();
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4482
	} while (err == Z_REPEAT);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4483
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4484
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4486
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4487
 * cmd_file is slightly more complicated, as it has to open the command file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4488
 * and set yyin appropriately.  Once that is done, though, it just calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4489
 * read_input(), and only once, since prompting is not possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4490
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4492
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4493
cmd_file(char *file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4494
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4495
	FILE *infile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4496
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4497
	struct stat statbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4498
	bool using_real_file = (strcmp(file, "-") != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4499
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4500
	if (using_real_file) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4501
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4502
		 * zerr() prints a line number in cmd_file_mode, which we do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4503
		 * not want here, so temporarily unset it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4504
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4505
		cmd_file_mode = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4506
		if ((infile = fopen(file, "r")) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4507
			zerr(gettext("could not open file %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4508
			    file, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4509
			return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4510
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4511
		if ((err = fstat(fileno(infile), &statbuf)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4512
			zerr(gettext("could not stat file %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4513
			    file, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4514
			err = Z_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4515
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4516
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4517
		if (!S_ISREG(statbuf.st_mode)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4518
			zerr(gettext("%s is not a regular file."), file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4519
			err = Z_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4520
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4521
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4522
		yyin = infile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4523
		cmd_file_mode = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4524
		ok_to_prompt = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4525
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4526
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4527
		 * "-f -" is essentially the same as interactive mode,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4528
		 * so treat it that way.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4529
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4530
		interactive_mode = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4531
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4532
	/* Z_REPEAT is for interactive mode; treat it like Z_ERR here. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4533
	if ((err = read_input()) == Z_REPEAT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4534
		err = Z_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4535
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4536
	if (using_real_file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4537
		(void) fclose(infile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4538
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4539
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4541
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4542
 * Since yacc is based on reading from a (FILE *) whereas what we get from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4543
 * the command line is in argv format, we need to convert when the user
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4544
 * gives us commands directly from the command line.  That is done here by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4545
 * concatenating the argv list into a space-separated string, writing it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4546
 * to a temp file, and rewinding the file so yyin can be set to it.  Then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4547
 * we call read_input(), and only once, since prompting about whether to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4548
 * continue or quit would make no sense in this context.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4549
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4551
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4552
one_command_at_a_time(int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4553
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4554
	char *command;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4555
	size_t len = 2; /* terminal \n\0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4556
	int i, err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4558
	for (i = 0; i < argc; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4559
		len += strlen(argv[i]) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4560
	if ((command = malloc(len)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4561
		zone_perror(execname, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4562
		return (Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4563
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4564
	(void) strlcpy(command, argv[0], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4565
	for (i = 1; i < argc; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4566
		(void) strlcat(command, " ", len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4567
		(void) strlcat(command, argv[i], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4568
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4569
	(void) strlcat(command, "\n", len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4570
	err = string_to_yyin(command);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4571
	free(command);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4572
	if (err != Z_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4573
		return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4574
	while (!feof(yyin))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4575
		yyparse();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4576
	return (cleanup());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4577
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4579
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4580
get_execbasename(char *execfullname)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4581
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4582
	char *last_slash, *execbasename;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4584
	/* guard against '/' at end of command invocation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4585
	for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4586
		last_slash = strrchr(execfullname, '/');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4587
		if (last_slash == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4588
			execbasename = execfullname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4589
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4590
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4591
			execbasename = last_slash + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4592
			if (*execbasename == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4593
				*last_slash = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4594
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4595
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4596
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4597
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4598
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4599
	return (execbasename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4600
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4602
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4603
main(int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4604
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4605
	int err, arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4607
	/* This must be before anything goes to stdout. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4608
	setbuf(stdout, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4610
	saw_error = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4611
	cmd_file_mode = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4612
	execname = get_execbasename(argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4614
	(void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4615
	(void) textdomain(TEXT_DOMAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4617
	if (getzoneid() != GLOBAL_ZONEID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4618
		zerr(gettext("%s can only be run from the global zone."),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4619
		    execname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4620
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4621
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4623
	if (argc < 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4624
		usage(FALSE, HELP_USAGE | HELP_SUBCMDS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4625
		exit(Z_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4626
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4627
	if (strcmp(argv[1], cmd_to_str(CMD_HELP)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4628
		(void) one_command_at_a_time(argc - 1, &(argv[1]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4629
		exit(Z_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4630
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4632
	while ((arg = getopt(argc, argv, "?f:z:")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4633
		switch (arg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4634
		case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4635
			if (optopt == '?')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4636
				usage(TRUE, HELP_USAGE | HELP_SUBCMDS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4637
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4638
				usage(FALSE, HELP_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4639
			exit(Z_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4640
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4641
		case 'f':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4642
			cmd_file_name = optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4643
			cmd_file_mode = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4644
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4645
		case 'z':
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4646
			if (zonecfg_validate_zonename(optarg) != Z_OK) {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4647
				zone_perror(optarg, Z_BOGUS_ZONE_NAME, TRUE);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4648
				usage(FALSE, HELP_SYNTAX);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4649
				exit(Z_USAGE);
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4650
			}
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4651
			(void) strlcpy(zone, optarg, sizeof (zone));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4652
			(void) strlcpy(revert_zone, optarg, sizeof (zone));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4653
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4654
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4655
			usage(FALSE, HELP_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4656
			exit(Z_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4657
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4658
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4659
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4660
	if (optind > argc || strcmp(zone, "") == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4661
		usage(FALSE, HELP_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4662
		exit(Z_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4663
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4664
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4665
	if ((err = zonecfg_access(zone, W_OK)) == Z_OK) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4666
		read_only_mode = FALSE;
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4667
	} else if (err == Z_ACCES) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4668
		read_only_mode = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4669
		/* skip this message in one-off from command line mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4670
		if (optind == argc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4671
			(void) fprintf(stderr, gettext("WARNING: you do not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4672
			    "have write access to this zone's configuration "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4673
			    "file;\ngoing into read-only mode.\n"));
565
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4674
	} else {
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4675
		fprintf(stderr, "%s: Could not access zone configuration "
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4676
		    "store: %s\n", execname, zonecfg_strerror(err));
519e81088064 PSARC 2005/485 Zone Rename
dp
parents: 222
diff changeset
  4677
		exit(Z_ERR);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4678
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4680
	if ((handle = zonecfg_init_handle()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4681
		zone_perror(execname, Z_NOMEM, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4682
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4683
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4685
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4686
	 * This may get set back to FALSE again in cmd_file() if cmd_file_name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4687
	 * is a "real" file as opposed to "-" (i.e. meaning use stdin).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4688
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4689
	if (isatty(STDIN_FILENO))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4690
		ok_to_prompt = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4691
	if ((gl = new_GetLine(MAX_LINE_LEN, MAX_CMD_HIST)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4692
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4693
	if (gl_customize_completion(gl, NULL, cmd_cpl_fn) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4694
		exit(Z_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4695
	(void) sigset(SIGINT, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4696
	if (optind == argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4697
		if (!cmd_file_mode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4698
			err = do_interactive();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4699
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4700
			err = cmd_file(cmd_file_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4701
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4702
		err = one_command_at_a_time(argc - optind, &(argv[optind]));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4703
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4704
	zonecfg_fini_handle(handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4705
	(void) del_GetLine(gl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4706
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4707
}