5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Module: zones.c
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Group: libinstzones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Provide "zones" interface for install consolidation code
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_close_file_descriptors - close a file descriptor "a_fd" not in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * list "a_fds"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_echo - Output an interactive message if interaction is enabled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_echoDebug - Output a debugging message if debugging is enabled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_is_directory - determine if specified path exists and is a directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_program_error - Output an error message to the appropriate destinations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_pluginCatchSigint - SIGINT/SIGHUP interrupt handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_running_in_global_zone - Determine if this process is running in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_zones_are_implemented - Determine if zones are supported by the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * current system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_brands_are_implemented - determine if branded zones are implemented on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * System includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/param.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdarg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stropts.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dlfcn.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * local includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "instzones_lib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "zones_strings.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Private structures
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * these dynamic libraries are required in order to use the branded zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * functionality. If these libraries are not available at runtime,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * then the zones we find are assumed to be native zones.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define BRAND1_LIBRARY "libbrand.so.1"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define BRAND_LIBRARY "libbrand.so"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Library Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Local Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void error_and_exit(int error_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void (*fatal_err_func)() = &error_and_exit;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* ----------------------- private functions -------------------------- */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * error_and_exit()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Abort routine. An exit code of '2' is used by all applications
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to indicate a non-recoverable fatal error.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameters:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * error_num - error index number:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ERR_MALLOC_FAIL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * none
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Status:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * private
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanderror_and_exit(int error_num)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (error_num == ERR_MALLOC_FAIL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "Allocation of memory failed\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "ERROR: code %d\n", error_num);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global external (public) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_close_file_descriptors
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: close a file descriptor "a_fd" not in the list "a_fds"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function is called from the fdwalk() library function.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the file descriptor passed in is NOT in the list passed in,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the file is closed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_fds - [RO, *RO] - (void *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to list of file descriptors to keep open
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_fd - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * File descriptor to check
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_close_file_descriptors(void *a_fds, int a_fd)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int *fds;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* do not close standard input, output, or error file descriptors */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_fd == STDIN_FILENO || a_fd == STDOUT_FILENO ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_fd == STDERR_FILENO) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no file descriptor retention list, close this file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_fds == (void *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * retention list provided, skip this descriptor if its in the list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fds = (int *)a_fds;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; fds[i] != -1; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fds[i] == a_fd) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* this descriptor not in retention list - close this file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_echo
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Output an interactive message if interaction is enabled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Main method for outputting an interactive message; call to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output interactive message if interation has not been disabled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by a previous call to echoSetFlag(0).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for debugging message to be output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * VARG_LIST - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE1*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_echo(char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char message[MAX_MESSAGE_SIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_format != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return if no progerr function registered */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_global_data._z_echo == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* capture message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) vsnprintf(message, sizeof (message), a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass message to registered function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (_z_global_data._z_echo)("%s", message);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_echoDebug
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Output a debugging message if debugging is enabled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Main method for outputting a debugging message; call to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output debugging message if debugging has been enabled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by a previous call to _z_echoDebugSetFlag(1).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for debugging message to be output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * VARG_LIST - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: format of message will be:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * # [ aaa bbb ccc ] message
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where: aaa - process i.d.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bbb - zone i.d.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ccc - name of program
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for example:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * # [ 25685 0 pkgadd ] unable to get package list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE1*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_echoDebug(char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char message[MAX_MESSAGE_SIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_format != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return if no progerr function registered */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_global_data._z_echo_debug == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* capture message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) vsnprintf(message, sizeof (message), a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass message to registered function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (_z_global_data._z_echo_debug)("%s", message);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_is_directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if specified path exists and is a directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: path - pointer to string representing the path to verify
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns: 0 - directory exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - directory does not exist or is not a directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: errno is set appropriately
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_is_directory(char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(path != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*path != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if path does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(path, &statbuf) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if path is not a directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = ENOTDIR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path exists and is a directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_pluginCatchSigint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: SIGINT/SIGHUP interrupt handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Catch the "SIGINT" and "SIGHUP" signals:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> increment _z_SigReceived global variable
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> propagate signal to "_z_ChildProcessId" if registered (!= -1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: signo - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Signal number that was caught
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_sig_trap(int a_signo)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bump signals received count */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_global_data._z_SigReceived++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if child process registered, propagate signal to child */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_global_data._z_ChildProcessId > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) kill(_z_global_data._z_ChildProcessId, a_signo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_program_error
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Output an error message to the appropriate destinations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: format - [RO, RO*] (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * printf-style format for debugging message to be output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * VARG_LIST - [RO] (?)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * arguments as appropriate to 'format' specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: format of message will be:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * [aaa: ] ERROR: message
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where: aaa - program name (if set)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * message - results of format and arguments
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for example:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ERROR: unable to get package list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE1*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_program_error(char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char message[MAX_MESSAGE_SIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_format != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return if no progerr function registered */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (_z_global_data._z_progerr == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* capture message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) vsnprintf(message, sizeof (message), a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass message to registered function */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (_z_global_data._z_progerr)(MSG_PROG_ERR, message);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_running_in_global_zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Determine if this process is running in the global zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - this process is running in the global zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - this process is running in a nonglobal zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_running_in_global_zone(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid_t zoneid = (zoneid_t)-1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if zones are not implemented, there is no way to tell if zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * are supported or not - in this case, we can only be running in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global zone (since non-global zones cannot exist) so return TRUE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zones_are_implemented() == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get the zone i.d. of the current zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneid = getzoneid();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return TRUE if this is the global zone i.d. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneid == GLOBAL_ZONEID) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return FALSE - not in the global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_zones_are_implemented
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Synopsis: Determine if zones are supported by the current system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_TRUE - zones are supported
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == B_FALSE - zones are not supported
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_zones_are_implemented(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void *libptr = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* locate zone cfg library */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland libptr = dlopen(ZONECFG_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (libptr == (void *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_LIBRARY_NOT_FOUND, ZONECFG_LIBRARY, dlerror());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland libptr = dlopen(ZONECFG1_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return false if library not available */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (libptr == (void *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_LIBRARY_NOT_FOUND, ZONECFG1_LIBRARY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dlerror());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* library available - close handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) dlclose(libptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* locate contract filesystem library */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland libptr = dlopen(CONTRACT_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (libptr == (void *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_LIBRARY_NOT_FOUND, CONTRACT_LIBRARY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dlerror());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland libptr = dlopen(CONTRACT1_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return false if library not available */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (libptr == (void *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_LIBRARY_NOT_FOUND, CONTRACT1_LIBRARY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dlerror());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* library available - close handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) dlclose(libptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_brands_are_implemented(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void *libptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* locate brand library */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland libptr = dlopen(BRAND_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (libptr == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_LIBRARY_NOT_FOUND, BRAND_LIBRARY, dlerror());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland libptr = dlopen(BRAND1_LIBRARY, RTLD_NOW|RTLD_GLOBAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return false if library not available */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (libptr == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _z_echoDebug(DBG_LIBRARY_NOT_FOUND, BRAND1_LIBRARY, dlerror());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* library available - close handle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) dlclose(libptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_calloc()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Allocate 'size' bytes from the heap using calloc()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameters:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * size - number of bytes to allocate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NULL - calloc() failure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * void * - pointer to allocated structure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Status:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * public
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_calloc(size_t size)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void * tmp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((tmp = (void *) malloc(size)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fatal_err_func(ERR_MALLOC_FAIL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(tmp, 0, size);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tmp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_malloc()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Alloc 'size' bytes from heap using malloc()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameters:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * size - number of bytes to malloc
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NULL - malloc() failure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * void * - pointer to allocated structure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Status:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * public
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_malloc(size_t size)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void *tmp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((tmp = (void *) malloc(size)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fatal_err_func(ERR_MALLOC_FAIL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tmp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_realloc()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Calls realloc() with the specfied parameters. _z_realloc()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * checks for realloc failures and adjusts the return value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * automatically.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameters:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ptr - pointer to existing data block
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * size - number of bytes additional
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NULL - realloc() failed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * void * - pointer to realloc'd structured
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Status:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * public
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_realloc(void *ptr, size_t size)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void *tmp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((tmp = (void *)realloc(ptr, size)) == (void *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fatal_err_func(ERR_MALLOC_FAIL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((void *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tmp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * z_strdup()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Allocate space for the string from the heap, copy 'str' into it,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and return a pointer to it.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Parameters:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * str - string to duplicate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NULL - duplication failed or 'str' was NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * char * - pointer to newly allocated/initialized structure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Status:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * public
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_strdup(char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tmp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (str == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((tmp = strdup(str)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fatal_err_func(ERR_MALLOC_FAIL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return ((char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (tmp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}