Changeset 69813 in vbox for trunk/src/VBox/Runtime/common/fs
- Timestamp:
- Nov 23, 2017 6:33:30 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 119237
- Location:
- trunk/src/VBox/Runtime/common/fs
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/fs/fatvfs.cpp
r69678 r69813 2074 2074 static int rtFsFatObj_SetMode(PRTFSFATOBJ pThis, RTFMODE fMode, RTFMODE fMask) 2075 2075 { 2076 __debugbreak(); 2076 2077 #if 0 2077 2078 if (fMask != ~RTFS_TYPE_MASK) … … 4054 4055 4055 4056 /** 4057 * @interface_method_impl{RTVFSDIROPS,pfnOpen} 4058 */ 4059 static 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 /** 4056 4195 * @interface_method_impl{RTVFSDIROPS,pfnOpenFile} 4057 4196 */ 4058 static DECLCALLBACK(int) rtFsFatDir_OpenFile(void *pvThis, const char *pszFilename, uint 32_t fOpen, PRTVFSFILE phVfsFile)4197 static DECLCALLBACK(int) rtFsFatDir_OpenFile(void *pvThis, const char *pszFilename, uint64_t fOpen, PRTVFSFILE phVfsFile) 4059 4198 { 4060 4199 PRTFSFATDIR pThis = (PRTFSFATDIR)pvThis; … … 4639 4778 RTVFSOBJSETOPS_VERSION 4640 4779 }, 4780 rtFsFatDir_Open, 4641 4781 rtFsFatDir_TraversalOpen, 4642 4782 rtFsFatDir_OpenFile, -
trunk/src/VBox/Runtime/common/fs/isovfs.cpp
r69594 r69813 2993 2993 2994 2994 /** 2995 * @interface_method_impl{RTVFSDIROPS,pfnOpen} 2996 */ 2997 static 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 /** 2995 3134 * @interface_method_impl{RTVFSDIROPS,pfnOpenFile} 2996 3135 */ 2997 static DECLCALLBACK(int) rtFsIsoDir_OpenFile(void *pvThis, const char *pszFilename, uint 32_t fOpen, PRTVFSFILE phVfsFile)3136 static DECLCALLBACK(int) rtFsIsoDir_OpenFile(void *pvThis, const char *pszFilename, uint64_t fOpen, PRTVFSFILE phVfsFile) 2998 3137 { 2999 3138 PRTFSISODIROBJ pThis = (PRTFSISODIROBJ)pvThis; … … 3654 3793 RTVFSOBJSETOPS_VERSION 3655 3794 }, 3795 rtFsIsoDir_Open, 3656 3796 rtFsIsoDir_TraversalOpen, 3657 3797 rtFsIsoDir_OpenFile,
Note:
See TracChangeset
for help on using the changeset viewer.