VirtualBox

Changeset 75698 in vbox for trunk/src/VBox/Runtime/common/fs


Ignore:
Timestamp:
Nov 24, 2018 12:42:50 PM (6 years ago)
Author:
vboxsync
Message:

IPRT/isomakercmd.cpp: Implemented adding regular directories to the ISO/VISO.

File:
1 edited

Legend:

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

    r71014 r75698  
    16921692
    16931693/**
    1694  * Adds a directory, from a VFS chain or real file system.
    1695  *
    1696  * @returns IPRT status code.
    1697  * @param   pOpts               The ISO maker command instance.
    1698  * @param   pszSrc              The path to the source directory.
    1699  * @param   pParsed             The parsed names.
    1700  */
    1701 static int rtFsIsoMakerCmdAddDir(PRTFSISOMAKERCMDOPTS pOpts, const char *pszSrc, PCRTFSISOMKCMDPARSEDNAMES pParsed)
    1702 {
    1703     RT_NOREF(pParsed);
    1704     return rtFsIsoMakerCmdErrorRc(pOpts, VERR_NOT_IMPLEMENTED, "Adding directory '%s' failed: not implemented", pszSrc);
    1705 }
    1706 
    1707 
    1708 /**
    17091694 * Worker for rtFsIsoMakerCmdAddVfsDir that does the recursion.
    17101695 *
     
    18721857
    18731858/**
    1874  * Adds a directory, from the source VFS.
     1859 * Common directory adding worker.
    18751860 *
    18761861 * @returns IPRT status code.
    18771862 * @param   pOpts               The ISO maker command instance.
     1863 * @param   hVfsSrcDir          The directory being added.
     1864 * @param   pszSrc              The source directory name.
    18781865 * @param   pParsed             The parsed names.
    18791866 * @param   pidxObj             Where to return the configuration index for the
    18801867 *                              added file.  Optional.
    18811868 */
    1882 static int rtFsIsoMakerCmdAddVfsDir(PRTFSISOMAKERCMDOPTS pOpts, PCRTFSISOMKCMDPARSEDNAMES pParsed, PCRTFSOBJINFO pObjInfo)
    1883 {
    1884     Assert(pParsed->cNames < pParsed->cNamesWithSrc);
    1885 
    1886     /*
    1887      * Open the directory.
    1888      */
    1889     char    *pszDir = pParsed->aNames[pParsed->cNamesWithSrc - 1].szPath;
    1890     RTPathChangeToUnixSlashes(pszDir, true /*fForce*/); /* VFS currently only understand unix slashes. */
    1891     RTVFSDIR hVfsDirSrc;
    1892     int rc = RTVfsDirOpenDir(pOpts->aSrcStack[pOpts->iSrcStack].hSrcDir, pszDir, 0 /*fFlags*/, &hVfsDirSrc);
    1893     if (RT_FAILURE(rc))
    1894         return rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error opening directory '%s' (%s '%s'): %Rrc", pszDir,
    1895                                       pOpts->aSrcStack[pOpts->iSrcStack].pszSrcVfsOption ? "inside" : "relative to",
    1896                                       pOpts->aSrcStack[pOpts->iSrcStack].pszSrcVfs, rc);
    1897 
     1869static int rtFsIsoMakerCmdAddVfsDirCommon(PRTFSISOMAKERCMDOPTS pOpts, RTVFSDIR hVfsDirSrc, char *pszSrc,
     1870                                          PCRTFSISOMKCMDPARSEDNAMES pParsed, PCRTFSOBJINFO pObjInfo)
     1871{
    18981872    /*
    18991873     * Add the directory if it doesn't exist.
     
    19121886            }
    19131887        }
     1888    int rc = VINF_SUCCESS;
    19141889    if (idxObj == UINT32_MAX)
    19151890    {
     
    19281903        for (uint32_t i = 0; i < pParsed->cNames; i++)
    19291904            fNamespaces |= pParsed->aNames[i].fNameSpecifiers & RTFSISOMAKERCMDNAME_MAJOR_MASK;
    1930         rc = rtFsIsoMakerCmdAddVfsDirRecursive(pOpts, hVfsDirSrc, idxObj, pszDir,
     1905        rc = rtFsIsoMakerCmdAddVfsDirRecursive(pOpts, hVfsDirSrc, idxObj, pszSrc,
    19311906                                               pParsed->aNames[pParsed->cNamesWithSrc - 1].cchPath, fNamespaces, 0 /*cDepth*/);
    19321907    }
    1933     RTVfsDirRelease(hVfsDirSrc);
     1908
    19341909    return rc;
    19351910}
    19361911
    19371912
     1913/**
     1914 * Adds a directory, from the source VFS.
     1915 *
     1916 * @returns IPRT status code.
     1917 * @param   pOpts               The ISO maker command instance.
     1918 * @param   pParsed             The parsed names.
     1919 * @param   pidxObj             Where to return the configuration index for the
     1920 *                              added file.  Optional.
     1921 */
     1922static int rtFsIsoMakerCmdAddVfsDir(PRTFSISOMAKERCMDOPTS pOpts, PCRTFSISOMKCMDPARSEDNAMES pParsed, PCRTFSOBJINFO pObjInfo)
     1923{
     1924    Assert(pParsed->cNames < pParsed->cNamesWithSrc);
     1925    char    *pszSrc = pParsed->aNames[pParsed->cNamesWithSrc - 1].szPath;
     1926    RTPathChangeToUnixSlashes(pszSrc, true /*fForce*/); /* VFS currently only understand unix slashes. */
     1927    RTVFSDIR hVfsDirSrc;
     1928    int rc = RTVfsDirOpenDir(pOpts->aSrcStack[pOpts->iSrcStack].hSrcDir, pszSrc, 0 /*fFlags*/, &hVfsDirSrc);
     1929    if (RT_SUCCESS(rc))
     1930    {
     1931        rc = rtFsIsoMakerCmdAddVfsDirCommon(pOpts, hVfsDirSrc, pszSrc, pParsed, pObjInfo);
     1932        RTVfsDirRelease(hVfsDirSrc);
     1933    }
     1934    else
     1935        rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error opening directory '%s' (%s '%s'): %Rrc", pszSrc,
     1936                                    pOpts->aSrcStack[pOpts->iSrcStack].pszSrcVfsOption ? "inside" : "relative to",
     1937                                    pOpts->aSrcStack[pOpts->iSrcStack].pszSrcVfs, rc);
     1938    return rc;
     1939}
     1940
     1941
     1942/**
     1943 * Adds a directory, from a VFS chain or real file system.
     1944 *
     1945 * @returns IPRT status code.
     1946 * @param   pOpts               The ISO maker command instance.
     1947 * @param   pszSrc              The path to the source directory.
     1948 * @param   pParsed             The parsed names.
     1949 */
     1950static int rtFsIsoMakerCmdAddDir(PRTFSISOMAKERCMDOPTS pOpts, PCRTFSISOMKCMDPARSEDNAMES pParsed, PCRTFSOBJINFO pObjInfo)
     1951{
     1952    Assert(pParsed->cNames < pParsed->cNamesWithSrc);
     1953    char           *pszSrc = pParsed->aNames[pParsed->cNamesWithSrc - 1].szPath;
     1954    RTERRINFOSTATIC ErrInfo;
     1955    uint32_t        offError;
     1956    RTVFSDIR        hVfsDirSrc;
     1957    int rc = RTVfsChainOpenDir(pszSrc, 0 /*fOpen*/, &hVfsDirSrc, &offError, RTErrInfoInitStatic(&ErrInfo));
     1958    if (RT_SUCCESS(rc))
     1959    {
     1960        rc = rtFsIsoMakerCmdAddVfsDirCommon(pOpts, hVfsDirSrc, pszSrc, pParsed, pObjInfo);
     1961        RTVfsDirRelease(hVfsDirSrc);
     1962    }
     1963    else
     1964        rc = rtFsIsoMakerCmdChainError(pOpts, "RTVfsChainOpenDir", pszSrc, rc, offError, &ErrInfo.Core);
     1965    return rc;
     1966}
    19381967
    19391968
     
    20612090            if (Parsed.enmSrcType == RTFSISOMKCMDPARSEDNAMES::kSrcType_NormalSrcStack)
    20622091                return rtFsIsoMakerCmdAddVfsDir(pOpts, &Parsed, &ObjInfo);
    2063             return rtFsIsoMakerCmdAddDir(pOpts, pszSrc, &Parsed);
     2092            return rtFsIsoMakerCmdAddDir(pOpts, &Parsed, &ObjInfo);
    20642093        }
    20652094
Note: See TracChangeset for help on using the changeset viewer.

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