VirtualBox

Changeset 48854 in vbox for trunk/src/VBox/Storage


Ignore:
Timestamp:
Oct 3, 2013 9:48:48 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
89523
Message:

DMG: Fixes for making vbox-img convert work.

Location:
trunk/src/VBox/Storage
Files:
2 edited

Legend:

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

    r48852 r48854  
    457457    {
    458458        /*
    459          * The I/O context stuff seems to complicated and undocument that I'm
    460          * not going to bother trying implement this efficiently right now.
     459         * Alloate a temporary buffer on the stack or heap and use
     460         * vdIfIoIntIoCtxCopyTo to work the context.
     461         *
     462         * The I/O context stuff seems too complicated and undocument that I'm
     463         * not going to bother trying to implement this efficiently right now.
    461464         */
    462465        void *pvFree = NULL;
     
    466469        else
    467470            pvFree = pvBuf = RTMemTmpAlloc(cbToRead);
    468         if (!pvBuf)
     471        if (pvBuf)
    469472        {
    470473            rc = RTVfsFileReadAt(pThis->hDmgFileInXar, off, pvBuf, cbToRead, NULL);
     
    14411444 * @returns VBox status code.
    14421445 * @param   fOpen           Flags for defining the open type.
    1443  * @param   pVDIfsIo        The storage I/O interface to use.
     1446 * @param   pVDIfs          List of VD I/O interfaces that we can use.
    14441447 * @param   pvStorage       The storage pointer that goes with @a pVDIfsIo.
    14451448 * @param   pszFilename     The input filename, optional.
     
    14521455 *          is being in serveral places.
    14531456 */
    1454 static int dmgOpenImageWithinXar(uint32_t fOpen, PVDINTERFACEIO pVDIfsIo, void *pvStorage, const char *pszFilename,
     1457static int dmgOpenImageWithinXar(uint32_t fOpen, PVDINTERFACE pVDIfs, void *pvStorage, const char *pszFilename,
    14551458                                 PRTVFSFSSTREAM phXarFss, PRTVFSFILE phDmgFileInXar)
    14561459{
     
    14581461     * Open the XAR file stream.
    14591462     */
    1460     if (!pVDIfsIo)
    1461         return VERR_INVALID_PARAMETER;
    1462 
    14631463    RTVFSFILE hVfsFile;
    1464     int rc = VDIfCreateVfsFile(pVDIfsIo, pvStorage, fOpen, &hVfsFile);
     1464    int rc = VDIfCreateVfsFile(pVDIfs, pvStorage, fOpen, &hVfsFile);
    14651465    if (RT_FAILURE(rc))
    14661466        return rc;
     
    15661566    {
    15671567        rc = dmgOpenImageWithinXar(VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */),
    1568                                    VDIfIoGet(pThis->pVDIfsImage),
     1568                                   pThis->pVDIfsImage,
    15691569                                   pThis->pStorage,
    15701570                                   pThis->pszFilename,
     
    17101710    {
    17111711        rc = dmgOpenImageWithinXar(RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE,
    1712                                    VDIfIoGet(pVDIfsImage), pStorage, NULL /* pszFilename */,
     1712                                   pVDIfsImage, pStorage, NULL /* pszFilename */,
    17131713                                   &hXarFss, &hDmgFileInXar);
    17141714        if (RT_FAILURE(rc))
  • trunk/src/VBox/Storage/VDIfVfs.cpp

    r48849 r48854  
    3131#include <iprt/poll.h>
    3232#include <VBox/vd.h>
     33#include <VBox/vd-ifs-internal.h>
    3334
    3435/*******************************************************************************
     
    4142typedef struct VDIFVFSIOSFILE
    4243{
    43     /** The VD I/O interface we wrap. */
    44     PVDINTERFACEIO  pVDIfsIo;
     44    /** The VD I/O interface we prefer wrap.
     45     *  Can be NULL, in which case pVDIfsIoInt must be valid. */
     46    PVDINTERFACEIO      pVDIfsIo;
     47    /** The VD I/O interface we alternatively can wrap.
     48        Can be NULL, in which case pVDIfsIo must be valid. */
     49    PVDINTERFACEIOINT   pVDIfsIoInt;
    4550    /** User pointer to pass to the VD I/O interface methods. */
    46     void           *pvStorage;
     51    PVDIOSTORAGE        pStorage;
    4752    /** The current stream position. */
    48     RTFOFF          offCurPos;
     53    RTFOFF              offCurPos;
    4954} VDIFVFSIOSFILE;
    5055/** Pointer to a the internal data of a DVM volume file. */
     
    8994    if (off == -1)
    9095        off = pThis->offCurPos;
    91     int rc = vdIfIoFileReadSync(pThis->pVDIfsIo, pThis->pvStorage, off, pSgBuf[0].pvSegCur, pSgBuf->paSegs[0].cbSeg, pcbRead);
     96    int rc;
     97    if (pThis->pVDIfsIo)
     98        rc = vdIfIoFileReadSync(pThis->pVDIfsIo, pThis->pStorage, off, pSgBuf[0].pvSegCur, pSgBuf->paSegs[0].cbSeg, pcbRead);
     99    else
     100    {
     101        rc = vdIfIoIntFileReadSync(pThis->pVDIfsIoInt, (PVDIOSTORAGE)pThis->pStorage, off, pSgBuf[0].pvSegCur, pSgBuf->paSegs[0].cbSeg);
     102        if (pcbRead)
     103            *pcbRead = RT_SUCCESS(rc) ? pSgBuf->paSegs[0].cbSeg : 0;
     104    }
    92105    if (RT_SUCCESS(rc))
    93106    {
     
    115128    if (off == -1)
    116129        off = pThis->offCurPos;
    117     int rc = vdIfIoFileWriteSync(pThis->pVDIfsIo, pThis->pvStorage, off, pSgBuf[0].pvSegCur, pSgBuf->paSegs[0].cbSeg, pcbWritten);
     130    int rc;
     131    if (pThis->pVDIfsIo)
     132        rc = vdIfIoFileWriteSync(pThis->pVDIfsIo, pThis->pStorage, off, pSgBuf[0].pvSegCur, pSgBuf->paSegs[0].cbSeg, pcbWritten);
     133    else
     134    {
     135        rc = vdIfIoIntFileWriteSync(pThis->pVDIfsIoInt, pThis->pStorage, off, pSgBuf[0].pvSegCur, pSgBuf->paSegs[0].cbSeg);
     136        if (pcbWritten)
     137            *pcbWritten = RT_SUCCESS(rc) ? pSgBuf->paSegs[0].cbSeg : 0;
     138    }
    118139    if (RT_SUCCESS(rc))
    119140        pThis->offCurPos = off + (pcbWritten ? *pcbWritten : pSgBuf->paSegs[0].cbSeg);
     
    128149{
    129150    PVDIFVFSIOSFILE pThis = (PVDIFVFSIOSFILE)pvThis;
    130     return vdIfIoFileFlushSync(pThis->pVDIfsIo, pThis->pvStorage);
     151    int rc;
     152    if (pThis->pVDIfsIo)
     153        rc = vdIfIoFileFlushSync(pThis->pVDIfsIo, pThis->pStorage);
     154    else
     155        rc = vdIfIoIntFileFlushSync(pThis->pVDIfsIoInt, pThis->pStorage);
     156    return rc;
    131157}
    132158
     
    202228    if (RT_SUCCESS(rc))
    203229    {
    204         pThis->pVDIfsIo  = pVDIfsIo;
    205         pThis->pvStorage = pvStorage;
    206         pThis->offCurPos = 0;
     230        pThis->pVDIfsIo     = pVDIfsIo;
     231        pThis->pVDIfsIoInt  = NULL;
     232        pThis->pStorage     = (PVDIOSTORAGE)pvStorage;
     233        pThis->offCurPos    = 0;
    207234
    208235        *phVfsIos = hVfsIos;
     
    262289
    263290    uint64_t cbFile;
    264     int rc = vdIfIoFileGetSize(pThis->pVDIfsIo, pThis->pvStorage, &cbFile);
     291    int rc;
     292    if (pThis->pVDIfsIo)
     293        rc = vdIfIoFileGetSize(pThis->pVDIfsIo, pThis->pStorage, &cbFile);
     294    else
     295        rc = vdIfIoIntFileGetSize(pThis->pVDIfsIoInt, pThis->pStorage, &cbFile);
    265296    if (RT_FAILURE(rc))
    266297        return rc;
     
    304335{
    305336    PVDIFVFSIOSFILE pThis = (PVDIFVFSIOSFILE)pvThis;
    306     return vdIfIoFileGetSize(pThis->pVDIfsIo, pThis->pvStorage, pcbFile);
     337    int rc;
     338    if (pThis->pVDIfsIo)
     339        rc = vdIfIoFileGetSize(pThis->pVDIfsIo, pThis->pStorage, pcbFile);
     340    else
     341        rc = vdIfIoIntFileGetSize(pThis->pVDIfsIoInt, pThis->pStorage, pcbFile);
     342    return rc;
    307343}
    308344
     
    350386
    351387
    352 VBOXDDU_DECL(int) VDIfCreateVfsFile(PVDINTERFACEIO pVDIfsIo, void *pvStorage, uint32_t fFlags, PRTVFSFILE phVfsFile)
    353 {
    354     AssertPtrReturn(pVDIfsIo, VERR_INVALID_HANDLE);
     388VBOXDDU_DECL(int) VDIfCreateVfsFile(PVDINTERFACE pVDIfs, void *pvStorage, uint32_t fFlags, PRTVFSFILE phVfsFile)
     389{
     390    AssertPtrReturn(pVDIfs, VERR_INVALID_HANDLE);
    355391    AssertPtrReturn(phVfsFile, VERR_INVALID_POINTER);
     392
     393    PVDINTERFACEIO    pPreferred   = VDIfIoGet(pVDIfs);
     394    PVDINTERFACEIOINT pAlternative = VDIfIoIntGet(pVDIfs);
     395    AssertReturn(pPreferred || pAlternative, VERR_INVALID_HANDLE);
    356396
    357397    /*
     
    364404    if (RT_SUCCESS(rc))
    365405    {
    366         pThis->pVDIfsIo  = pVDIfsIo;
    367         pThis->pvStorage = pvStorage;
    368         pThis->offCurPos = 0;
     406        pThis->pVDIfsIo     = pPreferred;
     407        pThis->pVDIfsIoInt  = pAlternative;
     408        pThis->pStorage     = (PVDIOSTORAGE)pvStorage;
     409        pThis->offCurPos    = 0;
    369410
    370411        *phVfsFile = hVfsFile;
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