1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync/* $Id$ */
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync/** @file
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * IPRT - RTPathJoinA.
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync */
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync/*
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * Copyright (C) 2010 Oracle Corporation
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync *
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * available from http://www.virtualbox.org. This file is free software;
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * General Public License (GPL) as published by the Free Software
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync *
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * The contents of this file may alternatively be used under the terms
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * of the Common Development and Distribution License Version 1.0
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * VirtualBox OSE distribution, in which case the provisions of the
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * CDDL are applicable instead of those of the GPL.
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync *
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * You may elect to license modified versions of this file under the
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * terms and conditions of either the GPL or the CDDL or both.
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync */
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync/*******************************************************************************
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync* Header Files *
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync*******************************************************************************/
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync#include "internal/iprt.h"
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync#include <iprt/path.h>
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync#include <iprt/assert.h>
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync#include <iprt/err.h>
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync#include <iprt/string.h>
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsyncRTDECL(char *) RTPathJoinA(const char *pszPathSrc, const char *pszAppend)
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync{
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync AssertPtr(pszAppend);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync AssertPtr(pszPathSrc);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync /*
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync * The easy way: Allocate a buffer and call RTPathAppend till it succeeds.
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync */
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync size_t cchPathSrc = strlen(pszPathSrc);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync size_t cchAppend = strlen(pszAppend);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync size_t cbPathDst = cchPathSrc + cchAppend + 4;
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync char *pszPathDst = RTStrAlloc(cbPathDst);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync if (pszPathDst)
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync {
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync memcpy(pszPathDst, pszPathSrc, cchPathSrc + 1);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync int rc = RTPathAppend(pszPathDst, cbPathDst, pszAppend);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync if (RT_FAILURE(rc))
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync {
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync /* This shouldn't happen, but if it does try again with a larger buffer... */
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync AssertRC(rc);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync rc = RTStrRealloc(&pszPathDst, cbPathDst * 2);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync if (RT_SUCCESS(rc))
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync rc = RTPathAppend(pszPathDst, cbPathDst, pszAppend);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync if (RT_FAILURE(rc))
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync {
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync RTStrFree(pszPathDst);
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync pszPathDst = NULL;
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync }
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync }
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync }
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync return pszPathDst;
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync}
1f5867c6a115bbb281bcdc0b2c90eefe1de81134vboxsync