VirtualBox

Changeset 64278 in vbox


Ignore:
Timestamp:
Oct 14, 2016 12:17:45 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
111291
Message:

Devices/Storage/DrvHost*: Move more host dependent code into the host specific source files, move validating the CFGM values into DRVHostBaseInitData() because it doesn't make much sense to check for unknown values after most of the values were already queried

Location:
trunk/src/VBox/Devices/Storage
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp

    r64258 r64278  
    209209
    210210
     211DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
     212{
     213    uint8_t abCmd[16] =
     214    {
     215        SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0,
     216        0,0,0,0,0,0,0,0,0,0
     217    };
     218    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
     219}
     220
     221
     222DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
     223{
     224    uint8_t abCmd[16] =
     225    {
     226        SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0,
     227        0,0,0,0,0,0,0,0,0,0
     228    };
     229    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
     230}
     231
     232
     233DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
     234{
     235    AssertReturn(pThis->ppScsiTaskDI, VERR_INTERNAL_ERROR);
     236
     237    /*
     238     * Issue a TEST UNIT READY request.
     239     */
     240    *pfMediaChanged = false;
     241    *pfMediaPresent = false;
     242    uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
     243    uint8_t abSense[32];
     244    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
     245    if (RT_SUCCESS(rc))
     246        *pfMediaPresent = true;
     247    else if (   rc == VERR_UNRESOLVED_ERROR
     248             && abSense[2] == 6 /* unit attention */
     249             && (   (abSense[12] == 0x29 && abSense[13] < 5 /* reset */)
     250                 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */)                        //???
     251                 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */)  //???
     252                 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */)              //???
     253                 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */)
     254                 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */)
     255                 )
     256            )
     257    {
     258        *pfMediaPresent = false;
     259        *pfMediaChanged = true;
     260        rc = VINF_SUCCESS;
     261        /** @todo check this media change stuff on Darwin. */
     262    }
     263
     264    return rc;
     265}
     266
     267
    211268DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
    212269{
  • trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp

    r64252 r64278  
    209209
    210210
     211DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
     212{
     213    uint8_t abCmd[16] =
     214    {
     215        SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0,
     216        0,0,0,0,0,0,0,0,0,0
     217    };
     218    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
     219}
     220
     221
     222DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
     223{
     224    uint8_t abCmd[16] =
     225    {
     226        SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0,
     227        0,0,0,0,0,0,0,0,0,0
     228    };
     229    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
     230}
     231
     232
     233DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
     234{
     235    /*
     236     * Issue a TEST UNIT READY request.
     237     */
     238    *pfMediaChanged = false;
     239    *pfMediaPresent = false;
     240    uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
     241    uint8_t abSense[32];
     242    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
     243    if (RT_SUCCESS(rc))
     244        *pfMediaPresent = true;
     245    else if (   rc == VERR_UNRESOLVED_ERROR
     246             && abSense[2] == 6 /* unit attention */
     247             && (   (abSense[12] == 0x29 && abSense[13] < 5 /* reset */)
     248                 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */)                        //???
     249                 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */)  //???
     250                 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */)              //???
     251                 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */)
     252                 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */)
     253                 )
     254            )
     255    {
     256        *pfMediaPresent = false;
     257        *pfMediaChanged = true;
     258        rc = VINF_SUCCESS;
     259        /** @todo check this media change stuff on Darwin. */
     260    }
     261
     262    return rc;
     263}
     264
     265
    211266DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
    212267{
  • trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp

    r64252 r64278  
    182182
    183183
     184DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
     185{
     186    int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_LOCKDOOR, (int)fLock);
     187    if (rc < 0)
     188    {
     189        if (errno == EBUSY)
     190            rc = VERR_ACCESS_DENIED;
     191        else if (errno == EDRIVE_CANT_DO_THIS)
     192            rc = VERR_NOT_SUPPORTED;
     193        else
     194            rc = RTErrConvertFromErrno(errno);
     195    }
     196
     197    return rc;
     198}
     199
     200
     201DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
     202{
     203    int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROMEJECT, 0);
     204    if (rc < 0)
     205    {
     206        if (errno == EBUSY)
     207            rc = VERR_PDM_MEDIA_LOCKED;
     208        else if (errno == ENOSYS)
     209            rc = VERR_NOT_SUPPORTED;
     210        else
     211            rc = RTErrConvertFromErrno(errno);
     212    }
     213
     214    return rc;
     215}
     216
     217
     218DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
     219{
     220    *pfMediaPresent = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK;
     221    *pfMediaChanged = false;
     222    if (pThis->fMediaPresent != *pfMediaPresent)
     223        *pfMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1;
     224
     225    return VINF_SUCCESS;
     226}
     227
     228
    184229DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
    185230{
  • trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp

    r64252 r64278  
    202202
    203203
     204DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
     205{
     206    int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), fLock ? DKIOCLOCK : DKIOCUNLOCK, 0);
     207    if (rc < 0)
     208    {
     209        if (errno == EBUSY)
     210            rc = VERR_ACCESS_DENIED;
     211        else if (errno == ENOTSUP || errno == ENOSYS)
     212            rc = VERR_NOT_SUPPORTED;
     213        else
     214            rc = RTErrConvertFromErrno(errno);
     215    }
     216
     217    return rc;
     218}
     219
     220
     221DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
     222{
     223    int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCEJECT, 0);
     224    if (rc < 0)
     225    {
     226        if (errno == EBUSY)
     227            rc = VERR_PDM_MEDIA_LOCKED;
     228        else if (errno == ENOSYS || errno == ENOTSUP)
     229            rc = VERR_NOT_SUPPORTED;
     230        else if (errno == ENODEV)
     231            rc = VERR_PDM_MEDIA_NOT_MOUNTED;
     232        else
     233            rc = RTErrConvertFromErrno(errno);
     234    }
     235
     236    return rc;
     237}
     238
     239
     240DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
     241{
     242    *pfMediaPresent = false;
     243    *pfMediaChanged = false;
     244
     245    /* Need to pass the previous state and DKIO_NONE for the first time. */
     246    static dkio_state s_DeviceState = DKIO_NONE;
     247    dkio_state PreviousState = s_DeviceState;
     248    int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCSTATE, &s_DeviceState);
     249    if (rc == 0)
     250    {
     251        *pfMediaPresent = (s_DeviceState == DKIO_INSERTED);
     252        if (PreviousState != s_DeviceState)
     253            *pfMediaChanged = true;
     254    }
     255
     256    return VINF_SUCCESS;
     257}
     258
     259
    204260DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
    205261{
  • trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp

    r64253 r64278  
    240240
    241241
     242DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
     243{
     244    PREVENT_MEDIA_REMOVAL PreventMediaRemoval = {fLock};
     245    DWORD cbReturned;
     246    int rc;
     247    if (DeviceIoControl((HANDLE)RTFileToNative(pThis->hFileDevice), IOCTL_STORAGE_MEDIA_REMOVAL,
     248                        &PreventMediaRemoval, sizeof(PreventMediaRemoval),
     249                        NULL, 0, &cbReturned,
     250                        NULL))
     251        rc = VINF_SUCCESS;
     252    else
     253        /** @todo figure out the return codes for already locked. */
     254        rc = RTErrConvertFromWin32(GetLastError());
     255
     256    return rc;
     257}
     258
     259
     260DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
     261{
     262    int rc = VINF_SUCCESS;
     263    RTFILE hFileDevice = pThis->hFileDevice;
     264    if (hFileDevice == NIL_RTFILE) /* obsolete crap */
     265        rc = RTFileOpen(&hFileDevice, pThis->pszDeviceOpen, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
     266    if (RT_SUCCESS(rc))
     267    {
     268        /* do ioctl */
     269        DWORD cbReturned;
     270        if (DeviceIoControl((HANDLE)RTFileToNative(hFileDevice), IOCTL_STORAGE_EJECT_MEDIA,
     271                            NULL, 0,
     272                            NULL, 0, &cbReturned,
     273                            NULL))
     274            rc = VINF_SUCCESS;
     275        else
     276            rc = RTErrConvertFromWin32(GetLastError());
     277
     278        /* clean up handle */
     279        if (hFileDevice != pThis->hFileDevice)
     280            RTFileClose(hFileDevice);
     281    }
     282    else
     283        AssertMsgFailed(("Failed to open '%s' for ejecting this tray.\n",  rc));
     284
     285    return rc;
     286}
     287
     288
    242289DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
    243290{
  • trunk/src/VBox/Devices/Storage/DrvHostBase.cpp

    r64274 r64278  
    14341434 * @returns VBox status code.
    14351435 * @param   pDrvIns         Driver instance.
     1436 * @param   pszCfgValid     Pointer to a string ofvalid CFGM options.
    14361437 * @param   pCfg            Configuration handle.
    14371438 * @param   enmType         Device type.
    14381439 */
    1439 int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, PDMMEDIATYPE enmType)
     1440int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, const char *pszCfgValid, PDMMEDIATYPE enmType)
    14401441{
    14411442    PDRVHOSTBASE pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTBASE);
     
    14911492    pThis->IMount.pfnUnlock                 = drvHostBaseUnlock;
    14921493    pThis->IMount.pfnIsLocked               = drvHostBaseIsLocked;
     1494
     1495    if (!CFGMR3AreValuesValid(pCfg, pszCfgValid))
     1496    {
     1497        pThis->fAttachFailError = true;
     1498        return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
     1499    }
    14931500
    14941501    /*
  • trunk/src/VBox/Devices/Storage/DrvHostBase.h

    r64252 r64278  
    185185
    186186
    187 int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, PDMMEDIATYPE enmType);
     187int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, const char *pszCfgValid, PDMMEDIATYPE enmType);
    188188int DRVHostBaseInitFinish(PDRVHOSTBASE pThis);
    189189int DRVHostBaseMediaPresent(PDRVHOSTBASE pThis);
     
    197197DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite);
    198198DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis);
    199 
     199DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock);
     200DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis);
     201
     202DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent);
    200203DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis);
    201204DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis);
  • trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp

    r64252 r64278  
    152152        /* Unlock drive if necessary. */
    153153        if (pThis->fLocked)
    154             drvHostDvdDoLock(pThis, false);
     154            drvHostBaseDoLockOs(pThis, false);
    155155
    156156        if (fEject)
     
    159159             * Eject the disc.
    160160             */
    161 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
    162             uint8_t abCmd[16] =
    163             {
    164                 SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0,
    165                 0,0,0,0,0,0,0,0,0,0
    166             };
    167             rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
    168 
    169 #elif defined(RT_OS_LINUX)
    170             rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROMEJECT, 0);
    171             if (rc < 0)
    172             {
    173                 if (errno == EBUSY)
    174                     rc = VERR_PDM_MEDIA_LOCKED;
    175                 else if (errno == ENOSYS)
    176                     rc = VERR_NOT_SUPPORTED;
    177                 else
    178                     rc = RTErrConvertFromErrno(errno);
    179             }
    180 
    181 #elif defined(RT_OS_SOLARIS)
    182             rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCEJECT, 0);
    183             if (rc < 0)
    184             {
    185                 if (errno == EBUSY)
    186                     rc = VERR_PDM_MEDIA_LOCKED;
    187                 else if (errno == ENOSYS || errno == ENOTSUP)
    188                     rc = VERR_NOT_SUPPORTED;
    189                 else if (errno == ENODEV)
    190                     rc = VERR_PDM_MEDIA_NOT_MOUNTED;
    191                 else
    192                     rc = RTErrConvertFromErrno(errno);
    193             }
    194 
    195 #elif defined(RT_OS_WINDOWS)
    196             RTFILE hFileDevice = pThis->hFileDevice;
    197             if (hFileDevice == NIL_RTFILE) /* obsolete crap */
    198                 rc = RTFileOpen(&hFileDevice, pThis->pszDeviceOpen, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
    199             if (RT_SUCCESS(rc))
    200             {
    201                 /* do ioctl */
    202                 DWORD cbReturned;
    203                 if (DeviceIoControl((HANDLE)RTFileToNative(hFileDevice), IOCTL_STORAGE_EJECT_MEDIA,
    204                                     NULL, 0,
    205                                     NULL, 0, &cbReturned,
    206                                     NULL))
    207                     rc = VINF_SUCCESS;
    208                 else
    209                     rc = RTErrConvertFromWin32(GetLastError());
    210 
    211                 /* clean up handle */
    212                 if (hFileDevice != pThis->hFileDevice)
    213                     RTFileClose(hFileDevice);
    214             }
    215             else
    216                 AssertMsgFailed(("Failed to open '%s' for ejecting this tray.\n",  rc));
    217 
    218 
    219 #else
    220             AssertMsgFailed(("Eject is not implemented!\n"));
    221             rc = VINF_SUCCESS;
    222 #endif
     161            rc = drvHostBaseEjectOs(pThis);
    223162        }
    224163
     
    249188static DECLCALLBACK(int) drvHostDvdDoLock(PDRVHOSTBASE pThis, bool fLock)
    250189{
    251 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
    252     uint8_t abCmd[16] =
    253     {
    254         SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0,
    255         0,0,0,0,0,0,0,0,0,0
    256     };
    257     int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
    258 
    259 #elif defined(RT_OS_LINUX)
    260     int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_LOCKDOOR, (int)fLock);
    261     if (rc < 0)
    262     {
    263         if (errno == EBUSY)
    264             rc = VERR_ACCESS_DENIED;
    265         else if (errno == EDRIVE_CANT_DO_THIS)
    266             rc = VERR_NOT_SUPPORTED;
    267         else
    268             rc = RTErrConvertFromErrno(errno);
    269     }
    270 
    271 #elif defined(RT_OS_SOLARIS)
    272     int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), fLock ? DKIOCLOCK : DKIOCUNLOCK, 0);
    273     if (rc < 0)
    274     {
    275         if (errno == EBUSY)
    276             rc = VERR_ACCESS_DENIED;
    277         else if (errno == ENOTSUP || errno == ENOSYS)
    278             rc = VERR_NOT_SUPPORTED;
    279         else
    280             rc = RTErrConvertFromErrno(errno);
    281     }
    282 
    283 #elif defined(RT_OS_WINDOWS)
    284 
    285     PREVENT_MEDIA_REMOVAL PreventMediaRemoval = {fLock};
    286     DWORD cbReturned;
    287     int rc;
    288     if (DeviceIoControl((HANDLE)RTFileToNative(pThis->hFileDevice), IOCTL_STORAGE_MEDIA_REMOVAL,
    289                         &PreventMediaRemoval, sizeof(PreventMediaRemoval),
    290                         NULL, 0, &cbReturned,
    291                         NULL))
    292         rc = VINF_SUCCESS;
    293     else
    294         /** @todo figure out the return codes for already locked. */
    295         rc = RTErrConvertFromWin32(GetLastError());
    296 
    297 #else
    298     AssertMsgFailed(("Lock/Unlock is not implemented!\n"));
    299     int rc = VINF_SUCCESS;
    300 
    301 #endif
     190    int rc = drvHostBaseDoLockOs(pThis, fLock);
    302191
    303192    LogFlow(("drvHostDvdDoLock(, fLock=%RTbool): returns %Rrc\n", fLock, rc));
     
    315204     * Poll for media change.
    316205     */
    317 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
    318 #ifdef RT_OS_DARWIN
    319     AssertReturn(pThis->ppScsiTaskDI, VERR_INTERNAL_ERROR);
    320 #endif
    321 
    322     /*
    323      * Issue a TEST UNIT READY request.
    324      */
    325     bool fMediaChanged = false;
    326     bool fMediaPresent = false;
    327     uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
    328     uint8_t abSense[32];
    329     int rc2 = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
    330     if (RT_SUCCESS(rc2))
    331         fMediaPresent = true;
    332     else if (   rc2 == VERR_UNRESOLVED_ERROR
    333              && abSense[2] == 6 /* unit attention */
    334              && (   (abSense[12] == 0x29 && abSense[13] < 5 /* reset */)
    335                  || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */)                        //???
    336                  || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */)  //???
    337                  || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */)              //???
    338                  || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */)
    339                  || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */)
    340                  )
    341             )
    342     {
    343         fMediaPresent = false;
    344         fMediaChanged = true;
    345         /** @todo check this media change stuff on Darwin. */
    346     }
    347 
    348 #elif defined(RT_OS_LINUX)
    349     bool fMediaPresent = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK;
    350     bool fMediaChanged = false;
    351     if (pThis->fMediaPresent != fMediaPresent)
    352         fMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1;
    353 
    354 #elif defined(RT_OS_SOLARIS)
    355206    bool fMediaPresent = false;
    356207    bool fMediaChanged = false;
    357 
    358     /* Need to pass the previous state and DKIO_NONE for the first time. */
    359     static dkio_state s_DeviceState = DKIO_NONE;
    360     dkio_state PreviousState = s_DeviceState;
    361     int rc2 = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCSTATE, &s_DeviceState);
    362     if (rc2 == 0)
    363     {
    364         fMediaPresent = (s_DeviceState == DKIO_INSERTED);
    365         if (PreviousState != s_DeviceState)
    366             fMediaChanged = true;
    367     }
    368 
    369 #else
    370 # error "Unsupported platform."
    371 #endif
     208    drvHostBaseQueryMediaStatusOs(pThis, &fMediaChanged, &fMediaPresent);
    372209
    373210    RTCritSectEnter(&pThis->CritSect);
     
    460297     * Init instance data.
    461298     */
    462     int rc = DRVHostBaseInitData(pDrvIns, pCfg, PDMMEDIATYPE_DVD);
     299    int rc = DRVHostBaseInitData(pDrvIns, pCfg, "Path\0Interval\0Locked\0BIOSVisible\0AttachFailError\0Passthrough\0",
     300                                 PDMMEDIATYPE_DVD);
    463301    if (RT_SUCCESS(rc))
    464302    {
    465303        /*
    466          * Validate configuration.
     304         * Override stuff.
    467305         */
    468         if (CFGMR3AreValuesValid(pCfg, "Path\0Interval\0Locked\0BIOSVisible\0AttachFailError\0Passthrough\0"))
     306#ifdef RT_OS_LINUX
     307        pThis->pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE);
     308        if (!pThis->pbDoubleBuffer)
     309            return VERR_NO_MEMORY;
     310#endif
     311
     312        bool fPassthrough;
     313        rc = CFGMR3QueryBool(pCfg, "Passthrough", &fPassthrough);
     314        if (RT_SUCCESS(rc) && fPassthrough)
    469315        {
    470             /*
    471              * Override stuff.
    472              */
    473 #ifdef RT_OS_LINUX
    474             pThis->pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE);
    475             if (!pThis->pbDoubleBuffer)
    476                 return VERR_NO_MEMORY;
     316            pThis->IMedia.pfnSendCmd = drvHostDvdSendCmd;
     317            /* Passthrough requires opening the device in R/W mode. */
     318            pThis->fReadOnlyConfig = false;
     319#ifdef VBOX_WITH_SUID_WRAPPER  /* Solaris setuid for Passthrough mode. */
     320            rc = solarisCheckUserAuth();
     321            if (RT_FAILURE(rc))
     322            {
     323                Log(("DVD: solarisCheckUserAuth failed. Permission denied!\n"));
     324                return rc;
     325            }
     326#endif /* VBOX_WITH_SUID_WRAPPER */
     327        }
     328
     329        pThis->IMount.pfnUnmount = drvHostDvdUnmount;
     330        pThis->pfnDoLock         = drvHostDvdDoLock;
     331#ifdef USE_MEDIA_POLLING
     332        if (!fPassthrough)
     333            pThis->pfnPoll       = drvHostDvdPoll;
     334        else
     335            pThis->pfnPoll       = NULL;
    477336#endif
    478337
    479             bool fPassthrough;
    480             rc = CFGMR3QueryBool(pCfg, "Passthrough", &fPassthrough);
    481             if (RT_SUCCESS(rc) && fPassthrough)
    482             {
    483                 pThis->IMedia.pfnSendCmd = drvHostDvdSendCmd;
    484                 /* Passthrough requires opening the device in R/W mode. */
    485                 pThis->fReadOnlyConfig = false;
    486 #ifdef VBOX_WITH_SUID_WRAPPER  /* Solaris setuid for Passthrough mode. */
    487                 rc = solarisCheckUserAuth();
    488                 if (RT_FAILURE(rc))
    489                 {
    490                     Log(("DVD: solarisCheckUserAuth failed. Permission denied!\n"));
    491                     return rc;
    492                 }
    493 #endif /* VBOX_WITH_SUID_WRAPPER */
    494             }
    495 
    496             pThis->IMount.pfnUnmount = drvHostDvdUnmount;
    497             pThis->pfnDoLock         = drvHostDvdDoLock;
    498 #ifdef USE_MEDIA_POLLING
    499             if (!fPassthrough)
    500                 pThis->pfnPoll       = drvHostDvdPoll;
    501             else
    502                 pThis->pfnPoll       = NULL;
    503 #endif
    504 
    505             /*
    506              * 2nd init part.
    507              */
    508             rc = DRVHostBaseInitFinish(pThis);
    509         }
    510         else
    511         {
    512             pThis->fAttachFailError = true;
    513             rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
    514         }
     338        /*
     339         * 2nd init part.
     340         */
     341        rc = DRVHostBaseInitFinish(pThis);
    515342    }
    516343    if (RT_FAILURE(rc))
  • trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp

    r64249 r64278  
    116116     * Init instance data.
    117117     */
    118     int rc = DRVHostBaseInitData(pDrvIns, pCfg, PDMMEDIATYPE_FLOPPY_1_44);
     118    int rc = DRVHostBaseInitData(pDrvIns, pCfg, "Path\0ReadOnly\0Interval\0Locked\0BIOSVisible\0",
     119                                 PDMMEDIATYPE_FLOPPY_1_44);
    119120    if (RT_SUCCESS(rc))
    120121    {
    121122        /*
    122          * Validate configuration.
     123         * Override stuff.
    123124         */
    124         if (CFGMR3AreValuesValid(pCfg, "Path\0ReadOnly\0Interval\0Locked\0BIOSVisible\0"))
    125         {
    126             /*
    127              * Override stuff.
    128              */
    129125#ifdef RT_OS_LINUX
    130             pThis->Base.pfnPoll         = drvHostFloppyPoll;
     126        pThis->Base.pfnPoll         = drvHostFloppyPoll;
    131127#endif
    132128
    133             /*
    134              * 2nd init part.
    135              */
    136             rc = DRVHostBaseInitFinish(&pThis->Base);
    137         }
    138         else
    139         {
    140             pThis->Base.fAttachFailError = true;
    141             rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
    142         }
     129        /*
     130         * 2nd init part.
     131         */
     132        rc = DRVHostBaseInitFinish(&pThis->Base);
    143133    }
     134
    144135    if (RT_FAILURE(rc))
    145136    {
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