pathhost-posix.cpp revision c9579522f347fc3fda6b3f4add0b355981cd7758
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * IPRT - Path Convertions, POSIX.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Copyright (C) 2006-2010 Oracle Corporation
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * available from http://www.virtualbox.org. This file is free software;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * you can redistribute it and/or modify it under the terms of the GNU
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * General Public License (GPL) as published by the Free Software
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * The contents of this file may alternatively be used under the terms
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * of the Common Development and Distribution License Version 1.0
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * VirtualBox OSE distribution, in which case the provisions of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * CDDL are applicable instead of those of the GPL.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * You may elect to license modified versions of this file under the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * terms and conditions of either the GPL or the CDDL or both.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/*******************************************************************************
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync* Header Files *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync*******************************************************************************/
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/*******************************************************************************
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync* Global Variables *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync*******************************************************************************/
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** Initialize once object. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic RTONCE g_OnceInitPathConv = RTONCE_INITIALIZER;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** If set, then we can pass UTF-8 thru directly. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic bool g_fPassthruUtf8 = false;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** The UTF-8 to FS iconv cache entry. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic RTSTRICONV g_enmUtf8ToFsIdx = RTSTRICONV_UTF8_TO_LOCALE;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** The FS to UTF-8 iconv cache entry. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic RTSTRICONV g_enmFsToUtf8Idx = RTSTRICONV_LOCALE_TO_UTF8;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** The codeset we're using. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Do a case insensitive compare where the 2nd string is known and can be case
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * folded when writing the code.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @returns see strcmp.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @param pszStr1 The string to compare against pszLower and
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * pszUpper.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @param pszUpper The upper case edition of the 2nd string.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @param pszLower The lower case edition of the 2nd string.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic int rtPathStrICmp(const char *pszStr1, const char *pszUpper, const char *pszLower)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * Is the specified codeset something we can treat as UTF-8.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @returns true if we can do UTF-8 passthru, false if not.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @param pszCodeset The codeset in question.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic bool rtPathConvInitIsUtf8(const char *pszCodeset)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* Paranoia. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return false;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * Avoid RTStrICmp at this point.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync static struct
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync const char *pszUpper;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync const char *pszLower;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* The default locale. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* 7-bit ASCII. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* UTF-8 */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync for (size_t i = 0; i < RT_ELEMENTS(s_aUtf8Compatible); i++)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync if (!rtPathStrICmp(pszCodeset, s_aUtf8Compatible[i].pszUpper, s_aUtf8Compatible[i].pszLower))
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return true;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return false;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Init once for the path conversion code.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @returns IPRT status code.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @param pvUser1 Unused.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @param pvUser2 Unused.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstatic DECLCALLBACK(int32_t) rtPathConvInitOnce(void *pvUser1, void *pvUser2)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Read the environment variable, no mercy on misconfigs here except that
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * empty values are quietly ignored. (We use a temp buffer for stripping.)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int rc = RTEnvGetEx(RTENV_DEFAULT, RTPATH_CODESET_ENV_VAR, szEnvValue, sizeof(szEnvValue), NULL);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync if (rc != VERR_ENV_VAR_NOT_FOUND && RT_FAILURE(rc))
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync g_fPassthruUtf8 = rtPathConvInitIsUtf8(pszEnvValue);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync size_t cchCodeset = pszCodeset ? strlen(pszCodeset) : sizeof(g_szFsCodeset);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* This shouldn't happen, but we'll manage. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync g_fPassthruUtf8 = rtPathConvInitIsUtf8(pszCodeset);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsyncint rtPathToNative(char const **ppszNativePath, const char *pszPath, const char *pszBasePath)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync int rc = RTOnce(&g_OnceInitPathConv, rtPathConvInitOnce, NULL, NULL);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync rc = rtStrConvert(pszPath, strlen(pszPath), "UTF-8",
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync NOREF(pszBasePath); /* We don't query the FS for codeset preferences. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsyncvoid rtPathFreeNative(char const *pszNativePath, const char *pszPath)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncint rtPathFromNative(const char **ppszPath, const char *pszNativePath, const char *pszBasePath)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync int rc = RTOnce(&g_OnceInitPathConv, rtPathConvInitOnce, NULL, NULL);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync rc = rtUtf8Length(pszNativePath, RTSTR_MAX, &cCpsIgnored, &cchNativePath);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *ppszPath = pszPath = RTStrAlloc(cchNativePath + 1);
return rc;
&& pszPath)
int rtPathFromNativeCopy(char *pszPath, size_t cbPath, const char *pszNativePath, const char *pszBasePath)
else if (cbPath)
return rc;
return rc;