public Result OpenBaseFileSystem(out ReferenceCountedDisposable <IFileSystemSf> fileSystem, BaseFileSystemId fileSystemId) { UnsafeHelpers.SkipParamInit(out fileSystem); Result rc = CheckCapabilityById(fileSystemId, _processId); if (rc.IsFailure()) { return(rc); } ReferenceCountedDisposable <IFileSystem> fs = null; try { // Open the file system rc = _serviceImpl.OpenBaseFileSystem(out fs, fileSystemId); if (rc.IsFailure()) { return(rc); } // Create an SF adapter for the file system fileSystem = FileSystemInterfaceAdapter.CreateShared(ref fs); return(Result.Success); } finally { fs?.Dispose(); } }
private Result CheckCapabilityById(BaseFileSystemId id, ulong processId) { Result rc = GetProgramInfo(out ProgramInfo programInfo, processId); if (rc.IsFailure()) { return(rc); } if (id == BaseFileSystemId.TemporaryDirectory) { Accessibility accessibility = programInfo.AccessControl.GetAccessibilityFor(AccessibilityType.MountTemporaryDirectory); if (!accessibility.CanRead || !accessibility.CanWrite) { return(ResultFs.PermissionDenied.Log()); } } else { Accessibility accessibility = programInfo.AccessControl.GetAccessibilityFor(AccessibilityType.MountAllBaseFileSystem); if (!accessibility.CanRead || !accessibility.CanWrite) { return(ResultFs.PermissionDenied.Log()); } } return(Result.Success); }