Use BaseFileSystemService in FileSystemProxy

This commit is contained in:
Alex Barney 2020-09-06 00:25:08 -07:00
parent be55aa7e9c
commit 2bd7bb7892
8 changed files with 92 additions and 35 deletions

View file

@ -3,6 +3,7 @@ using System.Diagnostics;
using LibHac.Common; using LibHac.Common;
using LibHac.Fs.Fsa; using LibHac.Fs.Fsa;
using LibHac.FsSrv; using LibHac.FsSrv;
using LibHac.FsSrv.Sf;
using LibHac.FsSystem; using LibHac.FsSystem;
using LibHac.Util; using LibHac.Util;
using static LibHac.Fs.CommonMountNames; using static LibHac.Fs.CommonMountNames;
@ -85,15 +86,12 @@ namespace LibHac.Fs.Shim
Result rc = MountHelpers.CheckMountNameAcceptingReservedMountName(mountName); Result rc = MountHelpers.CheckMountNameAcceptingReservedMountName(mountName);
if (rc.IsFailure()) return rc; if (rc.IsFailure()) return rc;
FsPath sfPath;
unsafe { _ = &sfPath; } // workaround for CS0165
IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject(); IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject();
// Nintendo doesn't use the provided rootPath // Nintendo doesn't use the provided rootPath
sfPath.Str[0] = 0; FspPath.CreateEmpty(out FspPath sfPath);
rc = fsProxy.OpenBisFileSystem(out IFileSystem fileSystem, ref sfPath, partitionId); rc = fsProxy.OpenBisFileSystem(out IFileSystem fileSystem, in sfPath, partitionId);
if (rc.IsFailure()) return rc; if (rc.IsFailure()) return rc;
var nameGenerator = new BisCommonMountNameGenerator(partitionId); var nameGenerator = new BisCommonMountNameGenerator(partitionId);

View file

@ -37,7 +37,7 @@ namespace LibHac.FsSrv
// Reject opening invalid partitions // Reject opening invalid partitions
if (requiredAccess == AccessibilityType.NotMount) if (requiredAccess == AccessibilityType.NotMount)
return ResultFs.InvalidAlignment.Log(); return ResultFs.InvalidArgument.Log();
// Verify the caller has the required permissions // Verify the caller has the required permissions
Accessibility accessibility = programInfo.AccessControl.GetAccessibilityFor(requiredAccess); Accessibility accessibility = programInfo.AccessControl.GetAccessibilityFor(requiredAccess);

View file

