zonecfg.c revision 27e6fb2101ae37ba3de6dbb1567bf7558ffaccad
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER START
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Common Development and Distribution License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER END
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Use is subject to license terms.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#pragma ident "%Z%%M% %I% %E% SMI"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * zonecfg is a lex/yacc based command interpreter used to manage zone
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * configurations. The lexer (see zonecfg_lex.l) builds up tokens, which
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the grammar (see zonecfg_grammar.y) builds up into commands, some of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * which takes resources and/or properties as arguments. See the block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * comments near the end of zonecfg_grammar.y for how the data structures
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * which keep track of these resources and properties are built up.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The resource/property data structures are inserted into a command
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * structure (see zonecfg.h), which also keeps track of command names,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * miscellaneous arguments, and function handlers. The grammar selects
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the appropriate function handler, each of which takes a pointer to a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * command structure as its sole argument, and invokes it. The grammar
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * itself is "entered" (a la the Matrix) by yyparse(), which is called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * from read_input(), our main driving function. That in turn is called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * by one of do_interactive(), cmd_file() or one_command_at_a_time(), each
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * of which is called from main() depending on how the program was invoked.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The rest of this module consists of the various function handlers and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * their helper functions. Some of these functions, particularly the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * X_to_str() functions, which maps command, resource and property numbers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to strings, are used quite liberally, as doing so results in a better
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * program w/rt I18N, reducing the need for translation notes.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !defined(TEXT_DOMAIN) /* should be defined by cc -D */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it wasn't */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiextern int yyparse(void);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Each SHELP_ should be a simple string.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_ADD "add <resource-type>\n\t(global scope)\n" \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add <property-name> <property-value>\n\t(resource scope)"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_CREATE "create [-F] [ -a <path> | -b | -t <template> ]"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_EXPORT "export [-f output-file]"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_HELP "help [commands] [syntax] [usage] [<command-name>]"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_INFO "info [<resource-type> [property-name=property-value]*]"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_REMOVE "remove [-F] <resource-type> " \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "[ <property-name>=<property-value> ]*\n" \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "\t(global scope)\n" \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove <property-name> <property-value>\n" \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "\t(resource scope)"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_SELECT "select <resource-type> { <property-name>=" \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "<property-value> }"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define SHELP_SET "set <property-name>=<property-value>"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_ADD, "add", HELP_RES_PROPS, SHELP_ADD, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_CANCEL, "cancel", 0, SHELP_CANCEL, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_CLEAR, "clear", HELP_PROPS, SHELP_CLEAR, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_COMMIT, "commit", 0, SHELP_COMMIT, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_CREATE, "create", 0, SHELP_CREATE, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_DELETE, "delete", 0, SHELP_DELETE, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_EXPORT, "export", 0, SHELP_EXPORT, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_INFO, "info", HELP_RES_PROPS, SHELP_INFO, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_REMOVE, "remove", HELP_RES_PROPS, SHELP_REMOVE, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_REVERT, "revert", 0, SHELP_REVERT, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_SELECT, "select", HELP_RES_PROPS, SHELP_SELECT, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_SET, "set", HELP_PROPS, SHELP_SET, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { CMD_VERIFY, "verify", 0, SHELP_VERIFY, },
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* These *must* match the order of the RT_ define's from zonecfg.h */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic char *res_types[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "inherit-pkg-dir",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "dedicated-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "capped-memory",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "scheduling-class",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "capped-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* These *must* match the order of the PT_ define's from zonecfg.h */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic char *prop_types[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "importance",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "scheduling-class",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* These *must* match the order of the PROP_VAL_ define's from zonecfg.h */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic char *prop_val_types[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The various _cmds[] lists below are for command tab-completion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * remove has a space afterwards because it has qualifiers; the other commands
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * that have qualifiers (add, select, etc.) don't need a space here because
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * they have their own _cmds[] lists below.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *global_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *add_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add inherit-pkg-dir",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add device",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add dataset",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add dedicated-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add capped-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add capped-memory",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *clear_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear autoboot",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear pool",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear limitpriv",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear bootargs",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear scheduling-class",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear ip-type",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *remove_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove fs ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove inherit-pkg-dir ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove net ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove device ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove rctl ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove attr ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove dataset ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove dedicated-cpu ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove capped-cpu ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove capped-memory ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *select_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select fs ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select inherit-pkg-dir ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select net ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select device ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select rctl ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select attr ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select dataset ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select dedicated-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select capped-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "select capped-memory",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *set_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set zonename=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set zonepath=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set brand=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set autoboot=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set limitpriv=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set bootargs=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set scheduling-class=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set ip-type=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *info_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info inherit-pkg-dir ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info device ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info rctl ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info attr ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info dataset ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info capped-memory",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info dedicated-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info capped-cpu",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info zonename",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info zonepath",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info autoboot",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info limitpriv",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info bootargs",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info brand",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info scheduling-class",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info ip-type",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info max-lwps",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info max-shm-memory",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info max-shm-ids",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info max-msg-ids",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info max-sem-ids",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "info cpu-shares",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *fs_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add options ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove options ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set special=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *net_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set address=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set physical=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *ipd_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *device_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set match=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *attr_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set value=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *rctl_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "add value ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "remove value ",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *dataset_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *pset_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set ncpus=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set importance=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear importance",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *pcap_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set ncpus=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic const char *mcap_res_scope_cmds[] = {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set physical=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "set locked=",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear physical",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear swap",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "clear locked",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Global variables */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set early in main(), never modified thereafter, used all over the place */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set in main(), used all over the place */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* used all over the place */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* global brand operations */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set in modifying functions, checked in read_input() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set in yacc parser, checked in read_input() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set in main(), checked in lex error handler */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set in exit_func(), checked in read_input() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic bool time_to_exit = FALSE, force_exit = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* used in short_usage() and zerr() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* checked in read_input() and other places */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set and checked in initialize() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* initialized in do_interactive(), checked in initialize() */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set if configuring the global zone */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* set in main(), checked in multiple places */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic bool global_scope = TRUE; /* scope is outer/global or inner/resource */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int resource_scope; /* should be in the RT_ list from zonecfg.h */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic int end_op = -1; /* operation on end is either add or modify */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * These are for keeping track of resources as they are specified as part of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the multi-step process. They should be initialized by add_resource() or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * select_func() and filled in by add_property() or set_func().
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_fstab old_fstab, in_progress_fstab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_fstab old_ipdtab, in_progress_ipdtab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_nwiftab old_nwiftab, in_progress_nwiftab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_devtab old_devtab, in_progress_devtab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_rctltab old_rctltab, in_progress_rctltab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_attrtab old_attrtab, in_progress_attrtab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_dstab old_dstab, in_progress_dstab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_psettab old_psettab, in_progress_psettab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic struct zone_mcaptab old_mcaptab, in_progress_mcaptab;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic GetLine *gl; /* The gl_get_line() resource object */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void bytes_to_units(char *str, char *buf, int bufsize);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Functions begin here */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiinitial_match(const char *line1, const char *line2, int word_end)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (strncmp(line1, line2, word_end) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiadd_stuff(WordCompletion *cpl, const char *line1, const char **list,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (initial_match(line1, list[i], word_end)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = cpl_add_completion(cpl, line1, 0, word_end,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* ARGSUSED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The MAX/MIN tests below are to make sure we have at least
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * enough characters to distinguish from other prefixes (MAX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * but only check MIN(what we have, what we're checking).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strncmp(line, "add ", MAX(MIN(word_end, 4), 1)) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, add_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strncmp(line, "clear ", MAX(MIN(word_end, 6), 2)) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, clear_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strncmp(line, "select ", MAX(MIN(word_end, 7), 3)) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, select_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strncmp(line, "set ", MAX(MIN(word_end, 4), 3)) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, set_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strncmp(line, "remove ", MAX(MIN(word_end, 7), 1)) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, remove_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (strncmp(line, "info ", MAX(MIN(word_end, 5), 1)) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, info_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, global_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, fs_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, ipd_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, net_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, device_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, rctl_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, attr_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, dataset_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, pset_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, pcap_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (add_stuff(cpl, line, mcap_res_scope_cmds, word_end));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * For the main CMD_func() functions below, several of them call getopt()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * then check optind against argc to make sure an extra parameter was not
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * passed in. The reason this is not caught in the grammar is that the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * grammar just checks for a miscellaneous TOKEN, which is *expected* to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * be "-F" (for example), but could be anything. So (for example) this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * check will prevent "create bogus".
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < MAX_EQ_PROP_PAIRS; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi property_value_ptr_t pp = cmd->cmd_property_ptr[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (calloc(1, sizeof (complex_property_t)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchifree_complex(complex_property_ptr_t complex)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (calloc(1, sizeof (list_property_t)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (calloc(1, sizeof (struct zone_rctlvaltab)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert(res_type >= RT_MIN && res_type <= RT_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert(prop_type >= PT_MIN && prop_type <= PT_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert(pv_type >= PROP_VAL_MIN && pv_type <= PROP_VAL_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This is a separate function rather than a set of define's because of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * gettext() wrapping.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * TRANSLATION_NOTE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Each string below should have \t follow \n whenever needed; the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * initial \t and the terminal \n will be provided by the calling function.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi static char line[1024]; /* arbitrary large amount */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi assert(cmd_num >= CMD_MIN && cmd_num <= CMD_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "specified zone. %s should be\n\tused to "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "begin configuring a new zone. If overwriting an "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "existing\n\tconfiguration, the -F flag can be "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to force the action. If\n\t-t template is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "given, creates a configuration identical to the\n"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "\tspecified template, except that the zone name "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "is changed from\n\ttemplate to zonename. '%s -a' "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "creates a configuration from a\n\tdetached "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "zonepath. '%s -b' results in a blank "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "configuration.\n\t'%s' with no arguments applies "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "the Sun default settings."),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_to_str(CMD_CREATE), cmd_to_str(CMD_CREATE),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_to_str(CMD_CREATE), cmd_to_str(CMD_CREATE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Exits the program. The -F flag can "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "be used to force the action."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Prints configuration to standard "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "output, or to output-file if\n\tspecified, in "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "a form suitable for use in a command-file."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Add specified resource to "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "configuration."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Deletes the specified zone. The -F "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "flag can be used to force the\n\taction."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Remove specified resource from "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "configuration. The -F flag can be used\n\tto "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "force the action."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Resource modification is completed\n\twith the "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "command \"%s\". The property name/value pairs "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "must uniquely\n\tidentify a resource. Note that "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "the curly braces ('{', '}') mean one\n\tor more "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "of whatever is between them."),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Clears property values."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Displays information about the "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "current configuration. If resource\n\ttype is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "specified, displays only information about "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "resources of\n\tthe relevant type. If resource "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "id is specified, displays only\n\tinformation "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "about that resource."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Verifies current configuration "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "for correctness (some resource types\n\thave "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "required properties)."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Configuration must be committed to\n\tbe used by "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%s. Until the configuration is committed, "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "changes \n\tcan be removed with the %s "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "command. This operation is\n\tattempted "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "automatically upon completion of a %s "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "session."), "zoneadm", cmd_to_str(CMD_REVERT),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Reverts configuration back to the "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "last committed state. The -F flag\n\tcan be "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to force the action."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (gettext("Cancels resource/property "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "specification."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "specification."));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* NOTREACHED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Called with verbose TRUE when help is explicitly requested, FALSE for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * unexpected errors.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FILE *fp = verbose ? stdout : stderr, *newfp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* don't page error output */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("More help is available for the "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "following:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\n\tcommands ('%s commands')\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\tsyntax ('%s syntax')\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\tusage ('%s usage')\n\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("You may also obtain help on any "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "command by typing '%s <command-name>.'\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to configure a file-system.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_RAW), gettext("<raw-device>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_TYPE), gettext("<file-system type>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s %s\n", cmd_to_str(CMD_ADD),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_to_str(CMD_REMOVE), pt_to_str(PT_OPTIONS),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Consult the file-system "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "specific manual page, such as mount_ufs(1M), "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "for\ndetails about file-system options. Note "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "that any file-system options with an\nembedded "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "'=' character must be enclosed in double quotes, "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to configure a directory\ninherited from the "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "global zone into a non-global zone in read-only "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to configure a network interface.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_ADDRESS), gettext("<IP-address>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_PHYSICAL), gettext("<interface>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("See ifconfig(1M) for "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "details of the <interface> string.\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("%s %s is valid if the %s "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "property is set to %s, otherwise it must not be "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_to_str(CMD_SET), pt_to_str(PT_ADDRESS),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to configure a device node.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_MATCH), gettext("<device-path>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to configure a resource control.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s (%s=%s,%s=%s,%s=%s)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_PRIV), gettext("<priv-value>"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_ACTION), gettext("<action-value>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s (%s=%s,%s=%s,%s=%s)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_to_str(CMD_REMOVE), pt_to_str(PT_VALUE),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_PRIV), gettext("<priv-value>"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_ACTION), gettext("<action-value>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "%s\n\t%s := privileged\n"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("<priv-value>"), gettext("<action-value>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to configure a generic attribute.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=true | false\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=int\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_VALUE), gettext("<integer>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_VALUE), gettext("<unsigned integer>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to export ZFS datasets.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "configures the 'pools' facility to dedicate\na "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "subset of the system's processors to this zone "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "while it is running.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to set an upper limit (a cap) on the\n"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "percentage of CPU that can be used by this zone. "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "A '%s' value of 1\ncorresponds to one cpu. The "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "value can be set higher than 1, up to the total\n"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "number of CPUs on the system. The value can "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "also be less than 1,\nrepresenting a fraction of "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rt_to_str(resource_scope), pt_to_str(PT_NCPUS));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_NCPUS), gettext("<unsigned decimal>"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("The '%s' resource scope is "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "used to set an upper limit (a cap) on the\n"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "amount of physical memory, swap space and locked "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "memory that can be used by\nthis zone.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("Valid commands:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s %s=%s\n", cmd_to_str(CMD_SET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("And from any resource scope, you "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", cmd_to_str(CMD_END),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", cmd_to_str(CMD_CANCEL),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", cmd_to_str(CMD_EXIT),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "%s:\t%s %s\n", gettext("usage"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s -z <zone>\t\t\t(%s)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s -z <zone> <command>\n", execname);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s -z <zone> -f <command-file>\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "%s:\n\n", gettext("Commands"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i <= CMD_MAX; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "%s\n", helptab[i].short_usage);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\n\n", long_help(i));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "<zone> := [A-Za-z0-9][A-Za-z0-9_.-]*\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("\t(except the reserved words "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "'%s' and anything starting with '%s')\n"), "global",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("\tName must be less than %d characters.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("\n<net-addr> :="));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("\t<IPv4-address>[/<IPv4-prefix-length>] |\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("\t\t<IPv6-address>/<IPv6-prefix-length> |\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("\t\t<hostname>[/<IPv4-prefix-length>]\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("See inet(3SOCKET) for IPv4 and "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "IPv6 address syntax.\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("<IPv4-prefix-length> := [0-32]\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("<IPv6-prefix-length> := [0-128]\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("<hostname> := [A-Za-z0-9][A-Za-z0-9-.]*\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "<%s> := %s | %s | %s | %s | %s | %s |\n\t"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "%s | %s | %s | %s\n\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("resource type"), rt_to_str(RT_FS),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rt_to_str(RT_IPD), rt_to_str(RT_NET), rt_to_str(RT_DEVICE),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, gettext("For resource type ... there are "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "property types ...:\n"));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t\t%s, %s, %s, %s\n", rt_to_str(RT_FS),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", rt_to_str(RT_IPD),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t\t%s, %s\n", rt_to_str(RT_NET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_ADDRESS), pt_to_str(PT_PHYSICAL));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t\t%s\n", rt_to_str(RT_DEVICE),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t\t%s, %s\n", rt_to_str(RT_RCTL),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t\t%s, %s, %s\n", rt_to_str(RT_ATTR),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t\t%s\n", rt_to_str(RT_DATASET),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s, %s\n", rt_to_str(RT_DCPU),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_NCPUS), pt_to_str(PT_IMPORTANCE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s\n", rt_to_str(RT_PCAP),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(fp, "\t%s\t%s, %s, %s\n", rt_to_str(RT_MCAP),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pt_to_str(PT_PHYSICAL), pt_to_str(PT_SWAP),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* PRINTFLIKE1 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* lex_lineno has already been incremented in the lexer; compensate */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cmd_file_mode && lex_lineno > last_lineno) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(stderr, gettext("On line %d:\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(stderr, gettext("On line %d of %s:\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchizone_perror(char *prefix, int err, bool set_saw)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi zerr("%s: %s", prefix, zonecfg_strerror(err));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * zone_perror() expects a single string, but for remove and select
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we have both the command and the resource type, so this wrapper
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * function serves the same purpose in a slightly different way.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiz_cmd_rt_perror(int cmd_num, int res_num, int err, bool set_saw)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi zerr("%s %s: %s", cmd_to_str(cmd_num), rt_to_str(res_num),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* returns Z_OK if successful, Z_foo from <libzonecfg.h> otherwise */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (zonecfg_check_handle(handle) != Z_OK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((err = zonecfg_get_handle(zone, handle)) == Z_OK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((brand = brand_open(brandname)) == NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi zerr("Zone %s uses non-existent brand \"%s\"."
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (global_zone && err == Z_NO_ZONE && !got_handle &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * We implicitly create the global zone config if it
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * doesn't exist.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tmphandle = zonecfg_init_handle()) == NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi err = zonecfg_get_template_handle("SUNWblank", zone,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi zone_perror(zone, err, handle_expected || got_handle);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "configuring a new zone.\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((err = zone_get_state(zone, &state_num)) != Z_OK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* all states are greater than "non-existent" */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi zerr(gettext("Unexpectedly failed to determine state "
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "of zone %s: %s"), zone, zonecfg_strerror(err));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * short_usage() is for bad syntax: getopt() issues, too many arguments, etc.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* lex_lineno has already been incremented in the lexer; compensate */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gettext("syntax error on line %d of %s\n"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (void) fprintf(stderr, "%s:\n%s\n", gettext("usage"),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * long_usage() is for bad semantics: e.g., wrong property type for a given
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * resource type. It is also used by longer_usage() below.
if (set_saw)
if (!ok_to_prompt) {
return (Z_OK);
return (Z_ERR);
if (force) {
zone);
return (Z_OK);
zone);
return (TRUE);
if (read_only_mode) {
return (TRUE);
return (FALSE);
optind = 0;
!= EOF) {
switch (arg) {
sizeof (attach_path));
sizeof (zone_template));
sizeof (zone_template));
if (arg_err)
if (attach)
char *outstr;
return (outstr);
return (outstr);
char *quote_str;
char *limitpriv;
optind = 0;
switch (arg) {
if (arg_err)
goto done;
goto done;
switch (iptype) {
case ZS_SHARED:
case ZS_EXCLUSIVE:
goto done;
goto done;
goto done;
goto done;
goto done;
goto done;
goto done;
done:
if (need_to_close)
optind = 0;
switch (arg) {
if (arg_err)
return (Z_ERR);
return (Z_ERR);
return (Z_OK);
int type;
goto bad;
switch (type) {
case RT_FS:
case RT_IPD:
goto bad;
case RT_NET:
case RT_DEVICE:
case RT_RCTL:
if (global_zone)
case RT_ATTR:
case RT_DATASET:
case RT_DCPU:
goto bad;
Z_NO_ENTRY) {
goto bad;
goto bad;
case RT_PCAP:
goto bad;
case Z_ALIAS_DISALLOW:
FALSE);
goto bad;
case Z_OK:
goto bad;
case RT_MCAP:
== Z_OK ||
goto bad;
if (global_zone)
bad:
int err;
case PT_PRIV:
if (seen_priv) {
goto bad;
case PT_LIMIT:
if (seen_limit) {
goto bad;
case PT_ACTION:
if (seen_action) {
goto bad;
if (!seen_priv)
if (!seen_limit)
if (!seen_action)
goto bad;
goto bad;
bad:
char *prop_id;
switch (res_type) {
case RT_FS:
TRUE);
prop_id);
TRUE);
case RT_RCTL:
TRUE);
static boolean_t
static boolean_t
static boolean_t
int arg;
optind = 0;
switch (arg) {
if (arg_err)
if (global_scope) {
* the /etc/zones/<zonename.xml> file are not both present. In
optind = 0;
switch (arg) {
if (arg_err)
if (!force) {
if (got_handle) {
int err, i;
return (err);
return (Z_INSUFFICIENT_SPEC);
case PT_DIR:
case PT_SPECIAL:
case PT_RAW:
case PT_TYPE:
return (Z_INSUFFICIENT_SPEC);
if (fill_in_only)
return (Z_OK);
int err, i;
return (err);
return (Z_INSUFFICIENT_SPEC);
case PT_DIR:
return (Z_INSUFFICIENT_SPEC);
if (fill_in_only)
return (Z_OK);
int err, i;
return (err);
return (Z_INSUFFICIENT_SPEC);
case PT_ADDRESS:
case PT_PHYSICAL:
return (Z_INSUFFICIENT_SPEC);
if (fill_in_only)
return (Z_OK);
return (err);
int err, i;
return (err);
return (Z_INSUFFICIENT_SPEC);
case PT_MATCH:
return (Z_INSUFFICIENT_SPEC);
if (fill_in_only)
return (Z_OK);
return (err);
int err, i;
return (err);
return (Z_INSUFFICIENT_SPEC);
case PT_NAME:
return (Z_INSUFFICIENT_SPEC);
if (fill_in_only)
return (Z_OK);
return (err);
int err, i;
return (err);
return (Z_INSUFFICIENT_SPEC);
case PT_NAME:
case PT_TYPE:
case PT_VALUE:
return (Z_INSUFFICIENT_SPEC);
if (fill_in_only)
return (Z_OK);
return (err);
int err, i;
return (err);
return (Z_INSUFFICIENT_SPEC);
case PT_NAME:
return (Z_INSUFFICIENT_SPEC);
if (fill_in_only)
return (Z_OK);
int err;
static boolean_t
int num;
int answer;
int arg;
optind = 0;
switch (arg) {
if (arg_err)
return (B_FALSE);
if (num == 0) {
TRUE);
return (B_FALSE);
if (!interactive_mode) {
return (B_FALSE);
rsrc);
return (B_FALSE);
return (B_FALSE);
return (B_TRUE);
int err;
int err;
!= Z_OK)
int err;
int err;
int err;
int err;
int err;
int err;
int err;
!= Z_OK) {
!= Z_OK) {
if (revert)
int type;
int arg;
optind = 0;
switch (arg) {
if (arg_err)
switch (type) {
case RT_FS:
case RT_IPD:
case RT_NET:
case RT_DEVICE:
case RT_RCTL:
case RT_ATTR:
case RT_DATASET:
case RT_DCPU:
remove_pset();
case RT_PCAP:
remove_pcap();
case RT_MCAP:
remove_mcap();
char *prop_id;
switch (res_type) {
case RT_FS:
TRUE);
prop_id);
TRUE);
case RT_RCTL:
TRUE);
case PT_PRIV:
case PT_LIMIT:
case PT_ACTION:
if (global_scope) {
switch (res_type) {
case RT_FS:
case RT_DCPU:
case RT_MCAP:
switch (prop_type) {
case PT_PHYSICAL:
case PT_SWAP:
case PT_LOCKED:
switch (type) {
case PT_ZONENAME:
case PT_ZONEPATH:
case PT_BRAND:
case PT_AUTOBOOT:
case PT_POOL:
case PT_LIMITPRIV:
case PT_BOOTARGS:
case PT_SCHED:
case PT_IPTYPE:
case PT_MAXLWPS:
case PT_MAXSHMMEM:
case PT_MAXSHMIDS:
case PT_MAXMSGIDS:
case PT_MAXSEMIDS:
case PT_SHARES:
if (global_scope) {
if (global_scope) {
switch (type) {
case RT_FS:
sizeof (struct zone_fstab));
case RT_IPD:
sizeof (struct zone_fstab));
case RT_NET:
sizeof (struct zone_nwiftab));
case RT_DEVICE:
sizeof (struct zone_devtab));
case RT_RCTL:
sizeof (struct zone_rctltab));
case RT_ATTR:
sizeof (struct zone_attrtab));
case RT_DATASET:
sizeof (struct zone_dstab));
case RT_DCPU:
sizeof (struct zone_psettab));
case RT_PCAP:
!= Z_OK) {
case RT_MCAP:
!= Z_OK &&
!= Z_OK) {
TRUE);
sizeof (struct zone_mcaptab));
sizeof (in_progress_mcaptab));
int prefixlen, i;
return (Z_ERR);
return (Z_ERR);
return (Z_OK);
return (Z_ERR);
return (Z_OK);
part1);
return (Z_ERR);
return (Z_ERR);
return (Z_OK);
return (Z_OK);
return (Z_ERR);
static boolean_t
return (B_FALSE);
return (B_FALSE);
return (B_TRUE);
static boolean_t
return (B_FALSE);
return (B_FALSE);
if (!ret)
return (ret);
int err;
s = tmp;
!= Z_OK) {
char *prop_id;
float cap;
char *unitp;
switch (arg) {
if (arg_err)
if (global_scope) {
if (force_set) {
if (!zonecfg_in_alt_root()) {
switch (res_type) {
case RT_ZONENAME:
case RT_ZONEPATH:
case RT_BRAND:
case RT_AUTOBOOT:
case RT_POOL:
case RT_LIMITPRIV:
case RT_BOOTARGS:
case RT_SCHED:
case RT_IPTYPE:
case RT_MAXLWPS:
case RT_MAXSHMMEM:
case RT_MAXSHMIDS:
case RT_MAXMSGIDS:
case RT_MAXSEMIDS:
case RT_SHARES:
case RT_FS:
switch (prop_type) {
case PT_DIR:
case PT_SPECIAL:
case PT_RAW:
case PT_TYPE:
case PT_OPTIONS:
case RT_IPD:
switch (prop_type) {
case PT_DIR:
case RT_NET:
switch (prop_type) {
case PT_ADDRESS:
case PT_PHYSICAL:
TRUE);
case RT_DEVICE:
switch (prop_type) {
case PT_MATCH:
TRUE);
case RT_RCTL:
switch (prop_type) {
case PT_NAME:
case PT_VALUE:
TRUE);
case RT_ATTR:
switch (prop_type) {
case PT_NAME:
case PT_TYPE:
case PT_VALUE:
TRUE);
case RT_DATASET:
switch (prop_type) {
case PT_NAME:
case RT_DCPU:
switch (prop_type) {
case PT_NCPUS:
(void) strlcpy(
(void) strlcpy(
case PT_IMPORTANCE:
case RT_PCAP:
TRUE);
case RT_MCAP:
switch (prop_type) {
case PT_PHYSICAL:
case PT_SWAP:
if (global_zone)
buf);
case PT_LOCKED:
TRUE);
char *qstr;
qstr);
} else if (print_notspec)
zonename);
zonepath);
brand);
int err;
int err;
char *limitpriv;
int err;
int err;
bootargs);
int err;
== Z_OK) {
int err;
switch (iptype) {
case ZS_SHARED:
case ZS_EXCLUSIVE:
goto loopend;
goto loopend;
scaled);
unsigned long long num;
unsigned long long save = 0;
*up);
&locked_limit);
char *pager;
int type;
if (interactive_mode) {
if (!global_scope) {
switch (resource_scope) {
case RT_FS:
case RT_IPD:
case RT_NET:
case RT_DEVICE:
case RT_RCTL:
case RT_ATTR:
case RT_DATASET:
case RT_DCPU:
case RT_PCAP:
case RT_MCAP:
&swap_limit);
goto cleanup;
goto cleanup;
goto cleanup;
case RT_UNKNOWN:
if (!global_zone) {
if (!global_zone) {
if (!global_zone) {
if (!global_zone) {
case RT_ZONENAME:
case RT_ZONEPATH:
case RT_BRAND:
case RT_AUTOBOOT:
case RT_POOL:
case RT_LIMITPRIV:
case RT_BOOTARGS:
case RT_SCHED:
case RT_IPTYPE:
case RT_MAXLWPS:
case RT_MAXSHMMEM:
case RT_MAXSHMIDS:
case RT_MAXMSGIDS:
case RT_MAXSEMIDS:
case RT_SHARES:
case RT_FS:
case RT_IPD:
case RT_NET:
case RT_DEVICE:
case RT_RCTL:
case RT_ATTR:
case RT_DATASET:
case RT_DCPU:
case RT_PCAP:
case RT_MCAP:
TRUE);
if (need_to_close)
int status;
int err;
return (Z_INVALID_DOCUMENT);
return (Z_INVALID_DOCUMENT);
return (Z_INVALID_DOCUMENT);
return (Z_OK);
return (Z_TEMP_FILE);
return (err);
int pset_res;
optind = 0;
switch (arg) {
if (arg_err)
!global_zone) {
&ret_val);
switch (iptype) {
case ZS_SHARED:
case ZS_EXCLUSIVE:
&ret_val);
&ret_val);
&ret_val);
&ret_val);
if (!global_scope) {
if (save) {
sizeof (revert_zone));
int arg;
optind = 0;
switch (arg) {
if (arg_err)
if (global_scope)
return (Z_INVAL);
return (Z_INVAL);
return (Z_OK);
return (Z_OK);
return (Z_ERR);
return (Z_OK);
return (Z_ERR);
return (Z_OK);
return (Z_ERR);
return (Z_OK);
return (Z_ERR);
return (Z_ERR);
return (Z_ERR);
return (Z_OK);
optind = 0;
switch (arg) {
if (arg_err)
if (global_scope) {
switch (resource_scope) {
case RT_FS:
if (validation_failed) {
case RT_IPD:
if (validation_failed) {
case RT_NET:
if (validation_failed) {
case RT_DEVICE:
if (validation_failed) {
case RT_RCTL:
if (validation_failed) {
case RT_ATTR:
Z_OK)
if (validation_failed) {
case RT_DATASET:
if (validation_failed)
case RT_DCPU:
case RT_PCAP:
!= Z_OK) {
case RT_MCAP:
&swap_limit);
&locked_limit);
char *endp;
TRUE);
int arg;
optind = 0;
switch (arg) {
if (arg_err)
optind = 0;
switch (arg) {
if (arg_err)
if (!force) {
for (i = 0; i <= CMD_MAX; i++) {
longer_usage(i);
return (Z_ERR);
return (Z_ERR);
return (Z_ERR);
return (Z_OK);
cleanup()
int answer;
if (!global_scope) {
if (!time_to_exit) {
return (Z_ERR);
return (Z_REPEAT);
return (Z_ERR);
if (need_to_commit) {
if (force_exit) {
return (Z_ERR);
return (Z_ERR);
return (Z_REPEAT);
if (yyin_is_a_tty) {
if (newline_terminated) {
if (global_scope)
yyparse();
yyparse();
return (cleanup());
do_interactive(void)
int err;
if (!read_only_mode) {
return (err);
int err;
if (using_real_file) {
return (Z_ERR);
goto done;
goto done;
done:
if (using_real_file)
return (err);
char *command;
int i, err;
for (i = 0; i < argc; i++)
return (Z_ERR);
return (err);
yyparse();
return (cleanup());
return (execbasename);
execname);
switch (arg) {
optarg);
optarg);
if (!cmd_file_mode)
return (err);