VirtualBox

Ignore:
Timestamp:
Apr 18, 2017 3:27:30 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
114635
Message:

IPRT/vfs-chains: Pass around an pErrInfo buffer too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/filesystem/fatvfs.cpp

    r66574 r66602  
    463463 * @interface_method_impl{RTVFSDIROPS,pfnOpenDir}
    464464 */
    465 static DECLCALLBACK(int) rtFsFatDir_OpenDir(void *pvThis, const char *pszSubDir, PRTVFSDIR phVfsDir)
    466 {
    467     RT_NOREF(pvThis, pszSubDir, phVfsDir);
     465static DECLCALLBACK(int) rtFsFatDir_OpenDir(void *pvThis, const char *pszSubDir, uint32_t fFlags, PRTVFSDIR phVfsDir)
     466{
     467    RT_NOREF(pvThis, pszSubDir, fFlags, phVfsDir);
    468468    return VERR_NOT_IMPLEMENTED;
    469469}
     
    516516static DECLCALLBACK(int) rtFsFatDir_RewindDir(void *pvThis)
    517517{
     518    RT_NOREF(pvThis);
    518519    return VERR_NOT_IMPLEMENTED;
    519520}
     
    526527                                            RTFSOBJATTRADD enmAddAttr)
    527528{
     529    RT_NOREF(pvThis, pDirEntry, pcbDirEntry, enmAddAttr);
    528530    return VERR_NOT_IMPLEMENTED;
    529531}
     
    571573static DECLCALLBACK(void) rtFsFatVol_Destroy(void *pvThis)
    572574{
     575    RT_NOREF(pvThis);
    573576}
    574577
     
    579582static DECLCALLBACK(int) rtFsFatVol_OpenRoot(void *pvThis, PRTVFSDIR phVfsDir)
    580583{
     584    RT_NOREF(pvThis, phVfsDir);
    581585    return VERR_NOT_IMPLEMENTED;
    582586}
     
    604608};
    605609
     610
     611
     612RTDECL(int) RTFsFatVolOpen(RTVFSFILE hVfsFileIn, bool fReadOnly, PRTVFS phVfs, PRTERRINFO pErrInfo)
     613{
     614    RT_NOREF(hVfsFileIn, fReadOnly, pErrInfo, phVfs);
     615    return VERR_NOT_IMPLEMENTED;
     616}
     617
     618
     619/**
     620 * @interface_method_impl{RTVFSCHAINELEMENTREG,pfnValidate}
     621 */
     622static DECLCALLBACK(int) rtVfsChainFatVol_Validate(PCRTVFSCHAINELEMENTREG pProviderReg, PRTVFSCHAINSPEC pSpec,
     623                                                   PRTVFSCHAINELEMSPEC pElement, uint32_t *poffError, PRTERRINFO pErrInfo)
     624{
     625    RT_NOREF(pProviderReg);
     626
     627    /*
     628     * Basic checks.
     629     */
     630    if (pElement->enmTypeIn != RTVFSOBJTYPE_FILE)
     631        return pElement->enmTypeIn == RTVFSOBJTYPE_INVALID ? VERR_VFS_CHAIN_CANNOT_BE_FIRST_ELEMENT : VERR_VFS_CHAIN_TAKES_FILE;
     632    if (   pElement->enmType != RTVFSOBJTYPE_VFS
     633        && pElement->enmType != RTVFSOBJTYPE_DIR)
     634        return VERR_VFS_CHAIN_ONLY_DIR_OR_VFS;
     635    if (pElement->cArgs > 1)
     636        return VERR_VFS_CHAIN_AT_MOST_ONE_ARG;
     637
     638    /*
     639     * Parse the flag if present, save in pElement->uProvider.
     640     */
     641    bool fReadOnly = (pSpec->fOpenFile & RTFILE_O_ACCESS_MASK) == RTFILE_O_READ;
     642    if (pElement->cArgs > 0)
     643    {
     644        const char *psz = pElement->paArgs[0].psz;
     645        if (*psz)
     646        {
     647            if (!strcmp(psz, "ro"))
     648                fReadOnly = true;
     649            else if (!strcmp(psz, "rw"))
     650                fReadOnly = false;
     651            else
     652            {
     653                *poffError = pElement->paArgs[0].offSpec;
     654                return RTErrInfoSet(pErrInfo, VERR_VFS_CHAIN_INVALID_ARGUMENT, "Expected 'ro' or 'rw' as argument");
     655            }
     656        }
     657    }
     658
     659    pElement->uProvider = fReadOnly;
     660    return VINF_SUCCESS;
     661}
     662
     663
     664/**
     665 * @interface_method_impl{RTVFSCHAINELEMENTREG,pfnInstantiate}
     666 */
     667static DECLCALLBACK(int) rtVfsChainFatVol_Instantiate(PCRTVFSCHAINELEMENTREG pProviderReg, PCRTVFSCHAINSPEC pSpec,
     668                                                      PCRTVFSCHAINELEMSPEC pElement, RTVFSOBJ hPrevVfsObj,
     669                                                      PRTVFSOBJ phVfsObj, uint32_t *poffError, PRTERRINFO pErrInfo)
     670{
     671    RT_NOREF(pProviderReg, pSpec, poffError);
     672
     673    int         rc;
     674    RTVFSFILE   hVfsFileIn = RTVfsObjToFile(hPrevVfsObj);
     675    if (hVfsFileIn != NIL_RTVFSFILE)
     676    {
     677        RTVFS hVfs;
     678        rc = RTFsFatVolOpen(hVfsFileIn, pElement->uProvider != false, &hVfs, pErrInfo);
     679        RTVfsFileRelease(hVfsFileIn);
     680        if (RT_SUCCESS(rc))
     681        {
     682            *phVfsObj = RTVfsObjFromVfs(hVfs);
     683            RTVfsRelease(hVfs);
     684            if (*phVfsObj != NIL_RTVFSOBJ)
     685                return VINF_SUCCESS;
     686            rc = VERR_VFS_CHAIN_CAST_FAILED;
     687        }
     688    }
     689    else
     690        rc = VERR_VFS_CHAIN_CAST_FAILED;
     691    return rc;
     692}
     693
     694
     695/**
     696 * @interface_method_impl{RTVFSCHAINELEMENTREG,pfnCanReuseElement}
     697 */
     698static DECLCALLBACK(bool) rtVfsChainFatVol_CanReuseElement(PCRTVFSCHAINELEMENTREG pProviderReg,
     699                                                           PCRTVFSCHAINSPEC pSpec, PCRTVFSCHAINELEMSPEC pElement,
     700                                                           PCRTVFSCHAINSPEC pReuseSpec, PCRTVFSCHAINELEMSPEC pReuseElement)
     701{
     702    RT_NOREF(pProviderReg, pSpec, pReuseSpec);
     703    if (   pElement->paArgs[0].uProvider == pReuseElement->paArgs[0].uProvider
     704        || !pReuseElement->paArgs[0].uProvider)
     705        return true;
     706    return false;
     707}
     708
     709
     710/** VFS chain element 'file'. */
     711static RTVFSCHAINELEMENTREG g_rtVfsChainFatVolReg =
     712{
     713    /* uVersion = */            RTVFSCHAINELEMENTREG_VERSION,
     714    /* fReserved = */           0,
     715    /* pszName = */             "fat",
     716    /* ListEntry = */           { NULL, NULL },
     717    /* pszHelp = */             "Open a FAT file system, requires a file object on the left side.\n"
     718                                "First argument is an optional 'ro' (read-only) or 'rw' (read-write) flag.\n",
     719    /* pfnValidate = */         rtVfsChainFatVol_Validate,
     720    /* pfnInstantiate = */      rtVfsChainFatVol_Instantiate,
     721    /* pfnCanReuseElement = */  rtVfsChainFatVol_CanReuseElement,
     722    /* uEndMarker = */          RTVFSCHAINELEMENTREG_VERSION
     723};
     724
     725RTVFSCHAIN_AUTO_REGISTER_ELEMENT_PROVIDER(&g_rtVfsChainFatVolReg, rtVfsChainFatVolReg);
     726
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