@ -9,6 +9,7 @@ using LibHac.FsSrv.Sf;
using LibHac.FsSystem; using LibHac.FsSystem;
using LibHac.Kvdb; using LibHac.Kvdb;
using LibHac.Ncm; using LibHac.Ncm;
using LibHac.Sf;
using LibHac.Spl; using LibHac.Spl;
using LibHac.Util; using LibHac.Util;
@ -718,9 +719,9 @@ namespace LibHac.FsSrv
throw new NotImplementedException(); throw new NotImplementedException();
} }
public Result OpenImageDirectoryFileSystem(out IFileSystem fileSystem, ImageDirectoryId dirId) public Result OpenImageDirectoryFileSystem(out IFileSystem fileSystem, ImageDirectoryId directoryId)
{ {
throw new NotImplementedException(); return GetBaseFileSystemService().OpenImageDirectoryFileSystem(out fileSystem, directoryId);
} }
public Result RegisterProgramIndexMapInfo(ReadOnlySpan<byte> programIndexMapInfoBuffer, int programCount) public Result RegisterProgramIndexMapInfo(ReadOnlySpan<byte> programIndexMapInfoBuffer, int programCount)
@ -733,16 +734,9 @@ namespace LibHac.FsSrv
throw new NotImplementedException(); throw new NotImplementedException();
} }
public Result OpenBisFileSystem(out IFileSystem fileSystem, ref FsPath rootPath, BisPartitionId partitionId) public Result OpenBisFileSystem(out IFileSystem fileSystem, in FspPath rootPath, BisPartitionId partitionId)
{ {
fileSystem = default; return GetBaseFileSystemService().OpenBisFileSystem(out fileSystem, in rootPath, partitionId);
// Missing permission check, speed emulation storage type wrapper, and FileSystemInterfaceAdapter
Result rc = PathTools.Normalize(out U8Span normalizedPath, rootPath);
if (rc.IsFailure()) return rc;
return FsProxyCore.OpenBisFileSystem(out fileSystem, normalizedPath.ToString(), partitionId);
} }
public Result OpenBisStorage(out IStorage storage, BisPartitionId partitionId) public Result OpenBisStorage(out IStorage storage, BisPartitionId partitionId)
@ -769,24 +763,22 @@ namespace LibHac.FsSrv
public Result OpenSdCardFileSystem(out IFileSystem fileSystem) public Result OpenSdCardFileSystem(out IFileSystem fileSystem)
{ {
// Missing permission check, speed emulation storage type wrapper, and FileSystemInterfaceAdapter return GetBaseFileSystemService().OpenSdCardFileSystem(out fileSystem);
return FsProxyCore.OpenSdCardFileSystem(out fileSystem);
} }
public Result FormatSdCardFileSystem() public Result FormatSdCardFileSystem()
{ {
throw new NotImplementedException(); return GetBaseFileSystemService().FormatSdCardFileSystem();
} }
public Result FormatSdCardDryRun() public Result FormatSdCardDryRun()
{ {
throw new NotImplementedException(); return GetBaseFileSystemService().FormatSdCardDryRun();
} }
public Result IsExFatSupported(out bool isSupported) public Result IsExFatSupported(out bool isSupported)
{ {
throw new NotImplementedException(); return GetBaseFileSystemService().IsExFatSupported(out isSupported);
} }
public Result OpenGameCardStorage(out IStorage storage, GameCardHandle handle, GameCardPartitionRaw partitionId) public Result OpenGameCardStorage(out IStorage storage, GameCardHandle handle, GameCardPartitionRaw partitionId)
@ -1045,9 +1037,7 @@ namespace LibHac.FsSrv
public Result OpenGameCardFileSystem(out IFileSystem fileSystem, GameCardHandle handle, public Result OpenGameCardFileSystem(out IFileSystem fileSystem, GameCardHandle handle,
GameCardPartition partitionId) GameCardPartition partitionId)
{ {
// Missing permission check and FileSystemInterfaceAdapter return GetBaseFileSystemService().OpenGameCardFileSystem(out fileSystem, handle, partitionId);
return FsProxyCore.OpenGameCardFileSystem(out fileSystem, handle, partitionId);
} }
public Result QuerySaveDataTotalSize(out long totalSize, long dataSize, long journalSize) public Result QuerySaveDataTotalSize(out long totalSize, long dataSize, long journalSize)
@ -1137,12 +1127,12 @@ namespace LibHac.FsSrv
public Result CreatePaddingFile(long size) public Result CreatePaddingFile(long size)
{ {
throw new NotImplementedException(); return GetBaseFileSystemService().CreatePaddingFile(size);
} }
public Result DeleteAllPaddingFiles() public Result DeleteAllPaddingFiles()
{ {
throw new NotImplementedException(); return GetBaseFileSystemService().DeleteAllPaddingFiles();
} }
public Result DisableAutoSaveDataCreation() public Result DisableAutoSaveDataCreation()
@ -1223,6 +1213,11 @@ namespace LibHac.FsSrv
return Result.Success; return Result.Success;
} }
public Result OpenBisWiper(out IWiper bisWiper, NativeHandle transferMemoryHandle, ulong transferMemorySize)
{
return GetBaseFileSystemService().OpenBisWiper(out bisWiper, transferMemoryHandle, transferMemorySize);
}
internal Result OpenMultiCommitContextSaveData(out IFileSystem fileSystem) internal Result OpenMultiCommitContextSaveData(out IFileSystem fileSystem)
{ {
fileSystem = default; fileSystem = default;
@ -1272,6 +1267,11 @@ namespace LibHac.FsSrv
return FsProxyCore.ProgramRegistry.GetProgramInfo(out programInfo, CurrentProcess); return FsProxyCore.ProgramRegistry.GetProgramInfo(out programInfo, CurrentProcess);
} }
private BaseFileSystemService GetBaseFileSystemService()
{
return new BaseFileSystemService(FsProxyCore.Config.BaseFileSystemServiceImpl, CurrentProcess);
}
internal bool IsCurrentProcess(ulong processId) internal bool IsCurrentProcess(ulong processId)
{ {
ulong currentId = Hos.Os.GetCurrentProcessId().Value; ulong currentId = Hos.Os.GetCurrentProcessId().Value;

View file

@ -5,6 +5,7 @@ namespace LibHac.FsSrv
public class FileSystemProxyConfiguration public class FileSystemProxyConfiguration
{ {
public FileSystemCreators FsCreatorInterfaces { get; set; } public FileSystemCreators FsCreatorInterfaces { get; set; }
public BaseFileSystemServiceImpl BaseFileSystemServiceImpl { get; set; }
public ProgramRegistryServiceImpl ProgramRegistryServiceImpl { get; set; } public ProgramRegistryServiceImpl ProgramRegistryServiceImpl { get; set; }
} }
} }

