VirtualBox

Changeset 37270 in vbox for trunk


Ignore:
Timestamp:
May 30, 2011 9:25:42 PM (14 years ago)
Author:
vboxsync
Message:

IPRT/Dvm: Commit BSD disklabel support.

Location:
trunk/src/VBox/Runtime
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r37254 r37270  
    279279        common/dbg/dbgmodnm.cpp \
    280280        common/dvm/dvm.cpp \
     281        common/dvm/dvmbsdlabel.cpp \
    281282        common/dvm/dvmgpt.cpp \
    282283        common/dvm/dvmmbr.cpp \
  • trunk/src/VBox/Runtime/common/dvm/dvm.cpp

    r37024 r37270  
    8383extern RTDVMFMTOPS g_rtDvmFmtMbr;
    8484extern RTDVMFMTOPS g_rtDvmFmtGpt;
     85extern RTDVMFMTOPS g_rtDvmFmtBsdLbl;
    8586
    8687/**
     
    9091{
    9192    &g_rtDvmFmtMbr,
    92     &g_rtDvmFmtGpt
     93    &g_rtDvmFmtGpt,
     94    &g_rtDvmFmtBsdLbl
    9395};
    9496
     
    233235        }
    234236        else
    235             rc = VERR_NOT_FOUND;
     237            rc = VERR_NOT_SUPPORTED;
    236238    }
    237239
  • trunk/src/VBox/Runtime/include/internal/dvm.h

    r37024 r37270  
    227227typedef const RTDVMFMTOPS *PCRTDVMFMTOPS;
    228228
     229/** Converts a LBA number to the byte offset. */
     230#define RTDVM_LBA2BYTE(lba, disk) ((lba) * (disk)->cbSector)
     231/** Converts a Byte offset to the LBA number. */
     232#define RTDVM_BYTE2LBA(off, disk) ((off) / (disk)->cbSector)
     233
    229234/**
    230235 * Returns the number of sectors in the disk.
  • trunk/src/VBox/Runtime/testcase/tstRTDvm.cpp

    r36816 r37270  
    3434#include <iprt/dvm.h>
    3535#include <iprt/file.h>
    36 
    37 RTFILE   g_hDisk = NIL_RTFILE;  /**< The disk image. */
    38 uint64_t g_cbDisk = 0;          /**< Size of the image. */
     36#include <iprt/string.h>
     37
     38/**
     39 * Disk structure.
     40 */
     41typedef struct TSTRTDVMDISK
     42{
     43    /** Flag whether this disk uses the image file or a volume. */
     44    bool            fUseImage;
     45    /** Data dependent on the flag. */
     46    union
     47    {
     48        /** File handle of the image. */
     49        RTFILE      hImage;
     50        /** Handle of the volume. */
     51        RTDVMVOLUME hVol;
     52    };
     53} TSTRTDVMDISK, *PTSTRTDVMDISK;
    3954
    4055static int dvmDiskRead(void *pvUser, uint64_t off, void *pvBuf, size_t cbRead)
    4156{
    42     return RTFileReadAt(g_hDisk, off, pvBuf, cbRead, NULL);
     57    PTSTRTDVMDISK pDisk = (PTSTRTDVMDISK)pvUser;
     58
     59    if (pDisk->fUseImage)
     60        return RTFileReadAt(pDisk->hImage, off, pvBuf, cbRead, NULL);
     61    else
     62        return RTDvmVolumeRead(pDisk->hVol, off, pvBuf, cbRead);
    4363}
    4464
    4565static int dvmDiskWrite(void *pvUser, uint64_t off, const void *pvBuf, size_t cbWrite)
    4666{
    47     return RTFileWriteAt(g_hDisk, off, pvBuf, cbWrite, NULL);
     67    PTSTRTDVMDISK pDisk = (PTSTRTDVMDISK)pvUser;
     68
     69    if (pDisk->fUseImage)
     70        return RTFileWriteAt(pDisk->hImage, off, pvBuf, cbWrite, NULL);
     71    else
     72        return RTDvmVolumeWrite(pDisk->hVol, off, pvBuf, cbWrite);
     73}
     74
     75static int tstRTDvmVolume(RTTEST hTest, PTSTRTDVMDISK pDisk, uint64_t cb, unsigned cNesting)
     76{
     77    char szPrefix[100];
     78    int rc = VINF_SUCCESS;
     79
     80    memset(szPrefix, 0, sizeof(szPrefix));
     81
     82    if (cNesting < sizeof(szPrefix) - 1)
     83    {
     84        for (unsigned i = 0; i < cNesting; i++)
     85            szPrefix[i] = '\t';
     86    }
     87
     88    RTTestSubF(hTest, "Create DVM");
     89    RTDVM hVolMgr;
     90    rc = RTDvmCreate(&hVolMgr, dvmDiskRead, dvmDiskWrite, cb, 512, pDisk);
     91    if (RT_FAILURE(rc))
     92    {
     93        RTTestIFailed("RTDvmCreate -> %Rrc", rc);
     94        return RTTestSummaryAndDestroy(hTest);
     95    }
     96
     97    RTTestSubF(hTest, "Open volume map");
     98    rc = RTDvmMapOpen(hVolMgr);
     99    if (   RT_FAILURE(rc)
     100        && rc != VERR_NOT_SUPPORTED)
     101    {
     102        RTTestIFailed("RTDvmOpen -> %Rrc", rc);
     103        return RTTestSummaryAndDestroy(hTest);
     104    }
     105    else if (rc == VERR_NOT_SUPPORTED)
     106        return VINF_SUCCESS;
     107
     108    RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Successfully opened map with format: %s.\n", szPrefix, RTDvmMapGetFormat(hVolMgr));
     109
     110    /* Dump all volumes. */
     111    RTTestSubF(hTest, "Dump volumes");
     112    uint32_t cVolume = 0;
     113    RTDVMVOLUME hVol;
     114
     115    rc = RTDvmMapQueryFirstVolume(hVolMgr, &hVol);
     116
     117    while (RT_SUCCESS(rc))
     118    {
     119        char *pszVolName = NULL;
     120        RTDVMVOLTYPE enmVolType = RTDvmVolumeGetType(hVol);
     121        uint64_t fVolFlags = RTDvmVolumeGetFlags(hVol);
     122
     123        RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume %u:\n", szPrefix, cVolume);
     124        RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume type  %s\n", szPrefix, RTDvmVolumeTypeGetDescr(enmVolType));
     125        RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume size  %llu\n", szPrefix, RTDvmVolumeGetSize(hVol));
     126        RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume flags %s %s\n\n", szPrefix,
     127                      fVolFlags & DVMVOLUME_FLAGS_BOOTABLE ? "Bootable" : "",
     128                      fVolFlags & DVMVOLUME_FLAGS_ACTIVE ? "Active" : "");
     129
     130        rc = RTDvmVolumeQueryName(hVol, &pszVolName);
     131        if (RT_SUCCESS(rc))
     132        {
     133            RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume name %s.\n", szPrefix, pszVolName);
     134            RTStrFree(pszVolName);
     135        }
     136        else if (rc != VERR_NOT_SUPPORTED)
     137            RTTestIFailed("RTDvmVolumeQueryName -> %Rrc", rc);
     138        else
     139            rc = VINF_SUCCESS;
     140
     141        /*
     142         * Query all volumes which might be inside this.
     143         * (think of MBR partitions with a bsdlabel inside)
     144         */
     145        TSTRTDVMDISK Disk;
     146        Disk.fUseImage = false;
     147        Disk.hVol      = hVol;
     148        rc = tstRTDvmVolume(hTest, &Disk, RTDvmVolumeGetSize(hVol), cNesting + 1);
     149
     150        RTDVMVOLUME hVolNext;
     151        rc = RTDvmMapQueryNextVolume(hVolMgr, hVol, &hVolNext);
     152        RTDvmVolumeRelease(hVol);
     153        hVol = hVolNext;
     154        cVolume++;
     155    }
     156
     157    RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Dumped %u volumes\n", szPrefix, cVolume);
     158
     159    if (   rc == VERR_DVM_MAP_EMPTY
     160        || rc == VERR_DVM_MAP_NO_VOLUME)
     161        rc = VINF_SUCCESS;
     162
     163    RTTESTI_CHECK(rc == VINF_SUCCESS);
     164
     165    RTDvmRelease(hVolMgr);
     166
     167    return rc;
    48168}
    49169
     
    69189
    70190    /* Open image. */
    71     rc = RTFileOpen(&g_hDisk, argv[1], RTFILE_O_OPEN | RTFILE_O_DENY_NONE | RTFILE_O_READWRITE);
     191    RTFILE hFile;
     192    uint64_t cb = 0;
     193    rc = RTFileOpen(&hFile, argv[1], RTFILE_O_OPEN | RTFILE_O_DENY_NONE | RTFILE_O_READWRITE);
    72194    if (RT_FAILURE(rc))
    73195    {
     
    76198    }
    77199
    78     rc = RTFileGetSize(g_hDisk, &g_cbDisk);
     200    rc = RTFileGetSize(hFile, &cb);
    79201    if (   RT_FAILURE(rc)
    80         || g_cbDisk % 512 != 0) /* Assume 512 byte sector size. */
     202        || cb % 512 != 0) /* Assume 512 byte sector size. */
    81203    {
    82204        RTTestIFailed("RTFileGetSize -> %Rrc", rc);
     
    84206    }
    85207
    86     RTTestSubF(hTest, "Create DVM");
    87     RTDVM hVolMgr;
    88     rc = RTDvmCreate(&hVolMgr, dvmDiskRead, dvmDiskWrite, g_cbDisk, 512, NULL);
    89     if (RT_FAILURE(rc))
    90     {
    91         RTTestIFailed("RTDvmCreate -> %Rrc", rc);
    92         return RTTestSummaryAndDestroy(hTest);
    93     }
    94 
    95     RTTestSubF(hTest, "Open volume map");
    96     rc = RTDvmMapOpen(hVolMgr);
    97     if (RT_FAILURE(rc))
    98     {
    99         RTTestIFailed("RTDvmOpen -> %Rrc", rc);
    100         return RTTestSummaryAndDestroy(hTest);
    101     }
    102 
    103     RTTestIPrintf(RTTESTLVL_ALWAYS, " Successfully opened map with format: %s.\n", RTDvmMapGetFormat(hVolMgr));
    104 
    105     /* Dump all volumes. */
    106     RTTestSubF(hTest, "Dump volumes");
    107     uint32_t cVolume = 0;
    108     RTDVMVOLUME hVol;
    109 
    110     rc = RTDvmMapQueryFirstVolume(hVolMgr, &hVol);
    111 
    112     while (RT_SUCCESS(rc))
    113     {
    114         RTDVMVOLTYPE enmVolType = RTDvmVolumeGetType(hVol);
    115         uint64_t fVolFlags = RTDvmVolumeGetFlags(hVol);
    116 
    117         RTTestIPrintf(RTTESTLVL_ALWAYS, " Volume %u:\n", cVolume);
    118         RTTestIPrintf(RTTESTLVL_ALWAYS, " Volume type  %s.\n", RTDvmVolumeTypeGetDescr(enmVolType));
    119         RTTestIPrintf(RTTESTLVL_ALWAYS, " Volume size  %llu.\n", RTDvmVolumeGetSize(hVol));
    120         RTTestIPrintf(RTTESTLVL_ALWAYS, " Volume flags %s %s.\n\n",
    121                       fVolFlags & DVMVOLUME_FLAGS_BOOTABLE ? "Bootable" : "",
    122                       fVolFlags & DVMVOLUME_FLAGS_ACTIVE ? "Active" : "");
    123 
    124         RTDVMVOLUME hVolNext;
    125         rc = RTDvmMapQueryNextVolume(hVolMgr, hVol, &hVolNext);
    126         RTDvmVolumeRelease(hVol);
    127         hVol = hVolNext;
    128         cVolume++;
    129     }
    130 
    131     RTTestIPrintf(RTTESTLVL_ALWAYS, " Dumped %u volumes\n", cVolume);
    132 
    133     if (   rc == VERR_DVM_MAP_EMPTY
    134         || rc == VERR_DVM_MAP_NO_VOLUME)
    135         rc = VINF_SUCCESS;
     208    TSTRTDVMDISK Disk;
     209
     210    Disk.fUseImage = true;
     211    Disk.hImage    = hFile;
     212    rc = tstRTDvmVolume(hTest, &Disk, cb, 0);
    136213
    137214    RTTESTI_CHECK(rc == VINF_SUCCESS);
    138 
    139     RTDvmRelease(hVolMgr);
    140215
    141216    /*
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