Changeset 68814 in vbox for trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp
- Timestamp:
- Sep 21, 2017 8:11:10 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 118067
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp
r68813 r68814 1704 1704 if (pParsed->cNamesWithSrc == 1 && fWithSrc) 1705 1705 { 1706 /** @todo just take the final component and prepend a slash (or whatever1707 * directory in the ISO we import relative to). */1706 const char *pszSrc = pParsed->aNames[iSrc].szPath; 1707 char *pszFinalPath = NULL; 1708 1708 if (RTVfsChainIsSpec(pParsed->aNames[iSrc].szPath)) 1709 1709 { 1710 1710 uint32_t offError; 1711 char *pszFinalPath;1712 1711 int rc = RTVfsChainQueryFinalPath(pParsed->aNames[iSrc].szPath, &pszFinalPath, &offError); 1713 1712 if (RT_FAILURE(rc)) 1714 1713 return rtFsIsoMakerCmdChainError(pOpts, "RTVfsChainQueryFinalPath", 1715 1714 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) 1725 1740 RTStrFree(pszFinalPath); 1726 }1727 #if RTPATH_STYLE == RTPATH_STR_F_STYLE_DOS1728 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 else1737 {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 #endif1744 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 }1752 1741 } 1753 1742
Note:
See TracChangeset
for help on using the changeset viewer.