View file

@ -3,6 +3,7 @@ using LibHac.Fs;
using LibHac.Fs.Impl; using LibHac.Fs.Impl;
using LibHac.Fs.Shim; using LibHac.Fs.Shim;
using LibHac.FsSrv.Creators; using LibHac.FsSrv.Creators;
using LibHac.FsSrv.Impl;
using LibHac.Sm; using LibHac.Sm;
namespace LibHac.FsSrv namespace LibHac.FsSrv
@ -39,11 +40,7 @@ namespace LibHac.FsSrv
ExternalKeySet externalKeySet = config.ExternalKeySet ?? new ExternalKeySet(); ExternalKeySet externalKeySet = config.ExternalKeySet ?? new ExternalKeySet();
Timer = config.TimeSpanGenerator ?? new StopWatchTimeSpanGenerator(); Timer = config.TimeSpanGenerator ?? new StopWatchTimeSpanGenerator();
var fspConfig = new FileSystemProxyConfiguration FileSystemProxyConfiguration fspConfig = InitializeFileSystemProxyConfiguration(config);
{
FsCreatorInterfaces = config.FsCreators,
ProgramRegistryServiceImpl = new ProgramRegistryServiceImpl(this)
};
FsProxyCore = new FileSystemProxyCore(fspConfig, externalKeySet, config.DeviceOperator); FsProxyCore = new FileSystemProxyCore(fspConfig, externalKeySet, config.DeviceOperator);
@ -81,6 +78,29 @@ namespace LibHac.FsSrv
return new FileSystemClient(Hos); return new FileSystemClient(Hos);
} }
private FileSystemProxyConfiguration InitializeFileSystemProxyConfiguration(FileSystemServerConfig config)
{
var programRegistryService = new ProgramRegistryServiceImpl(this);
var programRegistry = new ProgramRegistryImpl(programRegistryService);
var baseFsServiceConfig = new BaseFileSystemServiceImpl.Configuration();
baseFsServiceConfig.BisFileSystemCreator = config.FsCreators.BuiltInStorageFileSystemCreator;
baseFsServiceConfig.GameCardFileSystemCreator = config.FsCreators.GameCardFileSystemCreator;
baseFsServiceConfig.SdCardFileSystemCreator = config.FsCreators.SdCardFileSystemCreator;
baseFsServiceConfig.BisWiperCreator = BisWiper.CreateWiper;
baseFsServiceConfig.ProgramRegistry = programRegistry;
var baseFsService = new BaseFileSystemServiceImpl(in baseFsServiceConfig);
var fspConfig = new FileSystemProxyConfiguration
{
FsCreatorInterfaces = config.FsCreators,
BaseFileSystemServiceImpl = baseFsService,
ProgramRegistryServiceImpl = programRegistryService
};
return fspConfig;
}
private FileSystemProxy GetFileSystemProxyServiceObject() private FileSystemProxy GetFileSystemProxyServiceObject()
{ {
return new FileSystemProxy(Hos, FsProxyCore); return new FileSystemProxy(Hos, FsProxyCore);

View file

@ -2,8 +2,10 @@
using LibHac.Common; using LibHac.Common;
using LibHac.Fs; using LibHac.Fs;
using LibHac.Fs.Fsa; using LibHac.Fs.Fsa;
using LibHac.FsSrv.Sf;
using LibHac.FsSystem; using LibHac.FsSystem;
using LibHac.Ncm; using LibHac.Ncm;
using LibHac.Sf;
using LibHac.Spl; using LibHac.Spl;
namespace LibHac.FsSrv namespace LibHac.FsSrv
@ -15,7 +17,7 @@ namespace LibHac.FsSrv
Result OpenFileSystemWithPatch(out IFileSystem fileSystem, ProgramId programId, FileSystemProxyType type); Result OpenFileSystemWithPatch(out IFileSystem fileSystem, ProgramId programId, FileSystemProxyType type);
Result OpenFileSystemWithId(out IFileSystem fileSystem, ref FsPath path, ulong id, FileSystemProxyType type); Result OpenFileSystemWithId(out IFileSystem fileSystem, ref FsPath path, ulong id, FileSystemProxyType type);
Result OpenDataFileSystemByProgramId(out IFileSystem fileSystem, ProgramId programId); Result OpenDataFileSystemByProgramId(out IFileSystem fileSystem, ProgramId programId);
Result OpenBisFileSystem(out IFileSystem fileSystem, ref FsPath rootPath, BisPartitionId partitionId); Result OpenBisFileSystem(out IFileSystem fileSystem, in FspPath rootPath, BisPartitionId partitionId);
Result OpenBisStorage(out IStorage storage, BisPartitionId partitionId); Result OpenBisStorage(out IStorage storage, BisPartitionId partitionId);
Result InvalidateBisCache(); Result InvalidateBisCache();
Result OpenHostFileSystemWithOption(out IFileSystem fileSystem, ref FsPath path, MountHostOption option); Result OpenHostFileSystemWithOption(out IFileSystem fileSystem, ref FsPath path, MountHostOption option);
@ -55,7 +57,7 @@ namespace LibHac.FsSrv
Result OpenSaveDataMetaFile(out IFile file, SaveDataSpaceId spaceId, ref SaveDataAttribute attribute, SaveDataMetaType type); Result OpenSaveDataMetaFile(out IFile file, SaveDataSpaceId spaceId, ref SaveDataAttribute attribute, SaveDataMetaType type);
Result ListAccessibleSaveDataOwnerId(out int readCount, Span<Ncm.ApplicationId> idBuffer, ProgramId programId, int startIndex, int bufferIdCount); Result ListAccessibleSaveDataOwnerId(out int readCount, Span<Ncm.ApplicationId> idBuffer, ProgramId programId, int startIndex, int bufferIdCount);
Result OpenImageDirectoryFileSystem(out IFileSystem fileSystem, ImageDirectoryId dirId); Result OpenImageDirectoryFileSystem(out IFileSystem fileSystem, ImageDirectoryId directoryId);
Result OpenContentStorageFileSystem(out IFileSystem fileSystem, ContentStorageId storageId); Result OpenContentStorageFileSystem(out IFileSystem fileSystem, ContentStorageId storageId);
Result OpenCloudBackupWorkStorageFileSystem(out IFileSystem fileSystem, CloudBackupWorkStorageId storageId); Result OpenCloudBackupWorkStorageFileSystem(out IFileSystem fileSystem, CloudBackupWorkStorageId storageId);
Result OpenCustomStorageFileSystem(out IFileSystem fileSystem, CustomStorageId storageId); Result OpenCustomStorageFileSystem(out IFileSystem fileSystem, CustomStorageId storageId);
@ -103,5 +105,6 @@ namespace LibHac.FsSrv
Result OverrideSaveDataTransferTokenSignVerificationKey(ReadOnlySpan<byte> key); Result OverrideSaveDataTransferTokenSignVerificationKey(ReadOnlySpan<byte> key);
Result CorruptSaveDataFileSystemByOffset(SaveDataSpaceId spaceId, ulong saveDataId, long offset); Result CorruptSaveDataFileSystemByOffset(SaveDataSpaceId spaceId, ulong saveDataId, long offset);
Result OpenMultiCommitManager(out IMultiCommitManager commitManager); Result OpenMultiCommitManager(out IMultiCommitManager commitManager);
Result OpenBisWiper(out IWiper bisWiper, NativeHandle transferMemoryHandle, ulong transferMemorySize);
} }
} }

