Current File : //usr/include/libzonecfg.h
/*
 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _LIBZONECFG_H
#define	_LIBZONECFG_H

/*
 * INTERFACES DEFINED IN THIS FILE DO NOT CONSTITUTE A PUBLIC INTERFACE.
 *
 * Do not consume these interfaces; your program will break in the future
 * (even in a patch) if you do.
 */

/*
 * Zone configuration header file.
 */

#ifdef __cplusplus
extern "C" {
#endif

/* sys/socket.h is required by net/if.h, which has a constant needed here */
#include <sys/param.h>
#include <sys/fstyp.h>
#include <sys/mount.h>
#include <priv.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <net/if.h>
#include <stdio.h>
#include <rctl.h>
#include <zone.h>
#include <sys/uuid.h>
#include <sys/mnttab.h>
#include <limits.h>
#include <utmpx.h>
#include <sys/mac.h>
#include <sys/mac_flow.h>
#include <suri.h>
#include <sys/list.h>
#include <libibadm.h>
#include <openssl/x509.h>

#define	MAX_NESTED_RESOURCES 4

#define	ZONE_ID_UNDEFINED	-1

/*
 * WARNING: do not renumber or remove these: they form part of the stable API
 * that RAD uses.
 */
#define	Z_OK			0
#define	Z_EMPTY_DOCUMENT	1	/* XML doc root element is null */
#define	Z_WRONG_DOC_TYPE	2	/* top-level XML doc element != zone */
#define	Z_BAD_PROPERTY		3	/* libxml-level property problem */
#define	Z_TEMP_FILE		4	/* problem creating temporary file */
#define	Z_SAVING_FILE		5	/* libxml error saving or validating */
#define	Z_NO_ENTRY		6	/* no such entry */
#define	Z_BOGUS_ZONE_NAME	7	/* illegal zone name */
#define	Z_REQD_RESOURCE_MISSING	8	/* required resource missing */
#define	Z_REQD_PROPERTY_MISSING	9	/* required property missing */
#define	Z_BAD_HANDLE		10	/* bad document handle */
#define	Z_NOMEM			11	/* out of memory (like ENOMEM) */
#define	Z_INVAL			12	/* invalid argument (like EINVAL) */
#define	Z_ACCES			13	/* permission denied (like EACCES) */
#define	Z_TOO_BIG		14	/* string won't fit in char array */
#define	Z_MISC_FS		15	/* miscellaneous file-system error */
#define	Z_NO_ZONE		16	/* no such zone */
#define	Z_NO_RESOURCE_TYPE	17	/* no/wrong resource type */
#define	Z_NO_RESOURCE_ID	18	/* no/wrong resource id */
#define	Z_NO_PROPERTY_TYPE	19	/* no/wrong property type */
#define	Z_NO_PROPERTY_ID	20	/* no/wrong property id */
#define	Z_BAD_ZONE_STATE	21	/* zone state invalid for given task */
#define	Z_INVALID_DOCUMENT	22	/* libxml can't validate against DTD */
#define	Z_NAME_IN_USE		23	/* zone name already in use (rename) */
#define	Z_NO_SUCH_ID		24	/* delete_index: no old ID */
#define	Z_UPDATING_INDEX	25	/* add/modify/delete_index problem */
#define	Z_LOCKING_FILE		26	/* problem locking index file */
#define	Z_UNLOCKING_FILE	27	/* problem unlocking index file */
#define	Z_SYSTEM		28	/* consult errno instead */
#define	Z_INSUFFICIENT_SPEC	29	/* resource insufficiently specified */
#define	Z_RESOLVED_PATH		34	/* resolved path mismatch */
#define	Z_IPV6_ADDR_PREFIX_LEN	35	/* IPv6 address prefix length needed */
#define	Z_BOGUS_ADDRESS		36	/* not IPv[4|6] address or host name */
#define	Z_PRIV_PROHIBITED	37	/* specified privilege is prohibited */
#define	Z_PRIV_REQUIRED		38	/* required privilege is missing */
#define	Z_PRIV_UNKNOWN		39	/* specified privilege is unknown */
#define	Z_BRAND_ERROR		40	/* brand-specific error */
#define	Z_INCOMPATIBLE		41	/* incompatible settings */
#define	Z_ALIAS_DISALLOW	42	/* rctl alias disallowed */
#define	Z_CLEAR_DISALLOW	43	/* clear property disallowed */
#define	Z_POOL			44	/* generic libpool error */
#define	Z_POOLS_NOT_ACTIVE	45	/* pool service not enabled */
#define	Z_POOL_ENABLE		46	/* pools enable failed */
#define	Z_NO_POOL		47	/* no such pool configured */
#define	Z_POOL_CREATE		48	/* pool create failed */
#define	Z_POOL_BIND		49	/* pool bind failed */
#define	Z_INVALID_PROPERTY	50	/* invalid property value */
#define	Z_POSSIBLE_CONFLICT	51	/* possible conflicts in /dev/zvol */
#define	Z_STORAGE_MISC		52	/* misc. storage resource error */
#define	Z_STORAGE_INUSE		53	/* storage resource in use */
#define	Z_STORAGE_AGAIN		54	/* like EAGAIN */
#define	Z_DUP_PROPERTY		55	/* duplicate property value */
#define	Z_BRAND_FIXED_CFG	56	/* the property has been fixed */
#define	Z_BRAND_DISABLED_CFG	57	/* the res/prop has been disabled */
#define	Z_BRAND_DISABLED_VAL	58	/* the prop val has been disabled */
#define	Z_STALE_CFG		59	/* zone cfg externally modified */
#define	Z_UNIFIED_ARCHIVE	60	/* ua_log() has already handled error */
#define	Z_LIVE_DISABLED_CFG	61	/* live mode does not support res */
#define	Z_LIVE_DISABLED_VAL	62	/* live mode does not support value */
#define	Z_DUP_RESOURCE		63	/* resource already exists */
#define	Z_GPT_PARTITION		64	/* unable to find gpt partition */
#define	Z_NO_ENTROPY		65	/* /dev/random is empty */

/*
 * Zone states, as seen from user space
 *
 * When adding, removing, or changing state definitions, consider the following:
 *
 * 1.  Contracts exist on zone_get_state() which returns these state numbers.
 *     The suggested mechanism for libzonecfg contract consumers to determine
 *     the state is by using get_zone_state_str().  Alternatively, the value
 *     returned from zone_get_state() may be treated as an opaque value that is
 *     passed to zone_state_str().  The values returned by get_zone_state_str()
 *     and zone_state_str() are the same string as is returned in the state
 *     field of zoneadm(1M)'s list subcommand's output.
 * 2.  State numbers are passed to brand scripts.  As states are added or
 *     removed, brand scripts may require updates.  Pay particular attention
 *     to usr/src/lib/brand/<brands>/zone/{pre,post}state.ksh.
 * 3.  When adding states, update zone_states array in libzonecfg.c.
 */
typedef enum {
	ZONE_STATE_CONFIGURED = 0,
	ZONE_STATE_INCOMPLETE,
	ZONE_STATE_UNAVAILABLE,
	ZONE_STATE_INSTALLED,
	ZONE_STATE_READY,
	ZONE_STATE_RUNNING,
	ZONE_STATE_SHUTTING_DOWN,
	ZONE_STATE_DOWN,
	ZONE_STATE_MOUNTED,
	/* Not actually a state, used as a flag.  Must be last. */
	ZONE_STATE_INVALID
} zone_state_t;

#define	ZONE_STATE_MAXSTRLEN	14

#define	ZONE_KEY_BITS		128
/* Key is base64 encoded and starts with "{base64}". See sasl_encode64(). */
#define	ZONE_KEY_MAXSTRLEN	(9 + ((ZONE_KEY_BITS / 8 + 2) / 3 * 4))
#define	ZONE_CRYPT_MAC_SIZE	16

#define	LIBZONECFG_PATH		"libzonecfg.so.1"

#define	ZONE_CONFIG_ROOT	"/etc/zones"
#define	ZONE_INDEX_FILE		ZONE_CONFIG_ROOT "/index"
#define	ZONE_KEY_DIR		ZONE_CONFIG_ROOT "/keys"

#define	MAXUSERNAME		MAXNAMELEN
#define	MAXAUTHS		4096

/* Owner, group, and mode (defined by packaging) for the config directory */
#define	ZONE_CONFIG_UID		0		/* root */
#define	ZONE_CONFIG_GID		3		/* sys */
#define	ZONE_CONFIG_MODE	0755

/* Owner, group, and mode (defined by packaging) for the index file */
#define	ZONE_INDEX_UID		0		/* root */
#define	ZONE_INDEX_GID		3		/* sys */
#define	ZONE_INDEX_MODE		0644

/*
 * Reserved zone root zpool/dataset name, used in zonecfg and zoneadm.
 */
#define	ZONE_RZPNAME		"rpool"

/*
 * Shortened alias names for the zones rctls.
 */
#define	ALIAS_MAXLWPS		"max-lwps"
#define	ALIAS_MAXSHMMEM		"max-shm-memory"
#define	ALIAS_MAXSHMIDS		"max-shm-ids"
#define	ALIAS_MAXMSGIDS		"max-msg-ids"
#define	ALIAS_MAXSEMIDS		"max-sem-ids"
#define	ALIAS_MAXLOCKEDMEM	"locked"
#define	ALIAS_MAXSWAP		"swap"
#define	ALIAS_SHARES		"cpu-shares"
#define	ALIAS_CPUCAP		"cpu-cap"
#define	ALIAS_MAXPROCS		"max-processes"

/* Default name for zone detached manifest */
#define	ZONE_DETACHED_CFG_NAME	"SUNWdetached.xml"

/* Default name for suspended boot snapshot */
#define	ZONE_SUSPENDED_CFG_NAME	"SUNWsuspended.xml"

/*
 * Bit flag definitions for passing into libzonecfg functions.
 */
#define	ZONE_DRY_RUN		0x01

/* Length of annotations which do not carry path. */
#define	DEVANN_LEN		128

/* The empty string and "none" are equivalent and indicate a r/w zone. */
#define	ZONECFG_READ_WRITE_PROFNAME(prof)	\
	((prof)[0] == '\0' || strcmp((prof), "none") == 0)

/*
 * Macros representing max. sizes for net and anet resource properties
 */

/*
 * Our limit of 50 allowed-addresses should be more than enough. Generally,
 * users may need at most two allowed-addresses. Same for default routers.
 */
#define	ALLOWED_ADDRS_BUFSZ	(50 * INET6_ADDRSTRLEN)
#define	DEFROUTERS_BUFSZ	ALLOWED_ADDRS_BUFSZ

/* Allow at the most 20 allowed-dhcp-cids. */
#define	ALLOWED_DHCP_CIDS_BUFSZ	(20 * MPT_MAXCIDLEN)

/*
 * Today we have 4 protection. Our limit of 256 is more than
 * enough to handle them.
 */
#define	MAX_LINK_PROTECTIONS	256

/*
 * Properties such priority, vlan-id, mtu, maxbw, rings are eventually
 * stored as uint64_t.
 */
#define	MAX_NET_UINT64_STR	23

#define	ALLOWED_VLANID_ANY_KEY	"any"

/* World Wide Name length */
#define	VPORT_WWN_LEN		16
#define	VPORT_WWN_STR_LEN	(VPORT_WWN_LEN + 1)
/* Maximum FC controller name length */
#define	VPORT_MAX_CONTROLLER_LEN	8

/* Allow 64 MAC addresses per anet. */
#define	MAC_ADDRESSES_PER_ANET	64
/* Size required to store up to 64 MAC addresses or keywords. */
/* +1 for the seperating comma. */
#define	MAC_ADDRESSES_BUFSIZ	(MAC_ADDRESSES_PER_ANET * (MAXMACADDRLEN + 1))
/* Size required to store up to 64 factory MAC address slots. */
/* +1 for the seperating comma. */
#define	MAC_SLOT_BUFSIZ	(MAC_ADDRESSES_PER_ANET * (MAX_NET_UINT64_STR + 1))
/* Maximum length of allowed-mac-address */
#define	MAX_ALLOWED_MAC_ADDRESS_LEN	5
#define	MACADDR_STRSIZE	18

#define	ALLOWED_MACADDR_ANY_KEY	"any"
#define	ALLOWED_MACADDR_ANY_VAL	"00:00:00:00:00:00"

/*
 * pkey string is made up of "0x", followed by pkey in hex (maximum of 4
 * characters), followed by '\0'.
 */
#define	MAX_PKEY_STR		7

#define	MAX_UINT32_STRLEN	11 /* 10 (MAX_UINT32 = 4294967295) + 1 (\0) */

/* linkmode is set to either "cm" or "ud" */
#define	MAX_LINKMODE_STR	3

#define	LINKMODE_CM		"cm"	/* IB connected mode */
#define	LINKMODE_UD		"ud"	/* IB unreliable datagram mode */

/* vboot policy is set to either "none", "warning" or "enforce" */
#define	MAXPOLICYLEN		8

/* Nesting Levels with resources */
#define	GLOBAL_RESOURCE		(-1)
#define	NON_NESTED_RESOURCE	0
#define	LEVEL1_NESTED_RESOURCE	1

#define	ARRAY_SIZE(a)	(sizeof (a) / sizeof ((a)[0]))
/* Template tokens and correspoding values */
#define	TOK_ZONENAME		("%{zonename}")
#define	TOK_RESOURCEID		("%{resource-id}")
#define	TOK_NETWORKID		("%{network-id}")
#define	TOK_ID			("%{id}")
#define	TOK_GLOBAL_ROOTZPOOL	("%{global-rootzpool}")
#define	TOK_PWWN		("%{pwwn}")

#define	CFGTOK_NONE			0x0
#define	CFGTOK_ZONENAME			0x1
#define	CFGTOK_RESOURCEID		0x2
#define	CFGTOK_NETWORKID		0x4
#define	CFGTOK_ID			0x8
#define	CFGTOK_GLOBAL_ROOTZPOOL		0x10
#define	CFGTOK_PWWN			0x20

#define	CFGTOK_MAX		CFGTOK_PWWN
#define	CFGTOK_ALL		(((uint64_t)1 << (CFGTOK_MAX)) - 1)
#define	CFGTOK_ALL_BUT_ID	((CFGTOK_ALL) & (~(CFGTOK_ID)))
#define	CFGTOK_ALL_BUT(exclude)	((CFGTOK_ALL) & (~(exclude)))

/*
 * This structure represents information for a single entry in the
 * /etc/zones/index file.
 * The integer field expresses the current values on a get.
 * On a put, it represents the new values if >= 0 or "don't change" if < 0.
 */
struct zoneent {
	char	zone_name[ZONENAME_MAX];	/* name of the zone */
	int	zone_state;	/* configured | incomplete | installed */
	char	zone_path[MAXPATHLEN];		/* path to zone storage */
	uuid_t	zone_uuid;			/* unique ID for zone */
	char	zone_newname[ZONENAME_MAX];	/* for doing renames */
};

typedef struct zone_dochandle *zone_dochandle_t;	/* opaque handle */

typedef struct zone_fsopt {
	struct zone_fsopt *zone_fsopt_next;
	char		   zone_fsopt_opt[MAX_MNTOPT_STR];
} zone_fsopt_t;

typedef struct zone_fstab {
	char		zone_fs_special[MAXPATHLEN]; 	/* special file */
	char		zone_fs_dir[MAXPATHLEN];	/* mount point */
	char		zone_fs_type[FSTYPSZ];		/* e.g. ufs */
	zone_fsopt_t   *zone_fs_options;		/* mount options */
	char		zone_fs_raw[MAXPATHLEN];	/* device to fsck */
	char		zone_fs_tmp_id[MAX_UINT32_STRLEN];
} zone_fstab_t;

typedef struct zone_nettab {
	char	zone_net_address[INET6_ADDRSTRLEN]; /* shared-ip only */
	char	zone_net_allowed_addr[ALLOWED_ADDRS_BUFSZ]; /* excl-ip only */
	char	zone_net_physical[LIFNAMSIZ];
	char	zone_net_defrouter[DEFROUTERS_BUFSZ];
	char	zone_net_configure_allowed_addr[6];	/* "true" or "false" */
	/* used as annotation so sized for convenience */
	char	zone_net_id[DEVANN_LEN];
	char	zone_net_tmp_id[MAX_UINT32_STRLEN];
} zone_nettab_t;

typedef struct zone_allowed_macaddr {
	char		allowed_maddrstr[MACADDR_STRSIZE];
	list_node_t	list_node;
} zone_allowed_macaddr_t;

typedef struct zone_anetmactab {
	char	zone_anetmac_auto_mac_addr[MAC_ADDRESSES_BUFSIZ];
	char	zone_anetmac_mac_addr[MAC_ADDRESSES_BUFSIZ];
	char	zone_anetmac_mac_prefix[MAC_ADDRESSES_BUFSIZ];
	/* used as annotation so sized for convenience */
	char	zone_anetmac_id[DEVANN_LEN];
	char	zone_anetmac_tmp_id[MAX_UINT32_STRLEN];
	list_t  zone_anetmac_allowed_macaddr;
	list_node_t list_node;
} zone_anetmactab_t;

typedef struct zone_allowed_vid_range_s {
	uint16_t avr_min;
	uint16_t avr_max;
} zone_allowed_vid_range_t;

typedef struct zone_allowed_vids {
	char		allowed_vidstr[MAX_UINT32_STRLEN];
	zone_allowed_vid_range_t allowed_vidrange;
	list_node_t	list_node;
} zone_allowed_vids_t;

typedef struct zone_anetvlantab {
	char	zone_anetvlan_vlan_id[MAX_NET_UINT64_STR];
	char	zone_anetvlan_tmp_id[MAX_UINT32_STRLEN];
	list_t  zone_anetvlan_allowed_vids;
	list_node_t list_node;
} zone_anetvlantab_t;

/*
 * Since iov is incompatible with most anet properties, whoever adds new
 * field(s) to this structure must also update vplat.c:validate_iov_properties()
 * if necessary.
 * Since evs and vport are incompatible with most anet properties,
 * whoever adds new field(s) to this structure must also update
 * zonecfg_manip.c:validate_evs_properties() if necessary.
 */
typedef struct zone_anettab {
	char	zone_anet_linkname[MAXLINKNAMELEN];
	char	zone_anet_lower_link[MAXLINKNAMELEN];
	char	zone_anet_allowed_addr[ALLOWED_ADDRS_BUFSZ];
	char	zone_anet_defrouter[DEFROUTERS_BUFSZ];
	char	zone_anet_configure_allowed_addr[6];	/* "true" or "false" */
	char	zone_anet_allowed_dhcp_cids[ALLOWED_DHCP_CIDS_BUFSZ];
	char	zone_anet_link_protection[MAX_LINK_PROTECTIONS];
	char	zone_anet_auto_mac_addr[MAC_ADDRESSES_BUFSIZ];
	char	zone_anet_mac_addr[MAC_ADDRESSES_BUFSIZ];
	char	zone_anet_mac_prefix[MAC_ADDRESSES_BUFSIZ];
	char	zone_anet_mac_slot[MAC_SLOT_BUFSIZ];
	char	zone_anet_vlan_id[MAX_NET_UINT64_STR];
	char	zone_anet_priority[MAX_NET_UINT64_STR];
	char	zone_anet_rxrings[MAX_NET_UINT64_STR];
	char	zone_anet_txrings[MAX_NET_UINT64_STR];
	char	zone_anet_maxbw[MAX_NET_UINT64_STR];
	char	zone_anet_mtu[MAX_NET_UINT64_STR];
	char	zone_anet_rxfanout[MAX_NET_UINT64_STR];
	char	zone_anet_vsitypeid[MAX_NET_UINT64_STR];
	char	zone_anet_vsivers[MAX_NET_UINT64_STR];
	char	zone_anet_vsimgrid[MAX_NET_UINT64_STR];
	char	zone_anet_etsbwlcl[MAX_NET_UINT64_STR];
	char	zone_anet_cos[MAX_NET_UINT64_STR];
	char	zone_anet_pkey[MAX_PKEY_STR];
	char	zone_anet_linkmode[MAX_LINKMODE_STR];
	char	zone_anet_evs[MAXNAMELEN];
	char	zone_anet_vport[MAXNAMELEN];
	char	zone_anet_iov[MAXNAMELEN];
	char	zone_anet_lro[8];	/* "on", "off" or "auto" */

	/* used as annotation so sized for convenience */
	char	zone_anet_id[DEVANN_LEN];
	char	zone_anet_tmp_id[MAX_UINT32_STRLEN];
	list_t  zone_anet_macs;
	char	zone_anet_bwshare[MAX_NET_UINT64_STR];
	list_t  zone_anet_vlans;
} zone_anettab_t;

#define	MAX_PORT_PER_IB 2
#define	MAXOVERHCALEN 150
#define	MAX_PROPS_PER_PORT 64
#define	MAXSMIENABLEDLEN 9

struct zone_ibporttab {
	char zone_ibport_pkey[MAX_PROPS_PER_PORT * MAX_PKEY_STR];
	char zone_ibport_id[DEVANN_LEN];
	char zone_ibport_tmp_id[MAX_UINT32_STRLEN];
	list_node_t list_node;
};

struct zone_ibtab {
	char zone_ib_overhca[MAXOVERHCALEN];
	char zone_ib_smi_enabled[MAXSMIENABLEDLEN];
	char zone_ib_vhca[MAXOVERHCALEN];
	char zone_ib_id[DEVANN_LEN];
	char zone_ib_tmp_id[MAX_UINT32_STRLEN];
	list_t zone_ib_port;
};

typedef struct zone_devtab {
	char	zone_dev_match[MAXPATHLEN];
	char	zone_dev_storage[SURI_MAX_URI_LEN];
	char	zone_dev_create_size[SURI_MAX_UINT64_LEN];
	int	zone_dev_flags;
	/* these four used as annotation so sized for convenience */
	char	zone_dev_direct_io[SURI_MAX_URI_LEN];
	char	zone_dev_partition[DEVANN_LEN];
	char	zone_dev_raw_io[DEVANN_LEN];
	char	zone_dev_id[DEVANN_LEN];
	char	zone_dev_bootpri[DEVANN_LEN];
	char	zone_dev_tmp_id[MAX_UINT32_STRLEN];
} zone_devtab_t;

typedef struct zone_rctlvaltab {
	char	zone_rctlval_priv[MAXNAMELEN];
	char	zone_rctlval_limit[MAXNAMELEN];
	char	zone_rctlval_action[MAXNAMELEN];
	struct zone_rctlvaltab *zone_rctlval_next;
} zone_rctlvaltab_t;

typedef struct zone_rctltab {
	char	zone_rctl_name[MAXNAMELEN];
	char	zone_rctl_tmp_id[MAX_UINT32_STRLEN];
	struct zone_rctlvaltab *zone_rctl_valptr;
} zone_rctltab_t;

typedef struct zone_attrtab {
	char	zone_attr_name[MAXNAMELEN];
	char	zone_attr_type[MAXNAMELEN];
	char	zone_attr_value[2 * BUFSIZ];
	char	zone_attr_tmp_id[MAX_UINT32_STRLEN];
} zone_attrtab_t;

typedef struct zone_dstab {
	char	zone_dataset_name[MAXNAMELEN];
	char	zone_dataset_alias[MAXNAMELEN];
	char	 zone_dataset_tmp_id[MAX_UINT32_STRLEN];
} zone_dstab_t;

typedef struct zone_psettab {
	char	zone_ncpu_min[MAXNAMELEN];
	char	zone_ncpu_max[MAXNAMELEN];
	char	zone_cpus[MAXNAMELEN];
	char	zone_cores[MAXNAMELEN];
	char	zone_sockets[MAXNAMELEN];
	char	zone_importance[MAXNAMELEN];
} zone_psettab_t;

typedef struct zone_mcaptab {
	char	zone_physmem_cap[MAXNAMELEN];
	char	zone_physmem_pgsz_policy[MAXNAMELEN]; /* kernel zones only */
} zone_mcaptab_t;

typedef struct zone_devpermtab {
	char	zone_devperm_name[MAXPATHLEN];
	uid_t	zone_devperm_uid;
	gid_t	zone_devperm_gid;
	mode_t	zone_devperm_mode;
	char	*zone_devperm_acl;
} zone_devpermtab_t;

typedef struct zone_admintab {
	char	zone_admin_user[MAXUSERNAME];
	char	zone_admin_auths[MAXAUTHS];
	char	zone_admin_tmp_id[MAX_UINT32_STRLEN];
} zone_admintab_t;

typedef struct zone_vcputab {
	char	zone_ncpu_min[MAXNAMELEN];
	char	zone_ncpu_max[MAXNAMELEN];
} zone_vcputab_t;

typedef struct zone_userauths {
	char			user[MAXUSERNAME];
	char			zonename[ZONENAME_MAX];
	struct zone_userauths	*next;
} zone_userauths_t;

typedef	struct	zone_storage {
	char	zone_storage_uri[SURI_MAX_URI_LEN];	/* URI string */
	struct	zone_storage	*zone_storage_next;
} zone_storage_t;

typedef	struct	zone_rzptab {
	char		zone_rzp_create_size[SURI_MAX_UINT64_LEN];
	zone_storage_t	*zone_storage_list;
} zone_rzptab_t;

typedef	struct	zone_zptab {
	char		zone_zp_create_size[SURI_MAX_UINT64_LEN];
	char		zone_zp_name[MAXNAMELEN];	/* ZPOOL_MAXNAMELEN */
	zone_storage_t	*zone_storage_list;
	char	zone_zp_tmp_id[MAX_UINT32_STRLEN];
} zone_zptab_t;

typedef struct zone_susptab {
	char	zone_susp_path[MAXPATHLEN];
	char	zone_susp_suri[SURI_MAX_URI_LEN];
} zone_susptab_t;

typedef struct zone_keytab {
	char	zone_key_raw[ZONE_KEY_MAXSTRLEN];
} zone_keytab_t;

typedef struct	zone_cert {
	char	zone_cert_uri[MAXPATHLEN];	/* URI string */
	struct	zone_cert	*zone_cert_next;
} zone_cert_t;

typedef struct	zone_vboottab {
	char	zone_vboot_policy[MAXPOLICYLEN];
	zone_cert_t	*zone_cert_list;
} zone_vboottab_t;

typedef enum zone_gttype {
	ZS_FALSE,
	ZS_TRUE,
	ZS_NOTSPECIFIED
} zone_gttype_t;

typedef enum zone_iptype {
	ZS_SHARED,
	ZS_EXCLUSIVE
} zone_iptype_t;

typedef struct {
	char		*zmac_list[2];
	size_t		zmac_size[2];
} zone_maclist_t;

typedef enum zone_mactype {
	ZS_BLACK,
	ZS_WHITE
} zone_mactype_t;

typedef struct	zone_npivtab {
	char	zone_npiv_pwwn[VPORT_WWN_STR_LEN];
	char	zone_npiv_overhba[VPORT_MAX_CONTROLLER_LEN];
	char	zone_npiv_tmp_id[MAX_UINT32_STRLEN];
} zone_npivtab_t;

/*
 * Basic configuration management routines.
 */
extern	zone_dochandle_t	zonecfg_init_handle(void);
extern	int	zonecfg_get_handle(const char *, zone_dochandle_t);
extern	int	zonecfg_get_handle_buf(const char *, const char *,
    size_t, zone_dochandle_t);
extern	int	zonecfg_get_snapshot_handle(const char *, zone_dochandle_t);
extern	int	zonecfg_get_snapshot_xml_file(const char *, char **, size_t *);
extern	int	zonecfg_snapshot_save(const char *, zone_dochandle_t);
extern	int	zonecfg_get_suspend_handle(const char *, zone_dochandle_t);
extern	int	zonecfg_get_template_handle(const char *, const char *,
    zone_dochandle_t);
extern	int	zonecfg_get_xml_handle(const char *, zone_dochandle_t);
extern	int	zonecfg_get_xml(zone_dochandle_t, char **);
extern	int	zonecfg_handle_load_fd(int, const char *, zone_dochandle_t);
extern	int	zonecfg_handle_save_fd(zone_dochandle_t, int);
extern	int	zonecfg_check_handle(zone_dochandle_t);
extern	void	zonecfg_fini_handle(zone_dochandle_t);
extern	int	zonecfg_destroy(const char *, boolean_t);
extern	int	zonecfg_destroy_snapshot(const char *);
extern	int	zonecfg_save(zone_dochandle_t, boolean_t);
extern	int	zonecfg_create_snapshot(const char *);
extern	char	*zonecfg_strerror(int);
extern	int	zonecfg_access(const char *, int);
extern	void	zonecfg_set_root(const char *);
extern	const char *zonecfg_get_root(void);
extern	int	zonecfg_simplify_path(const char *, char *, size_t);
extern	boolean_t zonecfg_in_alt_root(void);
extern	int	zonecfg_num_resources(zone_dochandle_t, const char *);
extern	int	zonecfg_del_all_resources(zone_dochandle_t, const char *);
extern	boolean_t zonecfg_valid_importance(char *);
extern	int	zonecfg_str_to_bytes(char *, uint64_t *);
extern	boolean_t zonecfg_valid_memlimit(char *, uint64_t *);
extern	boolean_t zonecfg_valid_alias_limit(char *, char *, uint64_t *);
extern  void	zonecfg_set_md5(zone_dochandle_t, const unsigned char *);
extern  const unsigned char	*zonecfg_get_md5(zone_dochandle_t);
extern	int	zonecfg_is_stale(zone_dochandle_t, const char *);
extern	int zonecfg_set_live_baseline(zone_dochandle_t);
extern	const unsigned char *zonecfg_get_live_baseline(zone_dochandle_t);
extern	int	zonecfg_get_current_md5(zone_dochandle_t, unsigned char *);
extern	int	zonecfg_create_tmpfile(const char *);
extern	int	zonecfg_handle_set_live(zone_dochandle_t);
extern	boolean_t zonecfg_handle_is_live(zone_dochandle_t);

/*
 * Zone name, path to zone directory, autoboot setting, pool, boot
 * arguments, and scheduling-class.
 */
extern	int	zonecfg_validate_zonename(const char *);
extern	int	zonecfg_get_name(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_name(zone_dochandle_t, char *);
extern	int	zonecfg_get_zonepath_impl(zone_dochandle_t, char *, size_t,
    boolean_t);
extern	int	zonecfg_get_zonepath(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_zonepath(zone_dochandle_t, char *);
extern	int	zonecfg_get_globaltime(zone_dochandle_t, char **,
    zone_gttype_t *);
extern	int	zonecfg_unset_globaltime(zone_dochandle_t);
extern	int	zonecfg_set_globaltime(zone_dochandle_t, boolean_t);
extern	int	zonecfg_get_hostcompatible(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_hostcompatible(zone_dochandle_t, char *);
extern	int	zonecfg_is_adi(zone_dochandle_t, char *, size_t, char *,
    size_t, boolean_t *, boolean_t);
extern	int	zonecfg_get_autoboot(zone_dochandle_t, boolean_t *);
extern	int	zonecfg_set_autoboot(zone_dochandle_t, boolean_t);
extern	int	zonecfg_get_autoshutdown(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_autoshutdown(zone_dochandle_t, const char *);
extern	boolean_t zonecfg_is_readonly(zone_dochandle_t);
extern	int	zonecfg_get_mac_profile(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_mac_profile(zone_dochandle_t, char *);
extern	int	zonecfg_get_iptype(zone_dochandle_t, zone_iptype_t *);
extern	int	zonecfg_set_iptype(zone_dochandle_t, zone_iptype_t);
extern	int	zonecfg_get_pool(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_pool(zone_dochandle_t, char *);
extern	int	zonecfg_get_bootargs(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_bootargs(zone_dochandle_t, char *);
extern	int	zonecfg_get_sched_class(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_sched(zone_dochandle_t, char *);
extern	int	zonecfg_get_dflt_sched_class(zone_dochandle_t, char *, int);
extern	int	zonecfg_get_mig_class(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_mig_class(zone_dochandle_t, char *);

/*
 * Set/retrieve the brand for the zone
 */
extern	int	zonecfg_get_brand(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_brand(zone_dochandle_t, char *);

/*
 * Filesystem configuration.
 */
extern	int	zonecfg_add_filesystem(zone_dochandle_t, struct zone_fstab *);
extern	int	zonecfg_delete_filesystem(zone_dochandle_t,
    struct zone_fstab *);
extern	int	zonecfg_modify_filesystem(zone_dochandle_t,
    struct zone_fstab *, struct zone_fstab *);
extern	int	zonecfg_lookup_filesystem(zone_dochandle_t,
    struct zone_fstab *);
extern	int	zonecfg_add_fs_option(struct zone_fstab *, char *);
extern	int	zonecfg_remove_fs_option(struct zone_fstab *, char *);
extern	void	zonecfg_free_fs_option_list(zone_fsopt_t *);
extern	int 	zonecfg_find_mounts(char *, int(*)(const struct mnttab *,
    void *), void *);

/*
 * Network interface configuration.
 */
extern int zonecfg_add_anetmac(struct zone_anetmactab *, struct zone_anettab *);
extern int zonecfg_modify_anetmac(zone_dochandle_t, struct zone_anetmactab *,
    struct zone_anetmactab *, struct zone_anettab *);
extern int zonecfg_add_anetvlan(struct zone_anetvlantab *,
    struct zone_anettab *);
extern int zonecfg_modify_anetvlan(zone_dochandle_t, struct zone_anetvlantab *,
    struct zone_anetvlantab *, struct zone_anettab *);
extern	int	zonecfg_add_net(zone_dochandle_t, struct zone_nettab *);
extern	int	zonecfg_delete_net(zone_dochandle_t, struct zone_nettab *);
extern	int	zonecfg_modify_net(zone_dochandle_t, struct zone_nettab *,
    struct zone_nettab *);
extern	int	zonecfg_lookup_net(zone_dochandle_t, struct zone_nettab *);

/*
 * Automatic network interface configuration.
 */
extern	int	zonecfg_add_anet(zone_dochandle_t, struct zone_anettab *);
extern	int	zonecfg_delete_anet(zone_dochandle_t, struct zone_anettab *);
extern	int	zonecfg_modify_anet(zone_dochandle_t, struct zone_anettab *,
    struct zone_anettab *);
extern	int	zonecfg_lookup_anet(zone_dochandle_t, struct zone_anettab *);
extern	boolean_t zonecfg_lookup_linkname(zone_dochandle_t, const char *);
extern	int	zonecfg_csscmp(const char *, const char *);

/*
 * Hostid emulation configuration.
 */
extern	int	zonecfg_get_hostid(zone_dochandle_t, char *, size_t);
extern	int	zonecfg_set_hostid(zone_dochandle_t, const char *);

/*
 * Allowed FS mounts configuration.
 */
extern int	zonecfg_get_fs_allowed(zone_dochandle_t, char *, size_t);
extern int	zonecfg_set_fs_allowed(zone_dochandle_t, const char *);

/*
 * EVS tenant configuration.
 */
extern int	zonecfg_get_tenant(zone_dochandle_t, char *, size_t);
extern int	zonecfg_set_tenant(zone_dochandle_t, const char *);

/*
 * Device configuration and rule matching.
 */
extern	int	zonecfg_add_dev(zone_dochandle_t, struct zone_devtab *);
extern	int	zonecfg_delete_dev(zone_dochandle_t, struct zone_devtab *);
extern	int	zonecfg_modify_dev(zone_dochandle_t, struct zone_devtab *,
    struct zone_devtab *);
extern	int	zonecfg_lookup_dev(zone_dochandle_t, struct zone_devtab *);

/*
 * Resource control configuration.
 */
extern	int	zonecfg_add_rctl(zone_dochandle_t, struct zone_rctltab *);
extern	int	zonecfg_delete_rctl(zone_dochandle_t, struct zone_rctltab *);
extern	int	zonecfg_modify_rctl(zone_dochandle_t, struct zone_rctltab *,
    struct zone_rctltab *);
extern	int	zonecfg_lookup_rctl(zone_dochandle_t, struct zone_rctltab *);
extern	struct zone_rctlvaltab *
		zonecfg_create_rctl_value(rctl_priv_t, uint_t, uint64_t);
extern	int	zonecfg_add_rctl_value(struct zone_rctltab *,
    struct zone_rctlvaltab *);
extern	int	zonecfg_remove_rctl_value(struct zone_rctltab *,
    struct zone_rctlvaltab *);
extern	void	zonecfg_free_rctl_value_list(struct zone_rctlvaltab *);
extern	boolean_t zonecfg_aliased_rctl_ok(zone_dochandle_t, char *);
extern	int	zonecfg_set_aliased_rctl(zone_dochandle_t, char *, uint64_t);
extern	int	zonecfg_get_aliased_rctl(zone_dochandle_t, const char *,
    uint64_t *);
extern	int	zonecfg_rm_aliased_rctl(zone_dochandle_t, char *);
extern	int	zonecfg_apply_rctls(char *, zone_dochandle_t);

/*
 * Generic attribute configuration and type/value extraction.
 */
extern	int	zonecfg_add_attr(zone_dochandle_t, struct zone_attrtab *);
extern	int	zonecfg_delete_attr(zone_dochandle_t, struct zone_attrtab *);
extern	int	zonecfg_modify_attr(zone_dochandle_t, struct zone_attrtab *,
    struct zone_attrtab *);
extern	int	zonecfg_lookup_attr(zone_dochandle_t, struct zone_attrtab *);
extern	int	zonecfg_get_attr_boolean(const struct zone_attrtab *,
    boolean_t *);
extern	int	zonecfg_get_attr_int(const struct zone_attrtab *, int64_t *);
extern	int	zonecfg_get_attr_string(const struct zone_attrtab *, char *,
    size_t);
extern	int	zonecfg_get_attr_uint(const struct zone_attrtab *, uint64_t *);
extern	int	zonecfg_operation_prep(zone_dochandle_t);

/*
 * ZFS configuration.
 */
extern	int	zonecfg_add_ds(zone_dochandle_t, struct zone_dstab *);
extern	int	zonecfg_delete_ds(zone_dochandle_t, struct zone_dstab *);
extern	int	zonecfg_modify_ds(zone_dochandle_t, struct zone_dstab *,
    struct zone_dstab *);
extern	int	zonecfg_lookup_ds(zone_dochandle_t, struct zone_dstab *);

/*
 * cpu-set configuration.
 */
extern	int	zonecfg_add_pset(zone_dochandle_t, struct zone_psettab *);
extern	int	zonecfg_delete_pset(zone_dochandle_t);
extern	int	zonecfg_modify_pset(zone_dochandle_t, struct zone_psettab *);
extern	int	zonecfg_lookup_pset(zone_dochandle_t, struct zone_psettab *);

/*
 * mem-cap configuration.
 */
extern	int	zonecfg_delete_mcap(zone_dochandle_t);
extern	int	zonecfg_modify_mcap(zone_dochandle_t, struct zone_mcaptab *);
extern	int	zonecfg_lookup_mcap(zone_dochandle_t, struct zone_mcaptab *);

/*
 * virtual-cpu configuration.
 */
extern	int	zonecfg_delete_virtual_cpu(zone_dochandle_t);
extern	int	zonecfg_modify_virtual_cpu(zone_dochandle_t,
    struct zone_vcputab *);
extern	int	zonecfg_lookup_virtual_cpu(zone_dochandle_t,
    struct zone_vcputab *);

/*
 * Temporary pool support functions.
 */
extern	int	zonecfg_destroy_tmp_pool(char *, char *, int);
extern	int	zonecfg_bind_tmp_pool(zone_dochandle_t, zoneid_t, char *, int);
extern	int	zonecfg_bind_pool(zone_dochandle_t, zoneid_t, char *, int);
extern	boolean_t zonecfg_warn_poold(zone_dochandle_t);
extern	int	zonecfg_get_poolname(zone_dochandle_t, char *, char *, size_t);

/*
 * Zpool configuration
 */
extern	int	zonecfg_lookup_rootzpool(zone_dochandle_t, zone_rzptab_t *);
extern	int	zonecfg_delete_rootzpool(zone_dochandle_t, zone_rzptab_t *);
extern	int	zonecfg_add_rootzpool(zone_dochandle_t, zone_rzptab_t *);
extern	int	zonecfg_modify_rootzpool(zone_dochandle_t, zone_rzptab_t *,
    zone_rzptab_t *);
extern	int	zonecfg_add_rootzpool_uri(zone_rzptab_t *, const char *);
extern	int	zonecfg_remove_rootzpool_uri(zone_dochandle_t, zone_rzptab_t *,
    const char *);
extern	void	zonecfg_free_rootzpool_storage_list(zone_rzptab_t *);

extern	int	zonecfg_lookup_zpool(zone_dochandle_t, zone_zptab_t *);
extern	int	zonecfg_delete_zpool(zone_dochandle_t, zone_zptab_t *);
extern	int	zonecfg_add_zpool(zone_dochandle_t, zone_zptab_t *);
extern	int	zonecfg_modify_zpool(zone_dochandle_t, zone_zptab_t *,
    zone_zptab_t *);
extern	int	zonecfg_add_zpool_uri(zone_zptab_t *, const char *);
extern	int	zonecfg_remove_zpool_uri(zone_dochandle_t, zone_zptab_t *,
    const char *);
extern	void	zonecfg_free_zpool_storage_list(zone_zptab_t *);

extern	int	zonecfg_match_storage_uri(zone_dochandle_t,
    zone_storage_t *, const char *uri);
extern	int	zonecfg_match_storage_list(zone_dochandle_t,
    zone_storage_t *, zone_storage_t *);
extern	int	zonecfg_is_zoss(const char *, boolean_t *, boolean_t *);
extern boolean_t zonecfg_valid_zpoolname(const char *);
extern	int	zonecfg_get_zpoolname(const char *, const char *, char *,
    size_t);

/*
 * Suspend configuraton
 */
extern	int	zonecfg_lookup_suspend(zone_dochandle_t, zone_susptab_t *);
extern	int	zonecfg_add_suspend(zone_dochandle_t, zone_susptab_t *);
extern	int	zonecfg_delete_suspend(zone_dochandle_t, zone_susptab_t *);
extern	int	zonecfg_modify_suspend(zone_dochandle_t, zone_susptab_t *,
    zone_susptab_t *);

/*
 * NPIV configuration.
 */
extern	int zonecfg_add_npiv(zone_dochandle_t, zone_npivtab_t *);
extern	int zonecfg_delete_npiv(zone_dochandle_t, zone_npivtab_t *);
extern	int zonecfg_modify_npiv(zone_dochandle_t, zone_npivtab_t *,
    zone_npivtab_t *);
extern	int zonecfg_lookup_npiv(zone_dochandle_t, zone_npivtab_t *);
extern	boolean_t zonecfg_is_wwn(const char *);
extern	boolean_t zonecfg_is_overhba(const char *);

/*
 * Verified-boot configuration
 */
extern	int	zonecfg_add_vboot(zone_dochandle_t, zone_vboottab_t *);
extern	int	zonecfg_delete_vboot(zone_dochandle_t);
extern	int	zonecfg_modify_vboot(zone_dochandle_t, zone_vboottab_t *);
extern	int	zonecfg_lookup_vboot(zone_dochandle_t, zone_vboottab_t *);
extern	int	zonecfg_initialize_vboot(zone_vboottab_t *);
extern	int	zonecfg_add_vboot_cert(zone_vboottab_t *, const char *);
extern	int	zonecfg_remove_vboot_cert(zone_vboottab_t *, const char *);
extern	void	zonecfg_free_vboot_cert_list(zone_vboottab_t *);
extern	int	zonecfg_getvbootent(zone_dochandle_t, zone_vboottab_t *,
    boolean_t);
extern	int	zonecfg_endvbootent(zone_dochandle_t);
extern	int	zonecfg_setvbootent(zone_dochandle_t);

/*
 * Miscellaneous utility functions.
 */
extern	int	zonecfg_cleanup_config(zone_dochandle_t);

/*
 * attach/detach support.
 */
extern	int	zonecfg_get_ua_handle(const char *, const char *, const char *,
    const char *, char *, size_t, const char *, zone_dochandle_t, boolean_t *,
    char *, size_t);
extern	int	zonecfg_get_attach_handle(const char *, const char *,
    const char *, zone_dochandle_t);
extern	int	zonecfg_detach_save(zone_dochandle_t, uint_t);
extern	void	zonecfg_rm_detached(zone_dochandle_t, boolean_t forced);

/*
 * suspend support.
 */
extern	int	zonecfg_suspend_save(const char *, zone_dochandle_t);

/*
 * External zone verification support.
 */
extern	int	zonecfg_verify_save(zone_dochandle_t, char *);

/*
 * '*ent' iterator routines.
 */
extern	int	zonecfg_setfsent(zone_dochandle_t);
extern	int	zonecfg_getfsent(zone_dochandle_t, struct zone_fstab *,
    boolean_t);
extern	int	zonecfg_endfsent(zone_dochandle_t);
extern	int	zonecfg_setnetent(zone_dochandle_t);
extern	int	zonecfg_getnetent(zone_dochandle_t, struct zone_nettab *,
    boolean_t);
extern	int	zonecfg_endnetent(zone_dochandle_t);
extern	int	zonecfg_setanetent(zone_dochandle_t);
extern	int	zonecfg_getanetent(zone_dochandle_t, struct zone_anettab *,
    boolean_t);
extern	int	zonecfg_endanetent(zone_dochandle_t);
extern	int	zonecfg_setdevent(zone_dochandle_t);
extern	int	zonecfg_getdevent(zone_dochandle_t, struct zone_devtab *,
    boolean_t);
extern	int	zonecfg_enddevent(zone_dochandle_t);
extern	int	zonecfg_setattrent(zone_dochandle_t);
extern	int	zonecfg_getattrent(zone_dochandle_t, struct zone_attrtab *,
    boolean_t);
extern	int	zonecfg_endattrent(zone_dochandle_t);
extern	int	zonecfg_setrctlent(zone_dochandle_t);
extern	int	zonecfg_getrctlent(zone_dochandle_t, struct zone_rctltab *);
extern	int	zonecfg_endrctlent(zone_dochandle_t);
extern	int	zonecfg_setdsent(zone_dochandle_t);
extern	int	zonecfg_getdsent(zone_dochandle_t, struct zone_dstab *,
    boolean_t);
extern	int	zonecfg_enddsent(zone_dochandle_t);
extern	int	zonecfg_getpsetent(zone_dochandle_t, struct zone_psettab *,
    boolean_t);
extern	int	zonecfg_getmcapent(zone_dochandle_t, struct zone_mcaptab *,
    boolean_t);
extern	int	zonecfg_setadminent(zone_dochandle_t);
extern	int	zonecfg_getadminent(zone_dochandle_t, struct zone_admintab *,
    boolean_t);
extern	int	zonecfg_endadminent(zone_dochandle_t);
extern	int	zonecfg_setrzpent(zone_dochandle_t);
extern	int	zonecfg_getrzpent(zone_dochandle_t, zone_rzptab_t *,
    boolean_t);
extern	int	zonecfg_endrzpent(zone_dochandle_t);
extern	int	zonecfg_setzpent(zone_dochandle_t);
extern	int	zonecfg_getzpent(zone_dochandle_t, zone_zptab_t *,
    boolean_t);
extern	int	zonecfg_endzpent(zone_dochandle_t);
extern	int	zonecfg_getvcpuent(zone_dochandle_t, struct zone_vcputab *,
    boolean_t);
extern	int	zonecfg_setsuspent(zone_dochandle_t);
extern	int	zonecfg_getsuspent(zone_dochandle_t, zone_susptab_t *);
extern	int	zonecfg_endsuspent(zone_dochandle_t);
extern	int	zonecfg_setnpivent(zone_dochandle_t);
extern	int	zonecfg_getnpivent(zone_dochandle_t, zone_npivtab_t *,
    boolean_t);
extern	int	zonecfg_endnpivent(zone_dochandle_t);


extern const char *zonecfg_devent_src(zone_devtab_t *);
extern const char *zonecfg_anetent_id(zone_anettab_t *);

/*
 * Configuration iterator functions
 */

typedef int (*iter_resource_cb_t)(void *, void *, void *, const char *);

extern int zonecfg_iter_resource(zone_dochandle_t, iter_resource_cb_t,
    void *, void *, void *);

typedef int (*iter_property_cb_t)(void *, void *, void *, const char *,
    const char *, const char *);

extern int zonecfg_iter_property(zone_dochandle_t,
    iter_property_cb_t, void *, void *, void *);

/*
 * Privilege-related functions.
 */
extern	int	zonecfg_default_privset(priv_set_t *, const char *);
extern	int	zonecfg_get_privset(zone_dochandle_t, priv_set_t *,
    char **);
extern	int	zonecfg_get_limitpriv(zone_dochandle_t, char **);
extern	int	zonecfg_set_limitpriv(zone_dochandle_t, char *);

/*
 * Higher-level routines.
 */
extern  int	zone_get_brand(char *, char *, size_t);
extern	int	zone_get_rootpath(char *, char *, size_t);
extern	int	zone_get_devroot(char *, char *, size_t);
extern	int	zone_get_zonepath(char *, char *, size_t);
extern	int	zone_get_state(const char *, zone_state_t *);
extern	int	zone_get_zonepath_uuid(const char *, char *, size_t, uuid_t);
extern	int	zone_set_state(const char *, zone_state_t);
extern	char	*zone_state_str(zone_state_t);
extern	zone_state_t zone_state_num(const char *);
extern	int	zonecfg_get_name_by_uuid(const uuid_t, char *, size_t);
extern	int	zonecfg_get_uuid(const char *, uuid_t);
extern	int	zonecfg_default_brand(char *, size_t);
extern	int	zonecfg_default_template(char *, size_t);

/*
 * Iterator for configured zones.
 */
extern FILE		*setzoneent(void);
extern char		*getzoneent(FILE *);
extern struct zoneent	*getzoneent_private(FILE *);
extern void		endzoneent(FILE *);

/*
 * File-system-related convenience functions.
 */
extern boolean_t zonecfg_valid_fs_type(const char *);

/*
 * Network-related convenience functions.
 */
extern boolean_t zonecfg_same_net_address(char *, char *);
extern int zonecfg_valid_net_address(char *, struct sockaddr_storage *);

/*
 * Rctl-related common functions.
 */
extern boolean_t zonecfg_is_rctl(const char *);
extern boolean_t zonecfg_valid_rctlname(const char *);
extern boolean_t zonecfg_valid_rctlblk(const rctlblk_t *);
extern boolean_t zonecfg_valid_rctl(const char *, const rctlblk_t *);
extern int zonecfg_construct_rctlblk(const struct zone_rctlvaltab *,
    rctlblk_t *);

/*
 * Live Upgrade support functions.  Shared between ON and install gate.
 */
extern FILE *zonecfg_open_scratch(const char *, boolean_t);
extern int zonecfg_lock_scratch(FILE *);
extern void zonecfg_close_scratch(FILE *);
extern int zonecfg_get_scratch(FILE *, char *, size_t, char *, size_t, char *,
    size_t);
extern int zonecfg_find_scratch(FILE *, const char *, const char *, char *,
    size_t);
extern int zonecfg_reverse_scratch(FILE *, const char *, char *, size_t,
    char *, size_t);
extern int zonecfg_add_scratch(FILE *, const char *, const char *,
    const char *);
extern int zonecfg_delete_scratch(FILE *, const char *);
extern boolean_t zonecfg_is_scratch(const char *);

extern int zonecfg_insert_userauths(zone_dochandle_t, char *, char *);
extern int zonecfg_remove_userauths(zone_dochandle_t, char *, char *,
    boolean_t);
extern int zonecfg_add_admin(zone_dochandle_t, struct zone_admintab *,
    char *);
extern int zonecfg_delete_admin(zone_dochandle_t,
    struct zone_admintab *, char *);
extern int zonecfg_modify_admin(zone_dochandle_t, struct zone_admintab *,
    struct zone_admintab *);
extern int zonecfg_delete_admins(zone_dochandle_t, char *);
extern int zonecfg_lookup_admin(zone_dochandle_t, struct zone_admintab *);
extern int zonecfg_authorize_users(zone_dochandle_t, char *);
extern int zonecfg_update_userauths(zone_dochandle_t, char *);
extern int zonecfg_deauthorize_user(zone_dochandle_t, char *, char *);
extern int zonecfg_deauthorize_users(zone_dochandle_t, char *);
extern boolean_t zonecfg_valid_auths(const char *, const char *);
extern int zonecfg_get_mac_lists(zone_dochandle_t, zone_maclist_t *);
extern boolean_t zonecfg_trusted_path_safe(zone_dochandle_t, const char *);
extern int zonecfg_conform_brand(zone_dochandle_t);
extern int zonecfg_get_keysource(zone_dochandle_t, zone_keytab_t *);
extern int zonecfg_set_keysource(zone_dochandle_t, zone_keytab_t *);
extern int zonecfg_load_hostkey(zone_dochandle_t, const char *);
extern int zonecfg_save_keysource(zone_dochandle_t, const char *);
extern int zonecfg_del_keysource_file(const char *);
extern int zonecfg_get_hostkey(const char *, unsigned char **);
extern int zonecfg_init_hostkey(const char *, unsigned char **);

extern int zonecfg_expand_alltok(zone_dochandle_t, char *, char *, char **);
extern int zonecfg_lookup_anetvlan(zone_dochandle_t, list_t *,
    struct zone_anetvlantab *);
extern int zonecfg_lookup_anetmac(zone_dochandle_t, list_t *,
    struct zone_anetmactab *);
extern void zonecfg_empty_reslist(list_t *);
extern void zonecfg_empty_vlanlist(list_t *);
extern void zonecfg_destroy_anet_vlanlist(struct zone_anettab *);
extern void zonecfg_initialize_anetvlan(list_t *);
extern int zonecfg_copy_vlanlist(list_t *, list_t *);
extern void zonecfg_empty_maclist(list_t *);
extern void zonecfg_destroy_anet_maclist(struct zone_anettab *);
extern void zonecfg_initialize_anetmac(list_t *);
extern int zonecfg_copy_maclist(list_t *, list_t *);
extern int zonecfg_copy_ib_portlist(list_t *, list_t *);
extern int zonecfg_delete_anetvlan(zone_dochandle_t,
    struct zone_anetvlantab *, struct zone_anettab *);
extern int zonecfg_delete_anetmac(zone_dochandle_t, struct zone_anetmactab *,
    struct zone_anettab *);
extern int zonecfg_rebuild_mac_ids(list_t *, int *, long **);
extern int zonecfg_rebuild_dev_ids(zone_dochandle_t, int *, long **);
extern int zonecfg_rebuild_net_ids(zone_dochandle_t, int *, long **);
extern void zonecfg_assign_dev_id(long *, size_t, int, char *, size_t);

extern int zonecfg_get_default(zone_dochandle_t, const char *,
    const char *, int, char *, size_t);
extern int zonecfg_check_tokens(const char *, uint64_t, int *);
extern boolean_t zonecfg_matchprop(zone_dochandle_t, char *, char *, char *);
extern boolean_t zonecfg_matchprop_casecmp(zone_dochandle_t, char *, char *,
    char *);
extern boolean_t zonecfg_matchprop_csscmp(zone_dochandle_t, char *, char *,
    char *);

extern boolean_t zonecfg_str_to_uint64(const char *, uint64_t *);

extern void zonecfg_initialize_ibport(list_t *);
extern void zonecfg_destroy_ib_portlist(struct zone_ibtab *);
extern int zonecfg_setibent(zone_dochandle_t);
extern int zonecfg_getibent(zone_dochandle_t, struct zone_ibtab *, boolean_t);
extern int zonecfg_endibent(zone_dochandle_t);
extern int zonecfg_lookup_ibport(zone_dochandle_t, list_t *,
    struct zone_ibporttab *);
extern int zonecfg_lookup_ib(zone_dochandle_t, struct zone_ibtab *);
extern int zonecfg_rebuild_ib_port_ids(list_t *, int *, long **);
extern int zonecfg_rebuild_ib_ids(zone_dochandle_t, int *, long **);
extern int zonecfg_add_ib(zone_dochandle_t, struct zone_ibtab *);
extern int zonecfg_modify_ib(zone_dochandle_t, struct zone_ibtab *,
    struct zone_ibtab *);
extern int zonecfg_delete_ib(zone_dochandle_t, struct zone_ibtab *);

extern int zonecfg_add_ibport(struct zone_ibporttab *, struct zone_ibtab *);
extern int zonecfg_delete_ibport(zone_dochandle_t, struct zone_ibporttab *,
    struct zone_ibtab *);
extern int zonecfg_modify_ibport(zone_dochandle_t, struct zone_ibporttab *,
    struct zone_ibporttab *, struct zone_ibtab *);

extern int zonecfg_verify_ib(struct zone_ibtab *, ibadm_handle_t *,
    ibadm_conf_t *, char *, char *, int);

extern int zonecfg_setup_vhca(ibadm_handle_t *, ibadm_conf_t *, char *, char *,
    int);
extern int zonecfg_verify_ibpkey(ibadm_handle_t *, ibadm_conf_t *, char *,
    char *, uint_t, char *, int);

extern zone_mig_class_t zonecfg_mig_class_fromname(const char *);
extern const char *zonecfg_mig_class_toname(zone_mig_class_t);

extern int zonecfg_dup_priv_check(zone_dochandle_t, const char *,
    char **, boolean_t *, boolean_t *);
extern zone_pgsz_policy_t zonecfg_pgsz_policy_fromname(const char *);
extern const char *zonecfg_pgsz_policy_toname(zone_pgsz_policy_t);

extern int zonecfg_match_allowed_vids(list_t *, const char *);
extern int zonecfg_add_allowed_vids(list_t *, const char *);
extern int zonecfg_remove_allowed_vids(list_t *, const char *);
extern void zonecfg_destroy_allowed_vids(list_t *);
extern int zonecfg_match_allowed_macaddr_and_get_cnt(list_t *,
    const char *, int *);
extern int zonecfg_match_allowed_macaddr(list_t *, const char *);
extern int zonecfg_add_allowed_macaddr(list_t *, const char *);
extern int zonecfg_remove_allowed_macaddr(list_t *, const char *);
extern void zonecfg_destroy_allowed_macaddr(list_t *);
extern void zonecfg_initialize_allowed_macaddr(list_t *);
extern void zonecfg_initialize_allowed_vids(list_t *);
extern int zonecfg_copy_allowed_macaddrlist(list_t *, list_t *);
extern int zonecfg_copy_allowed_vidslist(list_t *, list_t *);

#ifdef __cplusplus
}
#endif

#endif	/* _LIBZONECFG_H */