VirtualBox

Ignore:
Timestamp:
Sep 21, 2017 8:11:10 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
118067
Message:

IPRT/isomaker: fixed handling of lone source files, they shall end up in the root dir of the CD.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp

    r68813 r68814  
    17041704        if (pParsed->cNamesWithSrc == 1 && fWithSrc)
    17051705        {
    1706             /** @todo just take the final component and prepend a slash (or whatever
    1707              *        directory in the ISO we import relative to). */
     1706            const char *pszSrc = pParsed->aNames[iSrc].szPath;
     1707            char *pszFinalPath = NULL;
    17081708            if (RTVfsChainIsSpec(pParsed->aNames[iSrc].szPath))
    17091709            {
    17101710                uint32_t offError;
    1711                 char *pszFinalPath;
    17121711                int rc = RTVfsChainQueryFinalPath(pParsed->aNames[iSrc].szPath, &pszFinalPath, &offError);
    17131712                if (RT_FAILURE(rc))
    17141713                    return rtFsIsoMakerCmdChainError(pOpts, "RTVfsChainQueryFinalPath",
    17151714                                                     pParsed->aNames[iSrc].szPath, rc, offError, NULL);
    1716                 pParsed->aNames[iSrc].cchPath = (uint32_t)strlen(pszFinalPath);
    1717                 if (RTPATH_IS_SLASH(*pszFinalPath))
    1718                     memcpy(pParsed->aNames[iSrc].szPath, pszFinalPath, pParsed->aNames[iSrc].cchPath + 1);
    1719                 else
    1720                 {
    1721                     memcpy(&pParsed->aNames[iSrc].szPath[1], pszFinalPath, pParsed->aNames[iSrc].cchPath + 1);
    1722                     pParsed->aNames[iSrc].szPath[0] = RTPATH_SLASH;
    1723                     pParsed->aNames[iSrc].cchPath++;
    1724                 }
     1715                pszSrc = pszFinalPath;
     1716            }
     1717
     1718            /* Find the start of the last component, ignoring trailing slashes. */
     1719            size_t cchSrc  = strlen(pszSrc);
     1720            size_t offLast = cchSrc;
     1721            while (offLast > 0 && RTPATH_IS_SLASH(pszSrc[offLast - 1]))
     1722                offLast--;
     1723            while (offLast > 0 && !RTPATH_IS_SLASH(pszSrc[offLast - 1]))
     1724                offLast--;
     1725
     1726            /* Move it up front with a leading slash. */
     1727            if (offLast > 0 || !RTPATH_IS_SLASH(*pszSrc))
     1728            {
     1729                pParsed->aNames[iSrc].cchPath = 1 + (uint32_t)(cchSrc - offLast);
     1730                if (pParsed->aNames[iSrc].cchPath >= sizeof(pParsed->aNames[iSrc].szPath))
     1731                    return rtFsIsoMakerCmdSyntaxError(pOpts, "name too long: %s", pszSpecIn);
     1732
     1733                memmove(&pParsed->aNames[iSrc].szPath[1], &pszSrc[offLast], pParsed->aNames[iSrc].cchPath);
     1734            }
     1735            else
     1736                pParsed->aNames[iSrc].cchPath = 1;
     1737            pParsed->aNames[iSrc].szPath[0] = RTPATH_SLASH;
     1738
     1739            if (pszFinalPath)
    17251740                RTStrFree(pszFinalPath);
    1726             }
    1727 #if RTPATH_STYLE == RTPATH_STR_F_STYLE_DOS
    1728             else if (   RTPATH_IS_VOLSEP(pParsed->aNames[iSrc].szPath[1])
    1729                      && RT_C_IS_ALPHA(pParsed->aNames[iSrc].szPath[0]))
    1730             {
    1731                 if (RTPATH_IS_SLASH(pParsed->aNames[iSrc].szPath[2]))
    1732                 {
    1733                     memmove(&pParsed->aNames[iSrc].szPath[0], &pParsed->aNames[iSrc].szPath[2], pParsed->aNames[iSrc].cchPath - 1);
    1734                     pParsed->aNames[iSrc].cchPath -= 2;
    1735                 }
    1736                 else
    1737                 {
    1738                     memmove(&pParsed->aNames[iSrc].szPath[1], &pParsed->aNames[iSrc].szPath[2], pParsed->aNames[iSrc].cchPath - 1);
    1739                     pParsed->aNames[iSrc].szPath[0] = RTPATH_SLASH;
    1740                     pParsed->aNames[iSrc].cchPath  -= 1;
    1741                 }
    1742             }
    1743 #endif
    1744             else if (!RTPATH_IS_SLASH(pParsed->aNames[iSrc].szPath[0]))
    1745             {
    1746                 if (pParsed->aNames[iSrc].cchPath + 2 > sizeof(pParsed->aNames[iSrc].szPath))
    1747                     return rtFsIsoMakerCmdSyntaxError(pOpts, "name too long: %s", pszSpecIn);
    1748                 memmove(&pParsed->aNames[iSrc].szPath[1], &pParsed->aNames[iSrc].szPath[0], pParsed->aNames[iSrc].cchPath + 1);
    1749                 pParsed->aNames[iSrc].szPath[0] = RTPATH_SLASH;
    1750                 pParsed->aNames[iSrc].cchPath++;
    1751             }
    17521741        }
    17531742
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette