15c51f124SMoriah Waterland /*
25c51f124SMoriah Waterland  * CDDL HEADER START
35c51f124SMoriah Waterland  *
45c51f124SMoriah Waterland  * The contents of this file are subject to the terms of the
55c51f124SMoriah Waterland  * Common Development and Distribution License (the "License").
65c51f124SMoriah Waterland  * You may not use this file except in compliance with the License.
75c51f124SMoriah Waterland  *
85c51f124SMoriah Waterland  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95c51f124SMoriah Waterland  * or http://www.opensolaris.org/os/licensing.
105c51f124SMoriah Waterland  * See the License for the specific language governing permissions
115c51f124SMoriah Waterland  * and limitations under the License.
125c51f124SMoriah Waterland  *
135c51f124SMoriah Waterland  * When distributing Covered Code, include this CDDL HEADER in each
145c51f124SMoriah Waterland  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155c51f124SMoriah Waterland  * If applicable, add the following below this CDDL HEADER, with the
165c51f124SMoriah Waterland  * fields enclosed by brackets "[]" replaced with your own identifying
175c51f124SMoriah Waterland  * information: Portions Copyright [yyyy] [name of copyright owner]
185c51f124SMoriah Waterland  *
195c51f124SMoriah Waterland  * CDDL HEADER END
205c51f124SMoriah Waterland  */
215c51f124SMoriah Waterland /*
22*6e1ae2a3SGary Pennington  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
235c51f124SMoriah Waterland  */
245c51f124SMoriah Waterland 
255c51f124SMoriah Waterland 
265c51f124SMoriah Waterland 
275c51f124SMoriah Waterland /*
285c51f124SMoriah Waterland  * Module:	zones.c
295c51f124SMoriah Waterland  * Group:	libinstzones
305c51f124SMoriah Waterland  * Description:	Provide "zones" interface for install consolidation code
315c51f124SMoriah Waterland  *
325c51f124SMoriah Waterland  * Public Methods:
335c51f124SMoriah Waterland  *
345c51f124SMoriah Waterland  *  _z_close_file_descriptors - close a file descriptor "a_fd" not in the
355c51f124SMoriah Waterland  *	list "a_fds"
365c51f124SMoriah Waterland  *  _z_echo - Output an interactive message if interaction is enabled
375c51f124SMoriah Waterland  *  _z_echoDebug - Output a debugging message if debugging is enabled
385c51f124SMoriah Waterland  *  _z_is_directory - determine if specified path exists and is a directory
395c51f124SMoriah Waterland  *  _z_program_error - Output an error message to the appropriate destinations
405c51f124SMoriah Waterland  *  _z_pluginCatchSigint - SIGINT/SIGHUP interrupt handler
415c51f124SMoriah Waterland  *  _z_running_in_global_zone - Determine if this process is running in the
425c51f124SMoriah Waterland  *	global zone
435c51f124SMoriah Waterland  *  _z_zones_are_implemented - Determine if zones are supported by the
445c51f124SMoriah Waterland  *	current system
455c51f124SMoriah Waterland  *  _z_brands_are_implemented - determine if branded zones are implemented on
465c51f124SMoriah Waterland  *		this system
475c51f124SMoriah Waterland  */
485c51f124SMoriah Waterland 
495c51f124SMoriah Waterland /*
505c51f124SMoriah Waterland  * System includes
515c51f124SMoriah Waterland  */
525c51f124SMoriah Waterland 
535c51f124SMoriah Waterland #include <stdio.h>
545c51f124SMoriah Waterland #include <stdlib.h>
555c51f124SMoriah Waterland #include <unistd.h>
565c51f124SMoriah Waterland #include <fcntl.h>
575c51f124SMoriah Waterland #include <ctype.h>
585c51f124SMoriah Waterland #include <sys/types.h>
595c51f124SMoriah Waterland #include <sys/param.h>
605c51f124SMoriah Waterland #include <string.h>
615c51f124SMoriah Waterland #include <strings.h>
625c51f124SMoriah Waterland #include <sys/stat.h>
635c51f124SMoriah Waterland #include <stdarg.h>
645c51f124SMoriah Waterland #include <limits.h>
655c51f124SMoriah Waterland #include <errno.h>
665c51f124SMoriah Waterland #include <signal.h>
675c51f124SMoriah Waterland #include <stropts.h>
685c51f124SMoriah Waterland #include <libintl.h>
695c51f124SMoriah Waterland #include <locale.h>
705c51f124SMoriah Waterland #include <assert.h>
715c51f124SMoriah Waterland #include <dlfcn.h>
725c51f124SMoriah Waterland 
735c51f124SMoriah Waterland /*
745c51f124SMoriah Waterland  * local includes
755c51f124SMoriah Waterland  */
765c51f124SMoriah Waterland 
775c51f124SMoriah Waterland #include "instzones_lib.h"
785c51f124SMoriah Waterland #include "zones_strings.h"
795c51f124SMoriah Waterland 
805c51f124SMoriah Waterland /*
815c51f124SMoriah Waterland  * Private structures
825c51f124SMoriah Waterland  */
835c51f124SMoriah Waterland 
845c51f124SMoriah Waterland /*
855c51f124SMoriah Waterland  * these dynamic libraries are required in order to use the branded zones
865c51f124SMoriah Waterland  * functionality.  If these libraries are not available at runtime,
875c51f124SMoriah Waterland  * then the zones we find are assumed to be native zones.
885c51f124SMoriah Waterland  */
895c51f124SMoriah Waterland 
905c51f124SMoriah Waterland #define	BRAND1_LIBRARY	"libbrand.so.1"
915c51f124SMoriah Waterland #define	BRAND_LIBRARY	"libbrand.so"
925c51f124SMoriah Waterland 
935c51f124SMoriah Waterland /*
945c51f124SMoriah Waterland  * Library Function Prototypes
955c51f124SMoriah Waterland  */
965c51f124SMoriah Waterland 
975c51f124SMoriah Waterland /*
985c51f124SMoriah Waterland  * Local Function Prototypes
995c51f124SMoriah Waterland  */
1005c51f124SMoriah Waterland 
1015c51f124SMoriah Waterland static void	error_and_exit(int error_num);
1025c51f124SMoriah Waterland 
1035c51f124SMoriah Waterland static void 	(*fatal_err_func)() = &error_and_exit;
1045c51f124SMoriah Waterland 
1055c51f124SMoriah Waterland /* ----------------------- private functions -------------------------- */
1065c51f124SMoriah Waterland /*
1075c51f124SMoriah Waterland  * error_and_exit()
1085c51f124SMoriah Waterland  *	Abort routine. An exit code of '2' is used by all applications
1095c51f124SMoriah Waterland  *	to indicate a non-recoverable fatal error.
1105c51f124SMoriah Waterland  * Parameters:
1115c51f124SMoriah Waterland  *	error_num - error index number:
1125c51f124SMoriah Waterland  *			ERR_MALLOC_FAIL
1135c51f124SMoriah Waterland  * Return:
1145c51f124SMoriah Waterland  *	none
1155c51f124SMoriah Waterland  * Status:
1165c51f124SMoriah Waterland  *	private
1175c51f124SMoriah Waterland  */
1185c51f124SMoriah Waterland static void
error_and_exit(int error_num)1195c51f124SMoriah Waterland error_and_exit(int error_num)
1205c51f124SMoriah Waterland {
1215c51f124SMoriah Waterland 	if (error_num == ERR_MALLOC_FAIL)
1225c51f124SMoriah Waterland 		(void) fprintf(stderr, "Allocation of memory failed\n");
1235c51f124SMoriah Waterland 	else
1245c51f124SMoriah Waterland 		(void) fprintf(stderr, "ERROR: code %d\n", error_num);
1255c51f124SMoriah Waterland 	exit(2);
1265c51f124SMoriah Waterland }
1275c51f124SMoriah Waterland 
1285c51f124SMoriah Waterland /*
1295c51f124SMoriah Waterland  * *****************************************************************************
1305c51f124SMoriah Waterland  * global external (public) functions
1315c51f124SMoriah Waterland  * *****************************************************************************
1325c51f124SMoriah Waterland  */
1335c51f124SMoriah Waterland 
1345c51f124SMoriah Waterland /*
1355c51f124SMoriah Waterland  * Name:	_z_close_file_descriptors
1365c51f124SMoriah Waterland  * Description:	close a file descriptor "a_fd" not in the list "a_fds"
1375c51f124SMoriah Waterland  *		This function is called from the fdwalk() library function.
1385c51f124SMoriah Waterland  *		If the file descriptor passed in is NOT in the list passed in,
1395c51f124SMoriah Waterland  *		the file is closed.
1405c51f124SMoriah Waterland  * Arguments:	a_fds - [RO, *RO] - (void *)
1415c51f124SMoriah Waterland  *			Pointer to list of file descriptors to keep open
1425c51f124SMoriah Waterland  *		a_fd - [RO, *RO] - (int)
1435c51f124SMoriah Waterland  *			File descriptor to check
1445c51f124SMoriah Waterland  * Returns:	int
1455c51f124SMoriah Waterland  *			0 - success
1465c51f124SMoriah Waterland  */
1475c51f124SMoriah Waterland 
1485c51f124SMoriah Waterland int
_z_close_file_descriptors(void * a_fds,int a_fd)1495c51f124SMoriah Waterland _z_close_file_descriptors(void *a_fds, int a_fd)
1505c51f124SMoriah Waterland {
1515c51f124SMoriah Waterland 	int	*fds;
1525c51f124SMoriah Waterland 	int	i;
1535c51f124SMoriah Waterland 
1545c51f124SMoriah Waterland 	/* do not close standard input, output, or error file descriptors */
1555c51f124SMoriah Waterland 
1565c51f124SMoriah Waterland 	if (a_fd == STDIN_FILENO || a_fd == STDOUT_FILENO ||
1575c51f124SMoriah Waterland 	    a_fd == STDERR_FILENO) {
1585c51f124SMoriah Waterland 		return (0);
1595c51f124SMoriah Waterland 	}
1605c51f124SMoriah Waterland 
1615c51f124SMoriah Waterland 	/* if no file descriptor retention list, close this file */
1625c51f124SMoriah Waterland 
1635c51f124SMoriah Waterland 	if (a_fds == (void *)NULL) {
1645c51f124SMoriah Waterland 		(void) close(a_fd);
1655c51f124SMoriah Waterland 		return (0);
1665c51f124SMoriah Waterland 	}
1675c51f124SMoriah Waterland 
1685c51f124SMoriah Waterland 	/*
1695c51f124SMoriah Waterland 	 * retention list provided, skip this descriptor if its in the list
1705c51f124SMoriah Waterland 	 */
1715c51f124SMoriah Waterland 
1725c51f124SMoriah Waterland 	fds = (int *)a_fds;
1735c51f124SMoriah Waterland 
1745c51f124SMoriah Waterland 	for (i = 0; fds[i] != -1; i++) {
1755c51f124SMoriah Waterland 		if (fds[i] == a_fd) {
1765c51f124SMoriah Waterland 			return (0);
1775c51f124SMoriah Waterland 		}
1785c51f124SMoriah Waterland 	}
1795c51f124SMoriah Waterland 
1805c51f124SMoriah Waterland 	/* this descriptor not in retention list - close this file */
1815c51f124SMoriah Waterland 
1825c51f124SMoriah Waterland 	(void) close(a_fd);
1835c51f124SMoriah Waterland 
1845c51f124SMoriah Waterland 	return (0);
1855c51f124SMoriah Waterland }
1865c51f124SMoriah Waterland 
1875c51f124SMoriah Waterland /*
1885c51f124SMoriah Waterland  * Name:	_z_echo
1895c51f124SMoriah Waterland  * Synopsis:	Output an interactive message if interaction is enabled
1905c51f124SMoriah Waterland  * Description:	Main method for outputting an interactive message; call to
1915c51f124SMoriah Waterland  *		output interactive message if interation has not been disabled
1925c51f124SMoriah Waterland  *		by a previous call to echoSetFlag(0).
1935c51f124SMoriah Waterland  * Arguments:	format - [RO, RO*] (char *)
1945c51f124SMoriah Waterland  *			printf-style format for debugging message to be output
1955c51f124SMoriah Waterland  *		VARG_LIST - [RO] (?)
1965c51f124SMoriah Waterland  *			arguments as appropriate to 'format' specified
1975c51f124SMoriah Waterland  * Returns:	void
1985c51f124SMoriah Waterland  */
1995c51f124SMoriah Waterland 
2005c51f124SMoriah Waterland /*PRINTFLIKE1*/
2015c51f124SMoriah Waterland void
_z_echo(char * a_format,...)2025c51f124SMoriah Waterland _z_echo(char *a_format, ...)
2035c51f124SMoriah Waterland {
2045c51f124SMoriah Waterland 	va_list ap;
2055c51f124SMoriah Waterland 	char	message[MAX_MESSAGE_SIZE];
2065c51f124SMoriah Waterland 
2075c51f124SMoriah Waterland 	/* entry assertions */
2085c51f124SMoriah Waterland 
2095c51f124SMoriah Waterland 	assert(a_format != NULL);
2105c51f124SMoriah Waterland 
2115c51f124SMoriah Waterland 	/* return if no progerr function registered */
2125c51f124SMoriah Waterland 
2135c51f124SMoriah Waterland 	if (_z_global_data._z_echo == NULL) {
2145c51f124SMoriah Waterland 		return;
2155c51f124SMoriah Waterland 	}
2165c51f124SMoriah Waterland 
2175c51f124SMoriah Waterland 	/* capture message */
2185c51f124SMoriah Waterland 
2195c51f124SMoriah Waterland 	va_start(ap, a_format);
2205c51f124SMoriah Waterland 	(void) vsnprintf(message, sizeof (message), a_format, ap);
2215c51f124SMoriah Waterland 	va_end(ap);
2225c51f124SMoriah Waterland 
2235c51f124SMoriah Waterland 	/* pass message to registered function */
2245c51f124SMoriah Waterland 
2255c51f124SMoriah Waterland 	(_z_global_data._z_echo)("%s", message);
2265c51f124SMoriah Waterland }
2275c51f124SMoriah Waterland 
2285c51f124SMoriah Waterland /*
2295c51f124SMoriah Waterland  * Name:	_z_echoDebug
2305c51f124SMoriah Waterland  * Synopsis:	Output a debugging message if debugging is enabled
2315c51f124SMoriah Waterland  * Description:	Main method for outputting a debugging message; call to
2325c51f124SMoriah Waterland  *		output debugging message if debugging has been enabled
2335c51f124SMoriah Waterland  *		by a previous call to _z_echoDebugSetFlag(1).
2345c51f124SMoriah Waterland  * Arguments:	format - [RO, RO*] (char *)
2355c51f124SMoriah Waterland  *			printf-style format for debugging message to be output
2365c51f124SMoriah Waterland  *		VARG_LIST - [RO] (?)
2375c51f124SMoriah Waterland  *			arguments as appropriate to 'format' specified
2385c51f124SMoriah Waterland  * Returns:	void
2395c51f124SMoriah Waterland  * NOTE:	format of message will be:
2405c51f124SMoriah Waterland  *			# [ aaa bbb ccc ] message
2415c51f124SMoriah Waterland  *		where:	aaa - process i.d.
2425c51f124SMoriah Waterland  *			bbb - zone i.d.
2435c51f124SMoriah Waterland  *			ccc - name of program
2445c51f124SMoriah Waterland  * 		for example:
2455c51f124SMoriah Waterland  *			# [ 25685   0 pkgadd     ] unable to get package list
2465c51f124SMoriah Waterland  */
2475c51f124SMoriah Waterland 
2485c51f124SMoriah Waterland /*PRINTFLIKE1*/
2495c51f124SMoriah Waterland void
_z_echoDebug(char * a_format,...)2505c51f124SMoriah Waterland _z_echoDebug(char *a_format, ...)
2515c51f124SMoriah Waterland {
2525c51f124SMoriah Waterland 	va_list ap;
2535c51f124SMoriah Waterland 	char	message[MAX_MESSAGE_SIZE];
2545c51f124SMoriah Waterland 
2555c51f124SMoriah Waterland 	/* entry assertions */
2565c51f124SMoriah Waterland 
2575c51f124SMoriah Waterland 	assert(a_format != NULL);
2585c51f124SMoriah Waterland 
2595c51f124SMoriah Waterland 	/* return if no progerr function registered */
2605c51f124SMoriah Waterland 
2615c51f124SMoriah Waterland 	if (_z_global_data._z_echo_debug == NULL) {
2625c51f124SMoriah Waterland 		return;
2635c51f124SMoriah Waterland 	}
2645c51f124SMoriah Waterland 
2655c51f124SMoriah Waterland 	/* capture message */
2665c51f124SMoriah Waterland 
2675c51f124SMoriah Waterland 	va_start(ap, a_format);
2685c51f124SMoriah Waterland 	(void) vsnprintf(message, sizeof (message), a_format, ap);
2695c51f124SMoriah Waterland 	va_end(ap);
2705c51f124SMoriah Waterland 
2715c51f124SMoriah Waterland 	/* pass message to registered function */
2725c51f124SMoriah Waterland 
2735c51f124SMoriah Waterland 	(_z_global_data._z_echo_debug)("%s", message);
2745c51f124SMoriah Waterland }
2755c51f124SMoriah Waterland 
2765c51f124SMoriah Waterland /*
2775c51f124SMoriah Waterland  * Name:	_z_is_directory
2785c51f124SMoriah Waterland  * Description:	determine if specified path exists and is a directory
2795c51f124SMoriah Waterland  * Arguments:	path - pointer to string representing the path to verify
2805c51f124SMoriah Waterland  * returns: 0 - directory exists
2815c51f124SMoriah Waterland  *	    1 - directory does not exist or is not a directory
2825c51f124SMoriah Waterland  * NOTE:	errno is set appropriately
2835c51f124SMoriah Waterland  */
2845c51f124SMoriah Waterland 
2855c51f124SMoriah Waterland int
_z_is_directory(char * path)2865c51f124SMoriah Waterland _z_is_directory(char *path)
2875c51f124SMoriah Waterland {
2885c51f124SMoriah Waterland 	struct stat statbuf;
2895c51f124SMoriah Waterland 
2905c51f124SMoriah Waterland 	/* entry assertions */
2915c51f124SMoriah Waterland 
2925c51f124SMoriah Waterland 	assert(path != NULL);
2935c51f124SMoriah Waterland 	assert(*path != '\0');
2945c51f124SMoriah Waterland 
2955c51f124SMoriah Waterland 	/* return error if path does not exist */
2965c51f124SMoriah Waterland 
2975c51f124SMoriah Waterland 	if (stat(path, &statbuf) != 0) {
2985c51f124SMoriah Waterland 		return (1);
2995c51f124SMoriah Waterland 	}
3005c51f124SMoriah Waterland 
3015c51f124SMoriah Waterland 	/* return error if path is not a directory */
3025c51f124SMoriah Waterland 
3035c51f124SMoriah Waterland 	if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
3045c51f124SMoriah Waterland 		errno = ENOTDIR;
3055c51f124SMoriah Waterland 		return (1);
3065c51f124SMoriah Waterland 	}
3075c51f124SMoriah Waterland 
3085c51f124SMoriah Waterland 	/* path exists and is a directory */
3095c51f124SMoriah Waterland 
3105c51f124SMoriah Waterland 	return (0);
3115c51f124SMoriah Waterland }
3125c51f124SMoriah Waterland 
3135c51f124SMoriah Waterland /*
3145c51f124SMoriah Waterland  * Name:	_z_pluginCatchSigint
3155c51f124SMoriah Waterland  * Synopsis:	SIGINT/SIGHUP interrupt handler
3165c51f124SMoriah Waterland  * Description:	Catch the "SIGINT" and "SIGHUP" signals:
3175c51f124SMoriah Waterland  *		-> increment _z_SigReceived global variable
3185c51f124SMoriah Waterland  *		-> propagate signal to "_z_ChildProcessId" if registered (!= -1)
3195c51f124SMoriah Waterland  * Arguments:	signo - [RO, *RO] - (int)
3205c51f124SMoriah Waterland  *			Signal number that was caught
3215c51f124SMoriah Waterland  * Returns:	void
3225c51f124SMoriah Waterland  */
3235c51f124SMoriah Waterland 
3245c51f124SMoriah Waterland void
_z_sig_trap(int a_signo)3255c51f124SMoriah Waterland _z_sig_trap(int a_signo)
3265c51f124SMoriah Waterland {
3275c51f124SMoriah Waterland 	/* bump signals received count */
3285c51f124SMoriah Waterland 
3295c51f124SMoriah Waterland 	_z_global_data._z_SigReceived++;
3305c51f124SMoriah Waterland 
3315c51f124SMoriah Waterland 	/* if child process registered, propagate signal to child */
3325c51f124SMoriah Waterland 
3335c51f124SMoriah Waterland 	if (_z_global_data._z_ChildProcessId > 0) {
3345c51f124SMoriah Waterland 		(void) kill(_z_global_data._z_ChildProcessId, a_signo);
3355c51f124SMoriah Waterland 	}
3365c51f124SMoriah Waterland }
3375c51f124SMoriah Waterland 
3385c51f124SMoriah Waterland /*
3395c51f124SMoriah Waterland  * Name:	_z_program_error
3405c51f124SMoriah Waterland  * Description:	Output an error message to the appropriate destinations
3415c51f124SMoriah Waterland  * Arguments:	format - [RO, RO*] (char *)
3425c51f124SMoriah Waterland  *			printf-style format for debugging message to be output
3435c51f124SMoriah Waterland  *		VARG_LIST - [RO] (?)
3445c51f124SMoriah Waterland  *			arguments as appropriate to 'format' specified
3455c51f124SMoriah Waterland  * Returns:	void
3465c51f124SMoriah Waterland  * NOTE:	format of message will be:
3475c51f124SMoriah Waterland  *			[aaa: ] ERROR: message
3485c51f124SMoriah Waterland  *		where:	aaa - program name (if set)
3495c51f124SMoriah Waterland  *			message - results of format and arguments
3505c51f124SMoriah Waterland  * 		for example:
3515c51f124SMoriah Waterland  *			ERROR: unable to get package list
3525c51f124SMoriah Waterland  */
3535c51f124SMoriah Waterland 
3545c51f124SMoriah Waterland /*PRINTFLIKE1*/
3555c51f124SMoriah Waterland void
_z_program_error(char * a_format,...)3565c51f124SMoriah Waterland _z_program_error(char *a_format, ...)
3575c51f124SMoriah Waterland {
3585c51f124SMoriah Waterland 	va_list ap;
3595c51f124SMoriah Waterland 	char	message[MAX_MESSAGE_SIZE];
3605c51f124SMoriah Waterland 
3615c51f124SMoriah Waterland 	/* entry assertions */
3625c51f124SMoriah Waterland 
3635c51f124SMoriah Waterland 	assert(a_format != NULL);
3645c51f124SMoriah Waterland 
3655c51f124SMoriah Waterland 	/* return if no progerr function registered */
3665c51f124SMoriah Waterland 
3675c51f124SMoriah Waterland 	if (_z_global_data._z_progerr == NULL) {
3685c51f124SMoriah Waterland 		return;
3695c51f124SMoriah Waterland 	}
3705c51f124SMoriah Waterland 
3715c51f124SMoriah Waterland 	/* capture message */
3725c51f124SMoriah Waterland 
3735c51f124SMoriah Waterland 	va_start(ap, a_format);
3745c51f124SMoriah Waterland 	(void) vsnprintf(message, sizeof (message), a_format, ap);
3755c51f124SMoriah Waterland 	va_end(ap);
3765c51f124SMoriah Waterland 
3775c51f124SMoriah Waterland 	/* pass message to registered function */
3785c51f124SMoriah Waterland 
3795c51f124SMoriah Waterland 	(_z_global_data._z_progerr)(MSG_PROG_ERR, message);
3805c51f124SMoriah Waterland }
3815c51f124SMoriah Waterland 
3825c51f124SMoriah Waterland /*
3835c51f124SMoriah Waterland  * Name:	_z_running_in_global_zone
3845c51f124SMoriah Waterland  * Synopsis:	Determine if this process is running in the global zone
3855c51f124SMoriah Waterland  * Arguments:	void
3865c51f124SMoriah Waterland  * Returns:	boolean_t
3875c51f124SMoriah Waterland  *			== B_TRUE - this process is running in the global zone
3885c51f124SMoriah Waterland  *			== B_FALSE - this process is running in a nonglobal zone
3895c51f124SMoriah Waterland  */
3905c51f124SMoriah Waterland 
3915c51f124SMoriah Waterland boolean_t
_z_running_in_global_zone(void)3925c51f124SMoriah Waterland _z_running_in_global_zone(void)
3935c51f124SMoriah Waterland {
3945c51f124SMoriah Waterland 	zoneid_t	zoneid = (zoneid_t)-1;
3955c51f124SMoriah Waterland 
3965c51f124SMoriah Waterland 	/*
3975c51f124SMoriah Waterland 	 * if zones are not implemented, there is no way to tell if zones
3985c51f124SMoriah Waterland 	 * are supported or not - in this case, we can only be running in the
3995c51f124SMoriah Waterland 	 * global zone (since non-global zones cannot exist) so return TRUE
4005c51f124SMoriah Waterland 	 */
4015c51f124SMoriah Waterland 
4025c51f124SMoriah Waterland 	if (z_zones_are_implemented() == B_FALSE) {
4035c51f124SMoriah Waterland 		return (B_TRUE);
4045c51f124SMoriah Waterland 	}
4055c51f124SMoriah Waterland 
4065c51f124SMoriah Waterland 	/* get the zone i.d. of the current zone */
4075c51f124SMoriah Waterland 
4085c51f124SMoriah Waterland 	zoneid = getzoneid();
4095c51f124SMoriah Waterland 
4105c51f124SMoriah Waterland 	/* return TRUE if this is the global zone i.d. */
4115c51f124SMoriah Waterland 
4125c51f124SMoriah Waterland 	if (zoneid == GLOBAL_ZONEID) {
4135c51f124SMoriah Waterland 		return (B_TRUE);
4145c51f124SMoriah Waterland 	}
4155c51f124SMoriah Waterland 
4165c51f124SMoriah Waterland 	/* return FALSE - not in the global zone */
4175c51f124SMoriah Waterland 
4185c51f124SMoriah Waterland 	return (B_FALSE);
4195c51f124SMoriah Waterland }
4205c51f124SMoriah Waterland 
4215c51f124SMoriah Waterland /*
4225c51f124SMoriah Waterland  * Name:	_z_zones_are_implemented
4235c51f124SMoriah Waterland  * Synopsis:	Determine if zones are supported by the current system
4245c51f124SMoriah Waterland  * Arguments:	void
4255c51f124SMoriah Waterland  * Returns:	boolean_t
4265c51f124SMoriah Waterland  *			== B_TRUE - zones are supported
4275c51f124SMoriah Waterland  *			== B_FALSE - zones are not supported
4285c51f124SMoriah Waterland  */
4295c51f124SMoriah Waterland 
4305c51f124SMoriah Waterland boolean_t
_z_zones_are_implemented(void)4315c51f124SMoriah Waterland _z_zones_are_implemented(void)
4325c51f124SMoriah Waterland {
4335c51f124SMoriah Waterland 	void	*libptr = NULL;
4345c51f124SMoriah Waterland 
4355c51f124SMoriah Waterland 	/* locate zone cfg library */
4365c51f124SMoriah Waterland 
4375c51f124SMoriah Waterland 	libptr = dlopen(ZONECFG_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
4385c51f124SMoriah Waterland 	if (libptr == (void *)NULL) {
4395c51f124SMoriah Waterland 		_z_echoDebug(DBG_LIBRARY_NOT_FOUND, ZONECFG_LIBRARY, dlerror());
4405c51f124SMoriah Waterland 		libptr = dlopen(ZONECFG1_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
4415c51f124SMoriah Waterland 	}
4425c51f124SMoriah Waterland 
4435c51f124SMoriah Waterland 	/* return false if library not available */
4445c51f124SMoriah Waterland 
4455c51f124SMoriah Waterland 	if (libptr == (void *)NULL) {
4465c51f124SMoriah Waterland 		_z_echoDebug(DBG_LIBRARY_NOT_FOUND, ZONECFG1_LIBRARY,
4475c51f124SMoriah Waterland 		    dlerror());
4485c51f124SMoriah Waterland 		return (B_FALSE);
4495c51f124SMoriah Waterland 	}
4505c51f124SMoriah Waterland 
4515c51f124SMoriah Waterland 	/* library available - close handle */
4525c51f124SMoriah Waterland 
4535c51f124SMoriah Waterland 	(void) dlclose(libptr);
4545c51f124SMoriah Waterland 
4555c51f124SMoriah Waterland 	/* locate contract filesystem library */
4565c51f124SMoriah Waterland 
4575c51f124SMoriah Waterland 	libptr = dlopen(CONTRACT_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
4585c51f124SMoriah Waterland 	if (libptr == (void *)NULL) {
4595c51f124SMoriah Waterland 		_z_echoDebug(DBG_LIBRARY_NOT_FOUND, CONTRACT_LIBRARY,
4605c51f124SMoriah Waterland 		    dlerror());
4615c51f124SMoriah Waterland 		libptr = dlopen(CONTRACT1_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
4625c51f124SMoriah Waterland 	}
4635c51f124SMoriah Waterland 
4645c51f124SMoriah Waterland 	/* return false if library not available */
4655c51f124SMoriah Waterland 
4665c51f124SMoriah Waterland 	if (libptr == (void *)NULL) {
4675c51f124SMoriah Waterland 		_z_echoDebug(DBG_LIBRARY_NOT_FOUND, CONTRACT1_LIBRARY,
4685c51f124SMoriah Waterland 		    dlerror());
4695c51f124SMoriah Waterland 		return (B_FALSE);
4705c51f124SMoriah Waterland 	}
4715c51f124SMoriah Waterland 
4725c51f124SMoriah Waterland 	/* library available - close handle */
4735c51f124SMoriah Waterland 
4745c51f124SMoriah Waterland 	(void) dlclose(libptr);
4755c51f124SMoriah Waterland 
4765c51f124SMoriah Waterland 	/* return success */
4775c51f124SMoriah Waterland 
4785c51f124SMoriah Waterland 	return (B_TRUE);
4795c51f124SMoriah Waterland }
4805c51f124SMoriah Waterland 
4815c51f124SMoriah Waterland boolean_t
_z_brands_are_implemented(void)4825c51f124SMoriah Waterland _z_brands_are_implemented(void)
4835c51f124SMoriah Waterland {
4845c51f124SMoriah Waterland 	void	*libptr;
4855c51f124SMoriah Waterland 
4865c51f124SMoriah Waterland 	/* locate brand library */
4875c51f124SMoriah Waterland 
4885c51f124SMoriah Waterland 	libptr = dlopen(BRAND_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
4895c51f124SMoriah Waterland 	if (libptr == NULL) {
4905c51f124SMoriah Waterland 		_z_echoDebug(DBG_LIBRARY_NOT_FOUND, BRAND_LIBRARY, dlerror());
4915c51f124SMoriah Waterland 		libptr = dlopen(BRAND1_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
4925c51f124SMoriah Waterland 	}
4935c51f124SMoriah Waterland 
4945c51f124SMoriah Waterland 	/* return false if library not available */
4955c51f124SMoriah Waterland 
4965c51f124SMoriah Waterland 	if (libptr == NULL) {
4975c51f124SMoriah Waterland 		_z_echoDebug(DBG_LIBRARY_NOT_FOUND, BRAND1_LIBRARY, dlerror());
4985c51f124SMoriah Waterland 		return (B_FALSE);
4995c51f124SMoriah Waterland 	}
5005c51f124SMoriah Waterland 
5015c51f124SMoriah Waterland 	/* library available - close handle */
5025c51f124SMoriah Waterland 
5035c51f124SMoriah Waterland 	(void) dlclose(libptr);
5045c51f124SMoriah Waterland 
5055c51f124SMoriah Waterland 	/* return success */
5065c51f124SMoriah Waterland 
5075c51f124SMoriah Waterland 	return (B_TRUE);
5085c51f124SMoriah Waterland }
5095c51f124SMoriah Waterland 
5105c51f124SMoriah Waterland /*
5115c51f124SMoriah Waterland  * z_calloc()
5125c51f124SMoriah Waterland  * 	Allocate 'size' bytes from the heap using calloc()
5135c51f124SMoriah Waterland  * Parameters:
5145c51f124SMoriah Waterland  *	size	- number of bytes to allocate
5155c51f124SMoriah Waterland  * Return:
5165c51f124SMoriah Waterland  *	NULL	- calloc() failure
5175c51f124SMoriah Waterland  *	void *	- pointer to allocated structure
5185c51f124SMoriah Waterland  * Status:
5195c51f124SMoriah Waterland  *	public
5205c51f124SMoriah Waterland  */
5215c51f124SMoriah Waterland void *
_z_calloc(size_t size)5225c51f124SMoriah Waterland _z_calloc(size_t size)
5235c51f124SMoriah Waterland {
5245c51f124SMoriah Waterland 	void *	tmp;
5255c51f124SMoriah Waterland 
5265c51f124SMoriah Waterland 	if ((tmp = (void *) malloc(size)) == NULL) {
5275c51f124SMoriah Waterland 		fatal_err_func(ERR_MALLOC_FAIL);
5285c51f124SMoriah Waterland 		return (NULL);
5295c51f124SMoriah Waterland 	}
5305c51f124SMoriah Waterland 
5315c51f124SMoriah Waterland 	(void) memset(tmp, 0, size);
5325c51f124SMoriah Waterland 	return (tmp);
5335c51f124SMoriah Waterland }
5345c51f124SMoriah Waterland 
5355c51f124SMoriah Waterland /*
5365c51f124SMoriah Waterland  * z_malloc()
5375c51f124SMoriah Waterland  * 	Alloc 'size' bytes from heap using malloc()
5385c51f124SMoriah Waterland  * Parameters:
5395c51f124SMoriah Waterland  *	size	- number of bytes to malloc
5405c51f124SMoriah Waterland  * Return:
5415c51f124SMoriah Waterland  *	NULL	- malloc() failure
5425c51f124SMoriah Waterland  *	void *	- pointer to allocated structure
5435c51f124SMoriah Waterland  * Status:
5445c51f124SMoriah Waterland  *	public
5455c51f124SMoriah Waterland  */
5465c51f124SMoriah Waterland void *
_z_malloc(size_t size)5475c51f124SMoriah Waterland _z_malloc(size_t size)
5485c51f124SMoriah Waterland {
5495c51f124SMoriah Waterland 	void *tmp;
5505c51f124SMoriah Waterland 
5515c51f124SMoriah Waterland 	if ((tmp = (void *) malloc(size)) == NULL) {
5525c51f124SMoriah Waterland 		fatal_err_func(ERR_MALLOC_FAIL);
5535c51f124SMoriah Waterland 		return (NULL);
5545c51f124SMoriah Waterland 	} else
5555c51f124SMoriah Waterland 		return (tmp);
5565c51f124SMoriah Waterland }
5575c51f124SMoriah Waterland 
5585c51f124SMoriah Waterland /*
5595c51f124SMoriah Waterland  * _z_realloc()
5605c51f124SMoriah Waterland  *	Calls realloc() with the specfied parameters. _z_realloc()
5615c51f124SMoriah Waterland  *	checks for realloc failures and adjusts the return value
5625c51f124SMoriah Waterland  *	automatically.
5635c51f124SMoriah Waterland  * Parameters:
5645c51f124SMoriah Waterland  *	ptr	- pointer to existing data block
5655c51f124SMoriah Waterland  * 	size	- number of bytes additional
5665c51f124SMoriah Waterland  * Return:
5675c51f124SMoriah Waterland  *	NULL	- realloc() failed
5685c51f124SMoriah Waterland  *	void *	- pointer to realloc'd structured
5695c51f124SMoriah Waterland  * Status:
5705c51f124SMoriah Waterland  *	public
5715c51f124SMoriah Waterland  */
5725c51f124SMoriah Waterland void *
_z_realloc(void * ptr,size_t size)5735c51f124SMoriah Waterland _z_realloc(void *ptr, size_t size)
5745c51f124SMoriah Waterland {
5755c51f124SMoriah Waterland 	void *tmp;
5765c51f124SMoriah Waterland 
5775c51f124SMoriah Waterland 	if ((tmp = (void *)realloc(ptr, size)) == (void *)NULL) {
5785c51f124SMoriah Waterland 		fatal_err_func(ERR_MALLOC_FAIL);
5795c51f124SMoriah Waterland 		return ((void *)NULL);
5805c51f124SMoriah Waterland 	} else
5815c51f124SMoriah Waterland 		return (tmp);
5825c51f124SMoriah Waterland }
5835c51f124SMoriah Waterland 
5845c51f124SMoriah Waterland /*
5855c51f124SMoriah Waterland  * z_strdup()
5865c51f124SMoriah Waterland  *	Allocate space for the string from the heap, copy 'str' into it,
5875c51f124SMoriah Waterland  *	and return a pointer to it.
5885c51f124SMoriah Waterland  * Parameters:
5895c51f124SMoriah Waterland  *	str	- string to duplicate
5905c51f124SMoriah Waterland  * Return:
5915c51f124SMoriah Waterland  *	NULL	- duplication failed or 'str' was NULL
5925c51f124SMoriah Waterland  * 	char *	- pointer to newly allocated/initialized structure
5935c51f124SMoriah Waterland  * Status:
5945c51f124SMoriah Waterland  *	public
5955c51f124SMoriah Waterland  */
5965c51f124SMoriah Waterland void *
_z_strdup(char * str)5975c51f124SMoriah Waterland _z_strdup(char *str)
5985c51f124SMoriah Waterland {
5995c51f124SMoriah Waterland 	char *tmp;
6005c51f124SMoriah Waterland 
6015c51f124SMoriah Waterland 	if (str == NULL)
6025c51f124SMoriah Waterland 		return ((char *)NULL);
6035c51f124SMoriah Waterland 
6045c51f124SMoriah Waterland 	if ((tmp = strdup(str)) == NULL) {
6055c51f124SMoriah Waterland 		fatal_err_func(ERR_MALLOC_FAIL);
6065c51f124SMoriah Waterland 		return ((char *)NULL);
6075c51f124SMoriah Waterland 	} else
6085c51f124SMoriah Waterland 		return (tmp);
6095c51f124SMoriah Waterland }
610