VirtualBox

Changeset 69813 in vbox for trunk/src/VBox/Runtime/common/fs


Ignore:
Timestamp:
Nov 23, 2017 6:33:30 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119237
Message:

IPRT: VFS opening reworking in progress.

Location:
trunk/src/VBox/Runtime/common/fs
Files:
2 edited

Legend:

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

    r69678 r69813  
    20742074static int rtFsFatObj_SetMode(PRTFSFATOBJ pThis, RTFMODE fMode, RTFMODE fMask)
    20752075{
     2076    __debugbreak();
    20762077#if 0
    20772078    if (fMask != ~RTFS_TYPE_MASK)
     
    40544055
    40554056/**
     4057 * @interface_method_impl{RTVFSDIROPS,pfnOpen}
     4058 */
     4059static DECLCALLBACK(int) rtFsFatDir_Open(void *pvThis, const char *pszEntry, uint64_t fOpen,
     4060                                         uint32_t fFlags, PRTVFSOBJ phVfsObj)
     4061{
     4062    PRTFSFATDIR     pThis   = (PRTFSFATDIR)pvThis;
     4063    PRTFSFATDIRSHRD pShared = pThis->pShared;
     4064
     4065    /*
     4066     * Try open existing file.
     4067     */
     4068    uint32_t    offEntryInDir;
     4069    bool        fLong;
     4070    FATDIRENTRY DirEntry;
     4071    int rc = rtFsFatDirShrd_FindEntry(pShared, pszEntry, &offEntryInDir, &fLong, &DirEntry);
     4072    if (RT_SUCCESS(rc))
     4073    {
     4074        switch (DirEntry.fAttrib & (FAT_ATTR_DIRECTORY | FAT_ATTR_VOLUME))
     4075        {
     4076            case 0:
     4077                if (fFlags & RTVFSOBJ_F_OPEN_FILE)
     4078                {
     4079                    if (   !(DirEntry.fAttrib & FAT_ATTR_READONLY)
     4080                        || !(fOpen & RTFILE_O_WRITE))
     4081                    {
     4082                        if (   (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN
     4083                            || (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN_CREATE
     4084                            || (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_CREATE_REPLACE)
     4085                        {
     4086                            RTVFSFILE hVfsFile;
     4087                            rc = rtFsFatFile_New(pShared->Core.pVol, pShared, &DirEntry, offEntryInDir, fOpen, &hVfsFile);
     4088                            if (RT_SUCCESS(rc))
     4089                            {
     4090                                *phVfsObj = RTVfsObjFromFile(hVfsFile);
     4091                                RTVfsFileRelease(hVfsFile);
     4092                                AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     4093                            }
     4094                        }
     4095                        else
     4096                            rc = VERR_ALREADY_EXISTS;
     4097                    }
     4098                    else
     4099                        rc = VERR_ACCESS_DENIED;
     4100                }
     4101                else
     4102                    rc = VERR_IS_A_FILE;
     4103                break;
     4104
     4105            case FAT_ATTR_DIRECTORY:
     4106                if (fFlags & RTVFSOBJ_F_OPEN_DIRECTORY)
     4107                {
     4108                    if (   !(DirEntry.fAttrib & FAT_ATTR_READONLY)
     4109                        || !(fOpen & RTFILE_O_WRITE))
     4110                    {
     4111                        if (   (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN
     4112                            || (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN_CREATE)
     4113                        {
     4114                            RTVFSDIR hVfsDir;
     4115                            rc = rtFsFatDir_New(pShared->Core.pVol, pShared, &DirEntry, offEntryInDir,
     4116                                                RTFSFAT_GET_CLUSTER(&DirEntry, pShared->Core.pVol), UINT64_MAX /*offDisk*/,
     4117                                                DirEntry.cbFile, &hVfsDir);
     4118                            if (RT_SUCCESS(rc))
     4119                            {
     4120                                *phVfsObj = RTVfsObjFromDir(hVfsDir);
     4121                                RTVfsDirRelease(hVfsDir);
     4122                                AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     4123                            }
     4124                        }
     4125                        else if ((fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_CREATE_REPLACE)
     4126                            rc = VERR_INVALID_FUNCTION;
     4127                        else
     4128                            rc = VERR_ALREADY_EXISTS;
     4129                    }
     4130                    else
     4131                        rc = VERR_ACCESS_DENIED;
     4132                }
     4133                else
     4134                    rc = VERR_IS_A_DIRECTORY;
     4135                break;
     4136
     4137            default:
     4138                rc = VERR_PATH_NOT_FOUND;
     4139                break;
     4140        }
     4141    }
     4142    /*
     4143     * Create a file or directory?
     4144     */
     4145    else if (rc == VERR_FILE_NOT_FOUND)
     4146    {
     4147        if (   (   (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_CREATE
     4148                || (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN_CREATE
     4149                || (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_CREATE_REPLACE)
     4150            && (fFlags & RTVFSOBJ_F_CREATE_MASK) != RTVFSOBJ_F_CREATE_NOTHING)
     4151        {
     4152            if ((fFlags & RTVFSOBJ_F_CREATE_MASK) == RTVFSOBJ_F_CREATE_FILE)
     4153            {
     4154                rc = rtFsFatDirShrd_CreateEntry(pShared, pszEntry, FAT_ATTR_ARCHIVE, 0 /*cbInitial*/, &offEntryInDir, &DirEntry);
     4155                if (RT_SUCCESS(rc))
     4156                {
     4157                    RTVFSFILE hVfsFile;
     4158                    rc = rtFsFatFile_New(pShared->Core.pVol, pShared, &DirEntry, offEntryInDir, fOpen, &hVfsFile);
     4159                    if (RT_SUCCESS(rc))
     4160                    {
     4161                        *phVfsObj = RTVfsObjFromFile(hVfsFile);
     4162                        RTVfsFileRelease(hVfsFile);
     4163                        AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     4164                    }
     4165                }
     4166            }
     4167            else if ((fFlags & RTVFSOBJ_F_CREATE_MASK) == RTVFSOBJ_F_CREATE_DIRECTORY)
     4168            {
     4169                rc = rtFsFatDirShrd_CreateEntry(pShared, pszEntry, FAT_ATTR_ARCHIVE | FAT_ATTR_DIRECTORY,
     4170                                                pShared->Core.pVol->cbCluster, &offEntryInDir, &DirEntry);
     4171                if (RT_SUCCESS(rc))
     4172                {
     4173                    RTVFSDIR hVfsDir;
     4174                    rc = rtFsFatDir_New(pShared->Core.pVol, pShared, &DirEntry, offEntryInDir,
     4175                                        RTFSFAT_GET_CLUSTER(&DirEntry, pShared->Core.pVol), UINT64_MAX /*offDisk*/,
     4176                                        DirEntry.cbFile, &hVfsDir);
     4177                    if (RT_SUCCESS(rc))
     4178                    {
     4179                        *phVfsObj = RTVfsObjFromDir(hVfsDir);
     4180                        RTVfsDirRelease(hVfsDir);
     4181                        AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     4182                    }
     4183                }
     4184            }
     4185            else
     4186                rc = VERR_VFS_UNSUPPORTED_CREATE_TYPE;
     4187        }
     4188    }
     4189
     4190    return rc;
     4191}
     4192
     4193
     4194/**
    40564195 * @interface_method_impl{RTVFSDIROPS,pfnOpenFile}
    40574196 */
    4058 static DECLCALLBACK(int) rtFsFatDir_OpenFile(void *pvThis, const char *pszFilename, uint32_t fOpen, PRTVFSFILE phVfsFile)
     4197static DECLCALLBACK(int) rtFsFatDir_OpenFile(void *pvThis, const char *pszFilename, uint64_t fOpen, PRTVFSFILE phVfsFile)
    40594198{
    40604199    PRTFSFATDIR     pThis   = (PRTFSFATDIR)pvThis;
     
    46394778        RTVFSOBJSETOPS_VERSION
    46404779    },
     4780    rtFsFatDir_Open,
    46414781    rtFsFatDir_TraversalOpen,
    46424782    rtFsFatDir_OpenFile,
  • trunk/src/VBox/Runtime/common/fs/isovfs.cpp

    r69594 r69813  
    29932993
    29942994/**
     2995 * @interface_method_impl{RTVFSDIROPS,pfnOpen}
     2996 */
     2997static DECLCALLBACK(int) rtFsIsoDir_Open(void *pvThis, const char *pszEntry, uint64_t fOpen,
     2998                                         uint32_t fFlags, PRTVFSOBJ phVfsObj)
     2999{
     3000    PRTFSISODIROBJ  pThis   = (PRTFSISODIROBJ)pvThis;
     3001    PRTFSISODIRSHRD pShared = pThis->pShared;
     3002
     3003    /*
     3004     * We cannot create or replace anything, just open stuff.
     3005     */
     3006    if (   (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_CREATE
     3007        || (fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_CREATE_REPLACE)
     3008        return VERR_WRITE_PROTECT;
     3009
     3010    /*
     3011     * Try open whatever it is.
     3012     */
     3013    int rc;
     3014    if (pShared->Core.pVol->enmType != RTFSISOVOLTYPE_UDF)
     3015    {
     3016        /*
     3017         * ISO 9660
     3018         */
     3019        PCISO9660DIRREC pDirRec;
     3020        uint64_t        offDirRec;
     3021        uint32_t        cDirRecs;
     3022        RTFMODE         fMode;
     3023        uint32_t        uVersion;
     3024        rc = rtFsIsoDir_FindEntry9660(pShared, pszEntry, &offDirRec, &pDirRec, &cDirRecs, &fMode, &uVersion);
     3025        Log2(("rtFsIsoDir_Open: FindEntry9660(,%s,) -> %Rrc\n", pszEntry, rc));
     3026        if (RT_SUCCESS(rc))
     3027        {
     3028            switch (fMode & RTFS_TYPE_MASK)
     3029            {
     3030                case RTFS_TYPE_FILE:
     3031                    if (fFlags & RTVFSOBJ_F_OPEN_FILE)
     3032                    {
     3033                        RTVFSFILE hVfsFile;
     3034                        rc = rtFsIsoFile_New9660(pShared->Core.pVol, pShared, pDirRec, cDirRecs,
     3035                                                 offDirRec, fOpen, uVersion, &hVfsFile);
     3036                        if (RT_SUCCESS(rc))
     3037                        {
     3038                            *phVfsObj = RTVfsObjFromFile(hVfsFile);
     3039                            RTVfsFileRelease(hVfsFile);
     3040                            AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     3041                        }
     3042                    }
     3043                    else
     3044                        rc = VERR_IS_A_FILE;
     3045                    break;
     3046
     3047                case RTFS_TYPE_DIRECTORY:
     3048                    if (fFlags & RTVFSOBJ_F_OPEN_DIRECTORY)
     3049                    {
     3050                        RTVFSDIR hVfsDir;
     3051                        rc = rtFsIsoDir_New9660(pShared->Core.pVol, pShared, pDirRec, cDirRecs, offDirRec, &hVfsDir);
     3052                        if (RT_SUCCESS(rc))
     3053                        {
     3054                            *phVfsObj = RTVfsObjFromDir(hVfsDir);
     3055                            RTVfsDirRelease(hVfsDir);
     3056                            AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     3057                        }
     3058                    }
     3059                    else
     3060                        rc = VERR_IS_A_DIRECTORY;
     3061                    break;
     3062
     3063                case RTFS_TYPE_SYMLINK:
     3064                case RTFS_TYPE_DEV_BLOCK:
     3065                case RTFS_TYPE_DEV_CHAR:
     3066                case RTFS_TYPE_FIFO:
     3067                case RTFS_TYPE_SOCKET:
     3068                case RTFS_TYPE_WHITEOUT:
     3069                    rc = VERR_NOT_IMPLEMENTED;
     3070                    break;
     3071
     3072                default:
     3073                    rc = VERR_PATH_NOT_FOUND;
     3074                    break;
     3075            }
     3076        }
     3077    }
     3078    else
     3079    {
     3080        /*
     3081         * UDF
     3082         */
     3083        PCUDFFILEIDDESC pFid;
     3084        rc = rtFsIsoDir_FindEntryUdf(pShared, pszEntry, &pFid);
     3085        Log2(("rtFsIsoDir_Open: FindEntryUdf(,%s,) -> %Rrc\n", pszEntry, rc));
     3086        if (RT_SUCCESS(rc))
     3087        {
     3088            if (!(pFid->fFlags & UDF_FILE_FLAGS_DELETED))
     3089            {
     3090                if (!(pFid->fFlags & UDF_FILE_FLAGS_DIRECTORY))
     3091                {
     3092                    if (fFlags & RTVFSOBJ_F_OPEN_FILE)
     3093                    {
     3094                        RTVFSFILE hVfsFile;
     3095                        rc = rtFsIsoFile_NewUdf(pShared->Core.pVol, pShared, pFid, fOpen, &hVfsFile);
     3096                        if (RT_SUCCESS(rc))
     3097                        {
     3098                            *phVfsObj = RTVfsObjFromFile(hVfsFile);
     3099                            RTVfsFileRelease(hVfsFile);
     3100                            AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     3101                        }
     3102                    }
     3103                    else
     3104                        rc = VERR_IS_A_FILE;
     3105                }
     3106                else
     3107                {
     3108                    if (fFlags & RTVFSOBJ_F_OPEN_DIRECTORY)
     3109                    {
     3110                        RTVFSDIR hVfsDir;
     3111                        rc = rtFsIsoDir_NewUdf(pShared->Core.pVol, pShared, pFid, &hVfsDir);
     3112                        if (RT_SUCCESS(rc))
     3113                        {
     3114                            *phVfsObj = RTVfsObjFromDir(hVfsDir);
     3115                            RTVfsDirRelease(hVfsDir);
     3116                            AssertStmt(*phVfsObj != NIL_RTVFSOBJ, rc = VERR_INTERNAL_ERROR_3);
     3117                        }
     3118                    }
     3119                    else
     3120                        rc = VERR_IS_A_DIRECTORY;
     3121                }
     3122            }
     3123            /* We treat UDF_FILE_FLAGS_DELETED like RTFS_TYPE_WHITEOUT for now. */
     3124            else
     3125                rc = VERR_PATH_NOT_FOUND;
     3126        }
     3127    }
     3128    return rc;
     3129
     3130}
     3131
     3132
     3133/**
    29953134 * @interface_method_impl{RTVFSDIROPS,pfnOpenFile}
    29963135 */
    2997 static DECLCALLBACK(int) rtFsIsoDir_OpenFile(void *pvThis, const char *pszFilename, uint32_t fOpen, PRTVFSFILE phVfsFile)
     3136static DECLCALLBACK(int) rtFsIsoDir_OpenFile(void *pvThis, const char *pszFilename, uint64_t fOpen, PRTVFSFILE phVfsFile)
    29983137{
    29993138    PRTFSISODIROBJ  pThis   = (PRTFSISODIROBJ)pvThis;
     
    36543793        RTVFSOBJSETOPS_VERSION
    36553794    },
     3795    rtFsIsoDir_Open,
    36563796    rtFsIsoDir_TraversalOpen,
    36573797    rtFsIsoDir_OpenFile,
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