VirtualBox

Changeset 70395 in vbox for trunk/src/VBox/Storage/VISO.cpp


Ignore:
Timestamp:
Jan 1, 2018 12:26:11 PM (7 years ago)
Author:
vboxsync
Message:

IPRT/VISO: Pass a the directory of a VISO file to the ISO maker to allow for relative file/dir specification from it. Nested push-iso now possible. Tweak importer code to handle NT 3.1 iso where the big endian volume sequence number wasn't set.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/VISO.cpp

    r67761 r70395  
    2525
    2626#include <VBox/log.h>
    27 //#include <VBox/scsiinline.h>
    2827#include <iprt/assert.h>
    2928#include <iprt/ctype.h>
     
    3130#include <iprt/getopt.h>
    3231#include <iprt/mem.h>
     32#include <iprt/path.h>
    3333#include <iprt/string.h>
    3434#include <iprt/uuid.h>
     
    6868    /** Open flags passed by VD layer. */
    6969    uint32_t            fOpenFlags;
    70     /** Image name (for debug).
     70    /** Image name.  Allocation follows the region list, no need to free. */
     71    const char         *pszFilename;
     72    /** The parent director of pszFilename.
    7173     * Allocation follows the region list, no need to free. */
    72     const char         *pszFilename;
     74    const char         *pszCwd;
    7375
    7476    /** I/O interface. */
     
    312314                                {
    313315                                    /*
    314                                      * Try instantiate the ISO image maker.
    315                                      * Free the argument vector afterward to reduce memory pressure.
     316                                     * Open the parent directory and use that as CWD for relative references.
    316317                                     */
    317                                     RTVFSFILE       hVfsFile;
    318                                     RTERRINFOSTATIC ErrInfo;
    319                                     rc = RTFsIsoMakerCmdEx(cArgs, papszArgs, &hVfsFile, RTErrInfoInitStatic(&ErrInfo));
    320 
    321                                     RTGetOptArgvFreeEx(papszArgs, fGetOpt);
    322                                     papszArgs = NULL;
    323 
     318                                    RTVFSDIR hVfsCwd;
     319                                    rc = RTVfsChainOpenDir(pThis->pszCwd, 0 /*fOpen*/, &hVfsCwd, NULL, NULL);
    324320                                    if (RT_SUCCESS(rc))
    325321                                    {
    326                                         uint64_t cbImage;
    327                                         rc = RTVfsFileGetSize(hVfsFile, &cbImage);
     322                                        /*
     323                                         * Try instantiate the ISO image maker.
     324                                         * Free the argument vector afterward to reduce memory pressure.
     325                                         */
     326                                        RTVFSFILE       hVfsFile;
     327                                        RTERRINFOSTATIC ErrInfo;
     328                                        rc = RTFsIsoMakerCmdEx(cArgs, papszArgs, hVfsCwd, pThis->pszCwd,
     329                                                               &hVfsFile, RTErrInfoInitStatic(&ErrInfo));
     330
     331                                        RTVfsDirRelease(hVfsCwd);
     332
     333                                        RTGetOptArgvFreeEx(papszArgs, fGetOpt);
     334                                        papszArgs = NULL;
     335
    328336                                        if (RT_SUCCESS(rc))
    329337                                        {
    330                                             /*
    331                                              * Update the state.
    332                                              */
    333                                             pThis->cbImage = cbImage;
    334                                             pThis->RegionList.aRegions[0].cRegionBlocksOrBytes = cbImage;
    335 
    336                                             pThis->hIsoFile = hVfsFile;
    337                                             hVfsFile = NIL_RTVFSFILE;
    338 
    339                                             rc = VINF_SUCCESS;
    340                                             LogRel(("VISO: %'RU64 bytes (%#RX64) - %s\n", cbImage, cbImage, pThis->pszFilename));
     338                                            uint64_t cbImage;
     339                                            rc = RTVfsFileGetSize(hVfsFile, &cbImage);
     340                                            if (RT_SUCCESS(rc))
     341                                            {
     342                                                /*
     343                                                 * Update the state.
     344                                                 */
     345                                                pThis->cbImage = cbImage;
     346                                                pThis->RegionList.aRegions[0].cRegionBlocksOrBytes = cbImage;
     347
     348                                                pThis->hIsoFile = hVfsFile;
     349                                                hVfsFile = NIL_RTVFSFILE;
     350
     351                                                rc = VINF_SUCCESS;
     352                                                LogRel(("VISO: %'RU64 bytes (%#RX64) - %s\n", cbImage, cbImage, pThis->pszFilename));
     353                                            }
     354
     355                                            RTVfsFileRelease(hVfsFile);
    341356                                        }
    342 
    343                                         RTVfsFileRelease(hVfsFile);
    344                                     }
    345                                     else if (RTErrInfoIsSet(&ErrInfo.Core))
    346                                     {
    347                                         LogRel(("visoOpenWorker: RTFsIsoMakerCmdEx failed: %Rrc - %s\n", rc, ErrInfo.Core.pszMsg));
    348                                         vdIfError(pThis->pIfError, rc, RT_SRC_POS, "VISO: %s", ErrInfo.Core.pszMsg);
     357                                        else if (RTErrInfoIsSet(&ErrInfo.Core))
     358                                        {
     359                                            LogRel(("visoOpenWorker: RTFsIsoMakerCmdEx failed: %Rrc - %s\n", rc, ErrInfo.Core.pszMsg));
     360                                            vdIfError(pThis->pIfError, rc, RT_SRC_POS, "VISO: %s", ErrInfo.Core.pszMsg);
     361                                        }
     362                                        else
     363                                        {
     364                                            LogRel(("visoOpenWorker: RTFsIsoMakerCmdEx failed: %Rrc\n", rc));
     365                                            vdIfError(pThis->pIfError, rc, RT_SRC_POS, "VISO: RTFsIsoMakerCmdEx failed: %Rrc", rc);
     366                                        }
    349367                                    }
    350368                                    else
    351                                     {
    352                                         LogRel(("visoOpenWorker: RTFsIsoMakerCmdEx failed: %Rrc\n", rc));
    353                                         vdIfError(pThis->pIfError, rc, RT_SRC_POS, "VISO: RTFsIsoMakerCmdEx failed: %Rrc", rc);
    354                                     }
     369                                        vdIfError(pThis->pIfError, rc, RT_SRC_POS,
     370                                                  "VISO: Failed to open parent dir of: %s", pThis->pszFilename);
    355371                                }
    356372                            }
     
    414430    int         rc;
    415431    size_t      cbFilename = strlen(pszFilename) + 1;
    416     PVISOIMAGE  pThis = (PVISOIMAGE)RTMemAllocZ(RT_UOFFSETOF(VISOIMAGE, RegionList.aRegions[1]) + cbFilename);
     432    PVISOIMAGE  pThis = (PVISOIMAGE)RTMemAllocZ(RT_UOFFSETOF(VISOIMAGE, RegionList.aRegions[1]) + cbFilename * 2);
    417433    if (pThis)
    418434    {
     
    420436        pThis->cbImage     = 0;
    421437        pThis->fOpenFlags  = fOpenFlags;
    422         pThis->pszFilename = (char *)memcpy(&pThis->RegionList.aRegions[1], pszFilename, cbFilename);
    423438        pThis->pIfIo       = pIfIo;
    424439        pThis->pIfError    = pIfError;
     
    433448        pThis->RegionList.aRegions[0].cbData               = 2048;
    434449        pThis->RegionList.aRegions[0].cbMetadata           = 0;
     450
     451        char *pszDst = (char *)&pThis->RegionList.aRegions[1];
     452        memcpy(pszDst, pszFilename, cbFilename);
     453        pThis->pszFilename = pszDst;
     454        pszDst[cbFilename - 1] = '\0';
     455        pszDst += cbFilename;
     456
     457        memcpy(pszDst, pszFilename, cbFilename);
     458        pThis->pszCwd = pszDst;
     459        pszDst[cbFilename - 1] = '\0';
     460        RTPathStripFilename(pszDst);
    435461
    436462        /*
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