65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync/* $Id$ */
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Environment, Generic.
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync */
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2012 Oracle Corporation
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync *
804197ca1d56719343cd21af782ddc2c695a6760vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
804197ca1d56719343cd21af782ddc2c695a6760vboxsync * available from http://www.virtualbox.org. This file is free software;
804197ca1d56719343cd21af782ddc2c695a6760vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * terms and conditions of either the GPL or the CDDL or both.
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync */
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync/*******************************************************************************
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync* Header Files *
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync*******************************************************************************/
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync#include <iprt/env.h>
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync#include "internal/iprt.h"
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync#include <iprt/assert.h>
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync#include <iprt/alloc.h>
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#include <iprt/alloca.h>
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync#include <iprt/string.h>
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync#include <iprt/sort.h>
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync#include <iprt/err.h>
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#include "internal/magics.h"
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#include <stdlib.h>
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#if !defined(RT_OS_WINDOWS)
76fa7570c3b6268d459098f86d74d369c1d85f4cvboxsync# include <unistd.h>
76fa7570c3b6268d459098f86d74d369c1d85f4cvboxsync#endif
46fee3dbfe26f500824ef463ac239b6cb5d09522vboxsync#ifdef RT_OS_DARWIN
46fee3dbfe26f500824ef463ac239b6cb5d09522vboxsync# include <crt_externs.h>
46fee3dbfe26f500824ef463ac239b6cb5d09522vboxsync#endif
4157c84dffb94fe976739ad709e4fd95d22c6667vboxsync#if defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) || defined(RT_OS_NETBSD) || defined(RT_OS_OPENBSD)
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_BEGIN
6988e736149e8800875f9fbb001a6018926d6562vboxsyncextern char **environ;
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncRT_C_DECLS_END
e7e8a6cb1597db3e0a1a83733e1d90e7a1688647vboxsync#endif
e7e8a6cb1597db3e0a1a83733e1d90e7a1688647vboxsync
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync/*******************************************************************************
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync* Defined Constants And Macros *
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync*******************************************************************************/
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync/** The allocation granularity of the RTENVINTERNAL::papszEnv memory. */
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#define RTENV_GROW_SIZE 16
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync/** Macro that unlocks the specified environment block. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#define RTENV_LOCK(pEnvInt) do { } while (0)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync/** Macro that unlocks the specified environment block. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#define RTENV_UNLOCK(pEnvInt) do { } while (0)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync/** @def RTENV_HAVE_WENVIRON
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync * Indicates that we have a _wenviron variable with UTF-16 strings that we
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync * better use instead of the current-cp strings in environ. */
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#if defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync# define RTENV_HAVE_WENVIRON 1
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync/** @def RTENV_IMPLEMENTS_UTF8_DEFAULT_ENV_API
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync * Indicates the RTEnv*Utf8 APIs are implemented. */
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#if defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync# define RTENV_IMPLEMENTS_UTF8_DEFAULT_ENV_API 1
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync/*******************************************************************************
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync* Structures and Typedefs *
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync*******************************************************************************/
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync/**
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * The internal representation of a (non-default) environment.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsynctypedef struct RTENVINTERNAL
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /** Magic value . */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync uint32_t u32Magic;
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /** Number of variables in the array.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * This does not include the terminating NULL entry. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t cVars;
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /** Capacity (allocated size) of the array.
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * This includes space for the terminating NULL element (for compatibility
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * with the C library), so that c <= cCapacity - 1. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t cAllocated;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /** Array of environment variables. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char **papszEnv;
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /** Array of environment variables in the process CP.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * This get (re-)constructed when RTEnvGetExecEnvP method is called. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char **papszEnvOtherCP;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync /** The compare function we're using. */
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync DECLCALLBACKMEMBER(int, pfnCompare)(const char *psz1, const char *psz2, size_t cchMax);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync} RTENVINTERNAL, *PRTENVINTERNAL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync/**
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * Internal worker that resolves the pointer to the default
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * process environment. (environ)
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync *
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * @returns Pointer to the default environment.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * This may be NULL.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncstatic const char * const *rtEnvDefault(void)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#ifdef RT_OS_DARWIN
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync return *(_NSGetEnviron());
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync#else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync return environ;
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync#endif
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync}
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync/**
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Internal worker that creates an environment handle with a specified capacity.
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync *
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * @returns IPRT status code.
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync * @param ppIntEnv Where to store the result.
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync * @param cAllocated The initial array size.
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync * @param fCaseSensitive Whether the environment block is case sensitive or
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync * not.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsyncstatic int rtEnvCreate(PRTENVINTERNAL *ppIntEnv, size_t cAllocated, bool fCaseSensitive)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync{
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync /*
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync * Allocate environment handle.
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv = (PRTENVINTERNAL)RTMemAlloc(sizeof(*pIntEnv));
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync if (pIntEnv)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync /*
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync * Pre-allocate the variable array.
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->u32Magic = RTENV_MAGIC;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync pIntEnv->pfnCompare = fCaseSensitive ? RTStrNCmp : RTStrNICmp;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnvOtherCP = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->cVars = 0;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->cAllocated = RT_ALIGN_Z(RT_MAX(cAllocated, RTENV_GROW_SIZE), RTENV_GROW_SIZE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv = (char **)RTMemAllocZ(sizeof(pIntEnv->papszEnv[0]) * pIntEnv->cAllocated);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pIntEnv->papszEnv)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync *ppIntEnv = pIntEnv;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync return VINF_SUCCESS;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync RTMemFree(pIntEnv);
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync return VERR_NO_MEMORY;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsyncRTDECL(int) RTEnvCreate(PRTENV pEnv)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pEnv, VERR_INVALID_POINTER);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync return rtEnvCreate(pEnv, RTENV_GROW_SIZE, false /*fCaseSensitive*/);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvCreate);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsyncRTDECL(int) RTEnvDestroy(RTENV Env)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Ignore NIL_RTENV and validate input.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if ( Env == NIL_RTENV
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync || Env == RTENV_DEFAULT)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync return VINF_SUCCESS;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv = Env;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Do the cleanup.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_LOCK(pIntEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->u32Magic++;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t iVar = pIntEnv->cVars;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync while (iVar-- > 0)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pIntEnv->papszEnv[iVar]);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTMemFree(pIntEnv->papszEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pIntEnv->papszEnvOtherCP)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (iVar = 0; pIntEnv->papszEnvOtherCP[iVar]; iVar++)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pIntEnv->papszEnvOtherCP[iVar]);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnvOtherCP[iVar] = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTMemFree(pIntEnv->papszEnvOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnvOtherCP = NULL;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*RTCritSectDelete(&pIntEnv->CritSect) */
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync RTMemFree(pIntEnv);
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync return VINF_SUCCESS;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvDestroy);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncRTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Validate input and figure out how many variable to clone and where to get them.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync bool fCaseSensitive = true;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t cVars;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const char * const *papszEnv;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#ifdef RTENV_HAVE_WENVIRON
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync PCRTUTF16 const * papwszEnv;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnvToClone;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pEnv, VERR_INVALID_POINTER);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (EnvToClone == RTENV_DEFAULT)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync cVars = 0;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnvToClone = NULL;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#ifdef RTENV_HAVE_WENVIRON
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync papszEnv = NULL;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync papwszEnv = (PCRTUTF16 * const)_wenviron;
d6ac6e5fc9fef6b2ee32203b0a821e6efc44c674vboxsync if (!papwszEnv)
d6ac6e5fc9fef6b2ee32203b0a821e6efc44c674vboxsync {
d6ac6e5fc9fef6b2ee32203b0a821e6efc44c674vboxsync _wgetenv(L"Path"); /* Force the CRT to initalize it. */
d6ac6e5fc9fef6b2ee32203b0a821e6efc44c674vboxsync papwszEnv = (PCRTUTF16 * const)_wenviron;
d6ac6e5fc9fef6b2ee32203b0a821e6efc44c674vboxsync }
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync if (papwszEnv)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync while (papwszEnv[cVars])
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync cVars++;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papszEnv = rtEnvDefault();
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (papszEnv)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync while (papszEnv[cVars])
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync cVars++;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync /* DOS systems was case insensitive. A prime example is the 'Path'
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync variable on windows which turns into the 'PATH' variable. */
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync fCaseSensitive = false;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnvToClone = EnvToClone;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pIntEnvToClone, VERR_INVALID_HANDLE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pIntEnvToClone->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_LOCK(pIntEnvToClone);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papszEnv = pIntEnvToClone->papszEnv;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync cVars = pIntEnvToClone->cVars;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Create the duplicate.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv;
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, fCaseSensitive);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync if (RT_SUCCESS(rc))
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->cVars = cVars;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[pIntEnv->cVars] = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (EnvToClone == RTENV_DEFAULT)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /* ASSUMES the default environment is in the current codepage. */
3d5d761b58f80f44f4e751bbc61caf2de4d7007cvboxsync size_t iDst = 0;
e4cda205c8155b43f1b07fbb328ea7d592a8d994vboxsync for (size_t iSrc = 0; iSrc < cVars; iSrc++)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#ifdef RTENV_HAVE_WENVIRON
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync int rc2 = RTUtf16ToUtf8(papwszEnv[iSrc], &pIntEnv->papszEnv[iDst]);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#else
e4cda205c8155b43f1b07fbb328ea7d592a8d994vboxsync int rc2 = RTStrCurrentCPToUtf8(&pIntEnv->papszEnv[iDst], papszEnv[iSrc]);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
3d5d761b58f80f44f4e751bbc61caf2de4d7007cvboxsync if (RT_SUCCESS(rc2))
3d5d761b58f80f44f4e751bbc61caf2de4d7007cvboxsync iDst++;
3d5d761b58f80f44f4e751bbc61caf2de4d7007cvboxsync else if (rc2 == VERR_NO_TRANSLATION)
3d5d761b58f80f44f4e751bbc61caf2de4d7007cvboxsync rc = VWRN_ENV_NOT_FULLY_TRANSLATED;
3d5d761b58f80f44f4e751bbc61caf2de4d7007cvboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
e4cda205c8155b43f1b07fbb328ea7d592a8d994vboxsync pIntEnv->cVars = iDst;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTEnvDestroy(pIntEnv);
8f2f51347c7b5fe7c697debe7c2e46b46dd16489vboxsync return rc2;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
e4cda205c8155b43f1b07fbb328ea7d592a8d994vboxsync pIntEnv->cVars = iDst;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (size_t iVar = 0; iVar < cVars; iVar++)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszVar = RTStrDup(papszEnv[iVar]);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_UNLIKELY(!pszVar))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnvToClone);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->cVars = iVar;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTEnvDestroy(pIntEnv);
8f2f51347c7b5fe7c697debe7c2e46b46dd16489vboxsync return VERR_NO_STR_MEMORY;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[iVar] = pszVar;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /* done */
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync *pEnv = pIntEnv;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pIntEnvToClone)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnvToClone);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync return rc;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvClone);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncRTDECL(int) RTEnvPutEx(RTENV Env, const char *pszVarEqualValue)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync int rc;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pszVarEqualValue, VERR_INVALID_POINTER);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const char *pszEq = strchr(pszVarEqualValue, '=');
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (!pszEq)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTEnvUnsetEx(Env, pszVarEqualValue);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Make a copy of the variable name so we can terminate it
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * properly and then pass the request on to RTEnvSetEx.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const char *pszValue = pszEq + 1;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t cchVar = pszEq - pszVarEqualValue;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync Assert(cchVar < 1024);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszVar = (char *)alloca(cchVar + 1);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync memcpy(pszVar, pszVarEqualValue, cchVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pszVar[cchVar] = '\0';
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTEnvSetEx(Env, pszVar, pszValue);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync return rc;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvPutEx);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncRTDECL(int) RTEnvSetEx(RTENV Env, const char *pszVar, const char *pszValue)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pszVar, VERR_INVALID_POINTER);
46fee3dbfe26f500824ef463ac239b6cb5d09522vboxsync AssertReturn(*pszVar, VERR_INVALID_PARAMETER);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pszValue, VERR_INVALID_POINTER);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync int rc;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (Env == RTENV_DEFAULT)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#ifdef RT_OS_WINDOWS
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync rc = RTEnvSetUtf8(pszVar, pszValue);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#else
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Since RTEnvPut isn't UTF-8 clean and actually expects the strings
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * to be in the current code page (codeset), we'll do the necessary
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * conversions here.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszVarOtherCP;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTStrUtf8ToCurrentCP(&pszVarOtherCP, pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_SUCCESS(rc))
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszValueOtherCP;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTStrUtf8ToCurrentCP(&pszValueOtherCP, pszValue);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_SUCCESS(rc))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTEnvSet(pszVarOtherCP, pszValueOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pszValueOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pszVarOtherCP);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv = Env;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Create the variable string.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const size_t cchVar = strlen(pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const size_t cchValue = strlen(pszValue);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszEntry = (char *)RTMemAlloc(cchVar + cchValue + 2);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pszEntry)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync memcpy(pszEntry, pszVar, cchVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pszEntry[cchVar] = '=';
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync memcpy(&pszEntry[cchVar + 1], pszValue, cchValue + 1);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_LOCK(pIntEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Find the location of the variable. (iVar = cVars if new)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VINF_SUCCESS;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t iVar;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (iVar = 0; iVar < pIntEnv->cVars; iVar++)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync && pIntEnv->papszEnv[iVar][cchVar] == '=')
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync break;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (iVar < pIntEnv->cVars)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Replace the current entry. Simple.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTMemFree(pIntEnv->papszEnv[iVar]);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[iVar] = pszEntry;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * Adding a new variable. Resize the array if required
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * and then insert the new value at the end.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pIntEnv->cVars + 2 > pIntEnv->cAllocated)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync void *pvNew = RTMemRealloc(pIntEnv->papszEnv, sizeof(char *) * (pIntEnv->cAllocated + RTENV_GROW_SIZE));
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (!pvNew)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VERR_NO_MEMORY;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv = (char **)pvNew;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->cAllocated += RTENV_GROW_SIZE;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (size_t iNewVar = pIntEnv->cVars; iNewVar < pIntEnv->cAllocated; iNewVar++)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[iNewVar] = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_SUCCESS(rc))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[iVar] = pszEntry;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[iVar + 1] = NULL; /* this isn't really necessary, but doesn't hurt. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->cVars++;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync Assert(pIntEnv->cVars == iVar + 1);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_FAILURE(rc))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTMemFree(pszEntry);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VERR_NO_MEMORY;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync return rc;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvSetEx);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncRTDECL(int) RTEnvUnsetEx(RTENV Env, const char *pszVar)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pszVar, VERR_INVALID_POINTER);
46fee3dbfe26f500824ef463ac239b6cb5d09522vboxsync AssertReturn(*pszVar, VERR_INVALID_PARAMETER);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync int rc;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (Env == RTENV_DEFAULT)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#ifdef RTENV_IMPLEMENTS_UTF8_DEFAULT_ENV_API
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync rc = RTEnvUnsetUtf8(pszVar);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#else
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Since RTEnvUnset isn't UTF-8 clean and actually expects the strings
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * to be in the current code page (codeset), we'll do the necessary
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * conversions here.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszVarOtherCP;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTStrUtf8ToCurrentCP(&pszVarOtherCP, pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_SUCCESS(rc))
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTEnvUnset(pszVarOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pszVarOtherCP);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv = Env;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_LOCK(pIntEnv);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Remove all variable by the given name.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VINF_ENV_VAR_NOT_FOUND;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const size_t cchVar = strlen(pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t iVar;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (iVar = 0; iVar < pIntEnv->cVars; iVar++)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync && pIntEnv->papszEnv[iVar][cchVar] == '=')
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTMemFree(pIntEnv->papszEnv[iVar]);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->cVars--;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pIntEnv->cVars > 0)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[iVar] = pIntEnv->papszEnv[pIntEnv->cVars];
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnv[pIntEnv->cVars] = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VINF_SUCCESS;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /* no break, there could be more. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnv);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync return rc;
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvUnsetEx);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncRTDECL(int) RTEnvGetEx(RTENV Env, const char *pszVar, char *pszValue, size_t cbValue, size_t *pcchActual)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pszVar, VERR_INVALID_POINTER);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrNullReturn(pszValue, VERR_INVALID_POINTER);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrNullReturn(pcchActual, VERR_INVALID_POINTER);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pcchActual || (pszValue && cbValue), VERR_INVALID_PARAMETER);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pcchActual)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync *pcchActual = 0;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync int rc;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (Env == RTENV_DEFAULT)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#ifdef RTENV_IMPLEMENTS_UTF8_DEFAULT_ENV_API
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync rc = RTEnvGetUtf8(pszVar, pszValue, cbValue, pcchActual);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#else
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Since RTEnvGet isn't UTF-8 clean and actually expects the strings
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * to be in the current code page (codeset), we'll do the necessary
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * conversions here.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszVarOtherCP;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTStrUtf8ToCurrentCP(&pszVarOtherCP, pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_SUCCESS(rc))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const char *pszValueOtherCP = RTEnvGet(pszVarOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pszVarOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pszValueOtherCP)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszValueUtf8;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = RTStrCurrentCPToUtf8(&pszValueUtf8, pszValueOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_SUCCESS(rc))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VINF_SUCCESS;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t cch = strlen(pszValueUtf8);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pcchActual)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync *pcchActual = cch;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pszValue && cbValue)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (cch < cbValue)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync memcpy(pszValue, pszValueUtf8, cch + 1);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VERR_BUFFER_OVERFLOW;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
3b527214428f3eb7c7055b01906134599d3fe17evboxsync RTStrFree(pszValueUtf8);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VERR_ENV_VAR_NOT_FOUND;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv = Env;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_LOCK(pIntEnv);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Locate the first variable and return it to the caller.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VERR_ENV_VAR_NOT_FOUND;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const size_t cchVar = strlen(pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t iVar;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (iVar = 0; iVar < pIntEnv->cVars; iVar++)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync && pIntEnv->papszEnv[iVar][cchVar] == '=')
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VINF_SUCCESS;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const char *pszValueOrg = pIntEnv->papszEnv[iVar] + cchVar + 1;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync size_t cch = strlen(pszValueOrg);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pcchActual)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync *pcchActual = cch;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pszValue && cbValue)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (cch < cbValue)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync memcpy(pszValue, pszValueOrg, cch + 1);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync rc = VERR_BUFFER_OVERFLOW;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync break;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync return rc;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvGetEx);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncRTDECL(bool) RTEnvExistEx(RTENV Env, const char *pszVar)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pszVar, false);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync bool fExists = false;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (Env == RTENV_DEFAULT)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#ifdef RTENV_IMPLEMENTS_UTF8_DEFAULT_ENV_API
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync fExists = RTEnvExistsUtf8(pszVar);
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#else
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Since RTEnvExist isn't UTF-8 clean and actually expects the strings
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * to be in the current code page (codeset), we'll do the necessary
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * conversions here.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char *pszVarOtherCP;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync int rc = RTStrUtf8ToCurrentCP(&pszVarOtherCP, pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_SUCCESS(rc))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync fExists = RTEnvExist(pszVarOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pszVarOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync#endif
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv = Env;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pIntEnv, false);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, false);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_LOCK(pIntEnv);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Simple search.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const size_t cchVar = strlen(pszVar);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++)
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync && pIntEnv->papszEnv[iVar][cchVar] == '=')
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync fExists = true;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync break;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync return fExists;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvExistEx);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsyncRTDECL(char const * const *) RTEnvGetExecEnvP(RTENV Env)
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync{
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync const char * const *papszRet;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (Env == RTENV_DEFAULT)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
dbc6ecd6a6e372b8dcdf31d68bdab2d5b5e604d2vboxsync /** @todo fix this API it's fundamentally wrong! */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papszRet = rtEnvDefault();
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (!papszRet)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync static const char * const s_papszDummy[2] = { NULL, NULL };
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papszRet = &s_papszDummy[0];
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync else
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync PRTENVINTERNAL pIntEnv = Env;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertPtrReturn(pIntEnv, NULL);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, NULL);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_LOCK(pIntEnv);
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync /*
db55f7b1060a6a72704b5369a8e776c59e5e4f64vboxsync * Free any old envp.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (pIntEnv->papszEnvOtherCP)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (size_t iVar = 0; pIntEnv->papszEnvOtherCP[iVar]; iVar++)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTStrFree(pIntEnv->papszEnvOtherCP[iVar]);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnvOtherCP[iVar] = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTMemFree(pIntEnv->papszEnvOtherCP);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync pIntEnv->papszEnvOtherCP = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /*
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync * Construct a new envp with the strings in the process code set.
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync char **papsz;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papszRet = pIntEnv->papszEnvOtherCP = papsz = (char **)RTMemAlloc(sizeof(char *) * (pIntEnv->cVars + 1));
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (papsz)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papsz[pIntEnv->cVars] = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++)
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync int rc = RTStrUtf8ToCurrentCP(&papsz[iVar], pIntEnv->papszEnv[iVar]);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync if (RT_FAILURE(rc))
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync {
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync /* RTEnvDestroy / we cleans up later. */
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papsz[iVar] = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync AssertRC(rc);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync papszRet = NULL;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync break;
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync RTENV_UNLOCK(pIntEnv);
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync }
ababd7e83ee3d23c5191a0d3802f10764df69e36vboxsync return papszRet;
65a755c25b49d32c914e2d569fcdfb766e1ee879vboxsync}
aa4bcf0a4b2db3ac352b56a291d49cb8d4b66d32vboxsyncRT_EXPORT_SYMBOL(RTEnvGetExecEnvP);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync/**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * RTSort callback for comparing two environment variables.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync *
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * @returns -1, 0, 1. See PFNRTSORTCMP.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * @param pvElement1 Variable 1.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * @param pvElement2 Variable 2.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * @param pvUser Ignored.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync */
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsyncDECLCALLBACK(int) rtEnvSortCompare(const void *pvElement1, const void *pvElement2, void *pvUser)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync{
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync NOREF(pvUser);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync int iDiff = strcmp((const char *)pvElement1, (const char *)pvElement2);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (iDiff < 0)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync iDiff = -1;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync else if (iDiff > 0)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync iDiff = 1;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync return iDiff;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync}
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsyncRTDECL(int) RTEnvQueryUtf16Block(RTENV hEnv, PRTUTF16 *ppwszzBlock)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync{
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync RTENV hClone = NIL_RTENV;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync PRTENVINTERNAL pIntEnv;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync int rc;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync /*
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * Validate / simplify input.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync */
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (hEnv == RTENV_DEFAULT)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync rc = RTEnvClone(&hClone, RTENV_DEFAULT);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (RT_FAILURE(rc))
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync return rc;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync pIntEnv = hClone;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync else
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync pIntEnv = hEnv;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
967369edbf395abf6877ef78792ac81ffde99be7vboxsync rc = VINF_SUCCESS;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync RTENV_LOCK(pIntEnv);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync /*
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * Sort it first.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync */
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync RTSortApvShell((void **)pIntEnv->papszEnv, pIntEnv->cVars, rtEnvSortCompare, pIntEnv);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync /*
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * Calculate the size.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync */
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync size_t cwc;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync size_t cwcTotal = 2;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync rc = RTStrCalcUtf16LenEx(pIntEnv->papszEnv[iVar], RTSTR_MAX, &cwc);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync AssertRCBreak(rc);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync cwcTotal += cwc + 1;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync PRTUTF16 pwszzBlock = NULL;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (RT_SUCCESS(rc))
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync /*
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync * Perform the conversion.
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync */
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync PRTUTF16 pwszz = pwszzBlock = (PRTUTF16)RTMemAlloc(cwcTotal * sizeof(RTUTF16));
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (pwszz)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync size_t cwcLeft = cwcTotal;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync rc = RTStrToUtf16Ex(pIntEnv->papszEnv[iVar], RTSTR_MAX,
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync &pwszz, cwcTotal - (pwszz - pwszzBlock), &cwc);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync AssertRCBreak(rc);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync pwszz += cwc + 1;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync cwcLeft -= cwc + 1;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync AssertBreakStmt(cwcLeft >= 2, rc = VERR_INTERNAL_ERROR_3);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync AssertStmt(cwcLeft == 2 || RT_FAILURE(rc), rc = VERR_INTERNAL_ERROR_2);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (RT_SUCCESS(rc))
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync pwszz[0] = '\0';
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync pwszz[1] = '\0';
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync else
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync {
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync RTMemFree(pwszzBlock);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync pwszzBlock = NULL;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync else
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync rc = VERR_NO_MEMORY;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync }
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync RTENV_UNLOCK(pIntEnv);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (hClone != NIL_RTENV)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync RTEnvDestroy(hClone);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync if (RT_SUCCESS(rc))
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync *ppwszzBlock = pwszzBlock;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync return rc;
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync}
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsyncRT_EXPORT_SYMBOL(RTEnvGetExecEnvP);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsyncRTDECL(void) RTEnvFreeUtf16Block(PRTUTF16 pwszzBlock)
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync{
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync RTMemFree(pwszzBlock);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync}
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsyncRT_EXPORT_SYMBOL(RTEnvFreeUtf16Block);
98ac5f06a60dbc35241635f0d146c3d4ff55c727vboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsyncRTDECL(uint32_t) RTEnvCountEx(RTENV hEnv)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync{
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync PRTENVINTERNAL pIntEnv = hEnv;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync AssertPtrReturn(pIntEnv, UINT32_MAX);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, UINT32_MAX);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync RTENV_LOCK(pIntEnv);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync uint32_t cVars = (uint32_t)pIntEnv->cVars;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync RTENV_UNLOCK(pIntEnv);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync return cVars;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync}
7757e065b2ef522ec99a434fbeeae8665a36543avboxsyncRT_EXPORT_SYMBOL(RTEnvCountEx);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsyncRTDECL(uint32_t) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size_t cbVar, char *pszValue, size_t cbValue)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync{
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync PRTENVINTERNAL pIntEnv = hEnv;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync AssertPtrReturn(pIntEnv, UINT32_MAX);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, UINT32_MAX);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync if (cbVar)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync AssertPtrReturn(pszVar, VERR_INVALID_POINTER);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync if (cbValue)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync AssertPtrReturn(pszValue, VERR_INVALID_POINTER);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync RTENV_LOCK(pIntEnv);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync int rc;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync if (iVar < pIntEnv->cVars)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync {
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync const char *pszSrcVar = pIntEnv->papszEnv[iVar];
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync const char *pszSrcValue = strchr(pszSrcVar, '=');
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync bool fHasEqual = pszSrcValue != NULL;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync if (pszSrcValue)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync pszSrcValue++;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync else
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync pszSrcValue = strchr(pszSrcVar, '\0');
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync rc = VINF_SUCCESS;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync if (cbVar)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync rc = RTStrCopyEx(pszVar, cbVar, pszSrcVar, pszSrcValue - pszSrcVar - fHasEqual);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync if (cbValue)
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync {
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync int rc2 = RTStrCopy(pszValue, cbValue, pszSrcValue);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync rc = rc2;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync }
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync }
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync else
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync rc = VERR_ENV_VAR_NOT_FOUND;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync RTENV_UNLOCK(pIntEnv);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync return rc;
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync}
7757e065b2ef522ec99a434fbeeae8665a36543avboxsyncRT_EXPORT_SYMBOL(RTEnvGetByIndexEx);
7757e065b2ef522ec99a434fbeeae8665a36543avboxsync