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/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Module: zones_args.c
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Group: libinstzones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Private functions used by zones library functions to manipulate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * argument lists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public Methods:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
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 */
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 <stdarg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stropts.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.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 * Library Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Local Function Prototypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Global internal (private) declarations
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_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 * Examples:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - to add an argument that specifies a file descriptor:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * int fd;
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE2*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_add_arg(argArray_t *a_args, char *a_format, ...)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *rstr = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char bfr[MAX_CANON];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t vres = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_list ap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_args != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_format != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_format != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * double argument array if array is full
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_args->_aaNumArgs >= a_args->_aaMaxArgs) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int newMax;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **newArgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland newMax = a_args->_aaMaxArgs * 2;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland newArgs = (char **)_z_realloc(a_args->_aaArgs,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (newMax+1) * sizeof (char *));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_args->_aaArgs = newArgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_args->_aaMaxArgs = newMax;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * determine size of argument to add to list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(bfr, sizeof (bfr), a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vres < sizeof (bfr)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* duplicate text already generated in buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rstr = _z_strdup(bfr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate new space for argument to add */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rstr = (char *)_z_malloc(vres+2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate argument to add */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_start(ap, a_format);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vres = vsnprintf(rstr, vres+1, a_format, ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland va_end(ap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add argument to the end of the argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_args->_aaArgs[a_args->_aaNumArgs++] = rstr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_args->_aaArgs[a_args->_aaNumArgs] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successful - return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_free_args(argArray_t *a_args)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int lerrno = errno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_args != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_args->_aaArgs != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free all arguments in the argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = (a_args->_aaNumArgs-1); i >= 0; i--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_args->_aaArgs[i] != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(a_args->_aaArgs[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(a_args->_aaArgs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free argument array structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) free(a_args);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* restore errno */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = lerrno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_get_argc(argArray_t *a_args)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_args->_aaNumArgs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar **
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_get_argv(argArray_t *a_args)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (a_args->_aaArgs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
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 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandargArray_t *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_z_new_args(int initialCount)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland argArray_t *aa;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(initialCount >= 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if no guess on size, then assume 1 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (initialCount == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland initialCount = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate new argument array structure */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aa = (argArray_t *)_z_calloc(sizeof (argArray_t));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allocate initial argument array */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aa->_aaArgs = (char **)_z_calloc((initialCount+1) * sizeof (char *));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize argument indexes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aa->_aaNumArgs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aa->_aaMaxArgs = initialCount;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* successful - return pointer to argument array created */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (aa);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}