mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Allow FS access log to be used without a backing FS server
Reduces the hactoolnet build size by ~260 KB due to fssrv code no longer being used
This commit is contained in:
parent
e500e475eb
commit
b3dc972881
6 changed files with 47 additions and 6 deletions
|
@ -22,6 +22,7 @@ namespace LibHac.Fs
|
||||||
public GlobalAccessLogMode GlobalAccessLogMode;
|
public GlobalAccessLogMode GlobalAccessLogMode;
|
||||||
public AccessLogTarget LocalAccessLogTarget;
|
public AccessLogTarget LocalAccessLogTarget;
|
||||||
|
|
||||||
|
public bool IsServerless;
|
||||||
public bool IsAccessLogInitialized;
|
public bool IsAccessLogInitialized;
|
||||||
public SdkMutexType MutexForAccessLogInitialization;
|
public SdkMutexType MutexForAccessLogInitialization;
|
||||||
|
|
||||||
|
@ -55,6 +56,13 @@ namespace LibHac.Fs
|
||||||
{
|
{
|
||||||
public static Result GetGlobalAccessLogMode(this FileSystemClient fs, out GlobalAccessLogMode mode)
|
public static Result GetGlobalAccessLogMode(this FileSystemClient fs, out GlobalAccessLogMode mode)
|
||||||
{
|
{
|
||||||
|
// Allow the access log to be used without an FS server by storing the mode locally in that situation.
|
||||||
|
if (fs.Globals.AccessLog.IsServerless)
|
||||||
|
{
|
||||||
|
mode = fs.Globals.AccessLog.GlobalAccessLogMode;
|
||||||
|
return Result.Success;
|
||||||
|
}
|
||||||
|
|
||||||
using ReferenceCountedDisposable<IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();
|
using ReferenceCountedDisposable<IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();
|
||||||
|
|
||||||
Result rc = fsProxy.Target.GetGlobalAccessLogMode(out mode);
|
Result rc = fsProxy.Target.GetGlobalAccessLogMode(out mode);
|
||||||
|
@ -64,6 +72,13 @@ namespace LibHac.Fs
|
||||||
|
|
||||||
public static Result SetGlobalAccessLogMode(this FileSystemClient fs, GlobalAccessLogMode mode)
|
public static Result SetGlobalAccessLogMode(this FileSystemClient fs, GlobalAccessLogMode mode)
|
||||||
{
|
{
|
||||||
|
// Allow the access log to be used without an FS server by storing the mode locally in that situation.
|
||||||
|
if (fs.Globals.AccessLog.IsServerless)
|
||||||
|
{
|
||||||
|
fs.Globals.AccessLog.GlobalAccessLogMode = mode;
|
||||||
|
return Result.Success;
|
||||||
|
}
|
||||||
|
|
||||||
using ReferenceCountedDisposable<IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();
|
using ReferenceCountedDisposable<IFileSystemProxy> fsProxy = fs.Impl.GetFileSystemProxyServiceObject();
|
||||||
|
|
||||||
Result rc = fsProxy.Target.SetGlobalAccessLogMode(mode);
|
Result rc = fsProxy.Target.SetGlobalAccessLogMode(mode);
|
||||||
|
@ -93,6 +108,17 @@ namespace LibHac.Fs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets whether the FS access log should call the FS service when getting or setting the
|
||||||
|
/// global access log mode. This allows the access log to be used when using an FS client without a server.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fs">The <see cref="FileSystemClient"/> to use.</param>
|
||||||
|
/// <param name="isServerless">Does this client lack an FS server?</param>
|
||||||
|
public static void SetServerlessAccessLog(this FileSystemClient fs, bool isServerless)
|
||||||
|
{
|
||||||
|
fs.Globals.AccessLog.IsServerless = isServerless;
|
||||||
|
}
|
||||||
|
|
||||||
private static void SetLocalAccessLogImpl(FileSystemClient fs, bool enabled)
|
private static void SetLocalAccessLogImpl(FileSystemClient fs, bool enabled)
|
||||||
{
|
{
|
||||||
if (enabled)
|
if (enabled)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
using LibHac.Fs;
|
using LibHac.Fs;
|
||||||
|
@ -181,7 +182,7 @@ namespace LibHac.FsSystem
|
||||||
|
|
||||||
storage.GetSize(out long storageSize).ThrowIfFailure();
|
storage.GetSize(out long storageSize).ThrowIfFailure();
|
||||||
|
|
||||||
var arr = new T[storageSize / Marshal.SizeOf<T>()];
|
var arr = new T[storageSize / Unsafe.SizeOf<T>()];
|
||||||
Span<byte> dest = MemoryMarshal.Cast<T, byte>(arr.AsSpan());
|
Span<byte> dest = MemoryMarshal.Cast<T, byte>(arr.AsSpan());
|
||||||
|
|
||||||
storage.Read(0, dest);
|
storage.Read(0, dest);
|
||||||
|
|
|
@ -181,7 +181,7 @@ namespace LibHac.Os.Impl
|
||||||
{
|
{
|
||||||
using ScopedLock<InternalCriticalSection> lk = ScopedLock.Lock(ref GetLockCount(ref rwLock).Cs);
|
using ScopedLock<InternalCriticalSection> lk = ScopedLock.Lock(ref GetLockCount(ref rwLock).Cs);
|
||||||
|
|
||||||
Assert.SdkEqual(GetWriteLockCount(in rwLock), 0u);
|
Assert.SdkRequiresGreater(GetWriteLockCount(in rwLock), 0u);
|
||||||
Assert.SdkNotEqual(GetWriteLocked(in GetLockCount(ref rwLock)), 0u);
|
Assert.SdkNotEqual(GetWriteLocked(in GetLockCount(ref rwLock)), 0u);
|
||||||
Assert.SdkEqual(rwLock.OwnerThread, Environment.CurrentManagedThreadId);
|
Assert.SdkEqual(rwLock.OwnerThread, Environment.CurrentManagedThreadId);
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,9 @@ namespace hactoolnet
|
||||||
fs.Register(mountName.ToU8Span(), OpenFileSystem(i));
|
fs.Register(mountName.ToU8Span(), OpenFileSystem(i));
|
||||||
fs.Register("output".ToU8Span(), new LocalFileSystem(ctx.Options.SectionOutDir[i]));
|
fs.Register("output".ToU8Span(), new LocalFileSystem(ctx.Options.SectionOutDir[i]));
|
||||||
|
|
||||||
|
fs.Impl.EnableFileSystemAccessorAccessLog(mountName.ToU8Span());
|
||||||
|
fs.Impl.EnableFileSystemAccessorAccessLog("output".ToU8Span());
|
||||||
|
|
||||||
FsUtils.CopyDirectoryWithProgress(fs, (mountName + ":/").ToU8Span(), "output:/".ToU8Span(), logger: ctx.Logger).ThrowIfFailure();
|
FsUtils.CopyDirectoryWithProgress(fs, (mountName + ":/").ToU8Span(), "output:/".ToU8Span(), logger: ctx.Logger).ThrowIfFailure();
|
||||||
|
|
||||||
fs.Unmount(mountName.ToU8Span());
|
fs.Unmount(mountName.ToU8Span());
|
||||||
|
@ -162,6 +165,9 @@ namespace hactoolnet
|
||||||
fs.Register("code".ToU8Span(), OpenFileSystemByType(NcaSectionType.Code));
|
fs.Register("code".ToU8Span(), OpenFileSystemByType(NcaSectionType.Code));
|
||||||
fs.Register("output".ToU8Span(), new LocalFileSystem(ctx.Options.ExefsOutDir));
|
fs.Register("output".ToU8Span(), new LocalFileSystem(ctx.Options.ExefsOutDir));
|
||||||
|
|
||||||
|
fs.Impl.EnableFileSystemAccessorAccessLog("code".ToU8Span());
|
||||||
|
fs.Impl.EnableFileSystemAccessorAccessLog("output".ToU8Span());
|
||||||
|
|
||||||
FsUtils.CopyDirectoryWithProgress(fs, "code:/".ToU8Span(), "output:/".ToU8Span(), logger: ctx.Logger).ThrowIfFailure();
|
FsUtils.CopyDirectoryWithProgress(fs, "code:/".ToU8Span(), "output:/".ToU8Span(), logger: ctx.Logger).ThrowIfFailure();
|
||||||
|
|
||||||
fs.Unmount("code".ToU8Span());
|
fs.Unmount("code".ToU8Span());
|
||||||
|
|
|
@ -8,6 +8,7 @@ using LibHac.Common;
|
||||||
using LibHac.Common.Keys;
|
using LibHac.Common.Keys;
|
||||||
using LibHac.Fs;
|
using LibHac.Fs;
|
||||||
using LibHac.Fs.Fsa;
|
using LibHac.Fs.Fsa;
|
||||||
|
using LibHac.Fs.Impl;
|
||||||
using LibHac.FsSystem;
|
using LibHac.FsSystem;
|
||||||
using LibHac.FsSystem.Save;
|
using LibHac.FsSystem.Save;
|
||||||
using static hactoolnet.Print;
|
using static hactoolnet.Print;
|
||||||
|
@ -34,6 +35,7 @@ namespace hactoolnet
|
||||||
FileSystemClient fs = ctx.Horizon.Fs;
|
FileSystemClient fs = ctx.Horizon.Fs;
|
||||||
|
|
||||||
fs.Register("save".ToU8Span(), save);
|
fs.Register("save".ToU8Span(), save);
|
||||||
|
fs.Impl.EnableFileSystemAccessorAccessLog("save".ToU8Span());
|
||||||
|
|
||||||
if (ctx.Options.Validate)
|
if (ctx.Options.Validate)
|
||||||
{
|
{
|
||||||
|
@ -43,6 +45,7 @@ namespace hactoolnet
|
||||||
if (ctx.Options.OutDir != null)
|
if (ctx.Options.OutDir != null)
|
||||||
{
|
{
|
||||||
fs.Register("output".ToU8Span(), new LocalFileSystem(ctx.Options.OutDir));
|
fs.Register("output".ToU8Span(), new LocalFileSystem(ctx.Options.OutDir));
|
||||||
|
fs.Impl.EnableFileSystemAccessorAccessLog("output".ToU8Span());
|
||||||
|
|
||||||
FsUtils.CopyDirectoryWithProgress(fs, "save:/".ToU8Span(), "output:/".ToU8Span(), logger: ctx.Logger).ThrowIfFailure();
|
FsUtils.CopyDirectoryWithProgress(fs, "save:/".ToU8Span(), "output:/".ToU8Span(), logger: ctx.Logger).ThrowIfFailure();
|
||||||
|
|
||||||
|
@ -89,6 +92,7 @@ namespace hactoolnet
|
||||||
if (ctx.Options.RepackSource != null)
|
if (ctx.Options.RepackSource != null)
|
||||||
{
|
{
|
||||||
fs.Register("input".ToU8Span(), new LocalFileSystem(ctx.Options.RepackSource));
|
fs.Register("input".ToU8Span(), new LocalFileSystem(ctx.Options.RepackSource));
|
||||||
|
fs.Impl.EnableFileSystemAccessorAccessLog("input".ToU8Span());
|
||||||
|
|
||||||
fs.CleanDirectoryRecursively("save:/".ToU8Span());
|
fs.CleanDirectoryRecursively("save:/".ToU8Span());
|
||||||
fs.Commit("save".ToU8Span());
|
fs.Commit("save".ToU8Span());
|
||||||
|
|
|
@ -70,10 +70,7 @@ namespace hactoolnet
|
||||||
{
|
{
|
||||||
ctx.Logger = logger;
|
ctx.Logger = logger;
|
||||||
OpenKeySet(ctx);
|
OpenKeySet(ctx);
|
||||||
|
InitializeHorizon(ctx);
|
||||||
Horizon horizon = HorizonFactory.CreateWithDefaultFsConfig(new HorizonConfiguration(),
|
|
||||||
new InMemoryFileSystem(), ctx.KeySet);
|
|
||||||
ctx.Horizon = horizon.CreatePrivilegedHorizonClient();
|
|
||||||
|
|
||||||
if (ctx.Options.AccessLog != null)
|
if (ctx.Options.AccessLog != null)
|
||||||
{
|
{
|
||||||
|
@ -247,6 +244,13 @@ namespace hactoolnet
|
||||||
ctx.KeySet = keySet;
|
ctx.KeySet = keySet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void InitializeHorizon(Context ctx)
|
||||||
|
{
|
||||||
|
var horizon = new Horizon(new HorizonConfiguration());
|
||||||
|
ctx.Horizon = horizon.CreatePrivilegedHorizonClient();
|
||||||
|
ctx.Horizon.Fs.SetServerlessAccessLog(true);
|
||||||
|
}
|
||||||
|
|
||||||
private static void ProcessKeygen(Context ctx)
|
private static void ProcessKeygen(Context ctx)
|
||||||
{
|
{
|
||||||
Console.WriteLine(ExternalKeyWriter.PrintAllKeys(ctx.KeySet));
|
Console.WriteLine(ExternalKeyWriter.PrintAllKeys(ctx.KeySet));
|
||||||
|
|
Loading…
Reference in a new issue