5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Group: libinstzones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Private functions used by zones library functions to manipulate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * argument lists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_add_arg - add new argument to argument array for use in exec() calls
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_free_args - free all storage contained in an argument array previously
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_get_argc - return (int) argc count from argument array
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_get_argv - return (char **)argv pointer from argument array
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_new_args - create a new argument array for use in exec() calls
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * System includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * local includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Private structures
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Library Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Local Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Global internal (private) declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global external (public) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_add_arg
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: add new argument to argument array for use in exec() calls
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_args - [RO, *RW] - (argArray_t *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to argument array (previously allocated via
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a call to _z_new_args) to add the argument to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_format - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to "printf(3C)" style format argument
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ... - [RO, *RO] - (varies)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments as appropriate for format argument specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_TRUE - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - failure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - to add an argument that specifies a file descriptor:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_add_arg(aa, "/proc/self/fd/%d", fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - to add a flag or other known text:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_add_arg(aa, "-s")
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - to add random text:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * char *random_text;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * _z_add_arg(aa, "%s", random_text);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_add_arg(argArray_t *a_args, char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * double argument array if array is full
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_args->_aaNumArgs >= a_args->_aaMaxArgs) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland newArgs = (char **)_z_realloc(a_args->_aaArgs,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * determine size of argument to add to list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, sizeof (bfr), a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * use the expanded argument if it will fit in the built in buffer,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise, allocate space to hold the argument
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate text already generated in buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate new space for argument to add */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate argument to add */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add argument to the end of the argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_args->_aaArgs[a_args->_aaNumArgs++] = rstr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_args->_aaArgs[a_args->_aaNumArgs] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successful - return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_free_args
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: free all storage contained in an argument array previously
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * allocated by a call to _z_new_args
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_args - [RO, *RW] - (argArray_t *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to argument array (previously allocated via
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a call to _z_new_args) to free
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: preserves errno (usually called right after e_execCmd*())
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free all arguments in the argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = (a_args->_aaNumArgs-1); i >= 0; i--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free argument array structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* restore errno */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_get_argc
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: return (int) argc count from argument array
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_args - [RO, *RW] - (argArray_t *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to argument array (previously allocated via
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a call to _z_new_args) to return argc count for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Count of the number of arguments in the argument array
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * suitable for use in an exec*() call
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_get_argv
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: return (char **)argv pointer from argument array
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_args - [RO, *RW] - (argArray_t *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to argument array (previously allocated via
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a call to _z_new_args) to return argv pointer for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: char **
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to (char **)argv pointer suitable for use
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in an exec*() call
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: the actual character array is always terminated with a NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _z_new_args
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: create a new argument array for use in exec() calls
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: initialCount - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Initial number of elements to populate the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * argument array with - use best guess
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: argArray_t *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to argument array that can be used in other
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * functions that accept it as an argument
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == (argArray_t *)NULL - error
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: you must call _z_free_args() when the returned argument array is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * no longer needed so that all storage used can be freed up.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no guess on size, then assume 1 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate new argument array structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aa = (argArray_t *)_z_calloc(sizeof (argArray_t));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate initial argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aa->_aaArgs = (char **)_z_calloc((initialCount+1) * sizeof (char *));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize argument indexes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successful - return pointer to argument array created */