View file

@ -0,0 +1,29 @@
using System;
using LibHac.FsSrv.Sf;
using LibHac.Sf;
namespace LibHac.FsSrv.Impl
{
internal class BisWiper : IWiper
{
// ReSharper disable UnusedParameter.Local
public BisWiper(NativeHandle memoryHandle, ulong memorySize) { }
// ReSharper restore UnusedParameter.Local
public Result Startup(out long spaceToWipe)
{
throw new NotImplementedException();
}
public Result Process(out long remainingSpaceToWipe)
{
throw new NotImplementedException();
}
public static Result CreateWiper(out IWiper wiper, NativeHandle memoryHandle, ulong memorySize)
{
wiper = new BisWiper(memoryHandle, memorySize);
return Result.Success;
}
}
}

View file

@ -38,6 +38,12 @@ namespace LibHac.FsSrv.Sf
return overflowed ? ResultFs.TooLongPath.Log() : Result.Success; return overflowed ? ResultFs.TooLongPath.Log() : Result.Success;
} }
public static void CreateEmpty(out FspPath fspPath)
{
Unsafe.SkipInit(out fspPath);
SpanHelpers.AsByteSpan(ref fspPath)[0] = 0;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static implicit operator U8Span(in FspPath value) => new U8Span(SpanHelpers.AsReadOnlyByteSpan(in value)); public static implicit operator U8Span(in FspPath value) => new U8Span(SpanHelpers.AsReadOnlyByteSpan(in value));