From 22bbf07c2bada743919f2ed5b8d626a4b911e2cd Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Sun, 29 Sep 2019 11:54:34 -0500 Subject: [PATCH] Add a function for handling possible access log output --- src/LibHac/Fs/FileSystemClient.AccessLog.cs | 23 ++++- src/LibHac/Fs/FileSystemClient.cs | 5 + src/LibHac/Fs/SaveData.cs | 101 ++++++-------------- src/LibHac/FsService/FileSystemProxy.cs | 6 +- src/LibHac/FsService/FileSystemProxyCore.cs | 14 +++ 5 files changed, 75 insertions(+), 74 deletions(-) diff --git a/src/LibHac/Fs/FileSystemClient.AccessLog.cs b/src/LibHac/Fs/FileSystemClient.AccessLog.cs index 926f4cff..f291ba80 100644 --- a/src/LibHac/Fs/FileSystemClient.AccessLog.cs +++ b/src/LibHac/Fs/FileSystemClient.AccessLog.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.CompilerServices; using LibHac.FsService; namespace LibHac.Fs @@ -32,7 +33,7 @@ namespace LibHac.Fs internal bool IsEnabledAccessLog(LocalAccessLogMode mode) { - if (!LocalAccessLogMode.HasFlag(mode)) + if ((LocalAccessLogMode & mode) == 0) { return false; } @@ -72,6 +73,26 @@ namespace LibHac.Fs { } + + public Result RunOperationWithAccessLog(LocalAccessLogMode logType, Func operation, Func textGenerator, [CallerMemberName] string caller = "") + { + Result rc; + + if (IsEnabledAccessLog(logType)) + { + TimeSpan startTime = Time.GetCurrent(); + rc = operation(); + TimeSpan endTime = Time.GetCurrent(); + + OutputAccessLog(rc, startTime, endTime, textGenerator(), caller); + } + else + { + rc = operation(); + } + + return rc; + } } [Flags] diff --git a/src/LibHac/Fs/FileSystemClient.cs b/src/LibHac/Fs/FileSystemClient.cs index 8ac67876..391e40ea 100644 --- a/src/LibHac/Fs/FileSystemClient.cs +++ b/src/LibHac/Fs/FileSystemClient.cs @@ -91,6 +91,11 @@ namespace LibHac.Fs { AccessLogEnabled = isEnabled; + if (isEnabled && FsSrv != null) + { + SetGlobalAccessLogMode(GlobalAccessLogMode.All); + } + if (accessLog != null) AccessLog = accessLog; } diff --git a/src/LibHac/Fs/SaveData.cs b/src/LibHac/Fs/SaveData.cs index 414ca00a..c9f0c4b4 100644 --- a/src/LibHac/Fs/SaveData.cs +++ b/src/LibHac/Fs/SaveData.cs @@ -1,5 +1,4 @@ -using System; -using LibHac.Common; +using LibHac.Common; using LibHac.FsService; namespace LibHac.Fs @@ -24,62 +23,33 @@ namespace LibHac.Fs return fs.Register(mountName, fileSystem); } - public static Result CreateSystemSaveData(this FileSystemClient fs, SaveDataSpaceId spaceId, ulong saveDataId, - UserId userId, ulong ownerId, long size, long journalSize, uint flags) + public static Result CreateSystemSaveData(this FileSystemClient fs, SaveDataSpaceId spaceId, + ulong saveDataId, UserId userId, ulong ownerId, long size, long journalSize, uint flags) { - if (fs.IsEnabledAccessLog(LocalAccessLogMode.Internal)) - { - TimeSpan startTime = fs.Time.GetCurrent(); - - IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject(); - - var attribute = new SaveDataAttribute + return fs.RunOperationWithAccessLog(LocalAccessLogMode.Internal, + () => { - UserId = userId, - SaveDataId = saveDataId - }; + IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject(); - var createInfo = new SaveDataCreateInfo - { - Size = size, - JournalSize = journalSize, - BlockSize = 0x4000, - OwnerId = ownerId, - Flags = flags, - SpaceId = spaceId - }; + var attribute = new SaveDataAttribute + { + UserId = userId, + SaveDataId = saveDataId + }; - Result rc = fsProxy.CreateSaveDataFileSystemBySystemSaveDataId(ref attribute, ref createInfo); + var createInfo = new SaveDataCreateInfo + { + Size = size, + JournalSize = journalSize, + BlockSize = 0x4000, + OwnerId = ownerId, + Flags = flags, + SpaceId = spaceId + }; - TimeSpan endTime = fs.Time.GetCurrent(); - - fs.OutputAccessLog(rc, startTime, endTime, - $", savedataspaceid: {spaceId}, savedataid: 0x{saveDataId:X}, userid: 0x{userId.Id.High:X16}{userId.Id.Low:X16}, save_data_owner_id: 0x{ownerId:X}, save_data_size: {size}, save_data_journal_size: {journalSize}, save_data_flags: 0x{flags:X8}"); - - return rc; - } - else - { - IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject(); - - var attribute = new SaveDataAttribute - { - UserId = userId, - SaveDataId = saveDataId - }; - - var createInfo = new SaveDataCreateInfo - { - Size = size, - JournalSize = journalSize, - BlockSize = 0x4000, - OwnerId = ownerId, - Flags = flags, - SpaceId = spaceId - }; - - return fsProxy.CreateSaveDataFileSystemBySystemSaveDataId(ref attribute, ref createInfo); - } + return fsProxy.CreateSaveDataFileSystemBySystemSaveDataId(ref attribute, ref createInfo); + }, + () => $", savedataspaceid: {spaceId}, savedataid: 0x{saveDataId:X}, userid: 0x{userId.Id.High:X16}{userId.Id.Low:X16}, save_data_owner_id: 0x{ownerId:X}, save_data_size: {size}, save_data_journal_size: {journalSize}, save_data_flags: 0x{flags:X8}"); } public static Result CreateSystemSaveData(this FileSystemClient fs, ulong saveDataId, UserId userId, @@ -114,24 +84,13 @@ namespace LibHac.Fs public static Result DeleteSaveData(this FileSystemClient fs, ulong saveDataId) { - if (fs.IsEnabledAccessLog(LocalAccessLogMode.Internal)) - { - TimeSpan startTime = fs.Time.GetCurrent(); - - IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject(); - Result result = fsProxy.DeleteSaveDataFileSystem(saveDataId); - - TimeSpan endTime = fs.Time.GetCurrent(); - - fs.OutputAccessLog(result, startTime, endTime, $", savedataid: 0x{saveDataId:X}"); - - return result; - } - else - { - IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject(); - return fsProxy.DeleteSaveDataFileSystem(saveDataId); - } + return fs.RunOperationWithAccessLog(LocalAccessLogMode.Internal, + () => + { + IFileSystemProxy fsProxy = fs.GetFileSystemProxyServiceObject(); + return fsProxy.DeleteSaveDataFileSystem(saveDataId); + }, + () => $", savedataid: 0x{saveDataId:X}"); } public static Result DisableAutoSaveDataCreation(this FileSystemClient fsClient) diff --git a/src/LibHac/FsService/FileSystemProxy.cs b/src/LibHac/FsService/FileSystemProxy.cs index 51fd4e0b..f4b8747f 100644 --- a/src/LibHac/FsService/FileSystemProxy.cs +++ b/src/LibHac/FsService/FileSystemProxy.cs @@ -522,12 +522,14 @@ namespace LibHac.FsService public Result SetGlobalAccessLogMode(GlobalAccessLogMode mode) { - throw new NotImplementedException(); + // Missing permission check + + return FsProxyCore.SetGlobalAccessLogMode(mode); } public Result GetGlobalAccessLogMode(out GlobalAccessLogMode mode) { - throw new NotImplementedException(); + return FsProxyCore.GetGlobalAccessLogMode(out mode); } public Result GetProgramIndexForAccessLog(out int programIndex, out int programCount) diff --git a/src/LibHac/FsService/FileSystemProxyCore.cs b/src/LibHac/FsService/FileSystemProxyCore.cs index 7f30413f..b3df317f 100644 --- a/src/LibHac/FsService/FileSystemProxyCore.cs +++ b/src/LibHac/FsService/FileSystemProxyCore.cs @@ -14,6 +14,8 @@ namespace LibHac.FsService private const string NintendoDirectoryName = "Nintendo"; private const string ContentDirectoryName = "Contents"; + private GlobalAccessLogMode LogMode { get; set; } + public FileSystemProxyCore(FileSystemCreators fsCreators) { FsCreators = fsCreators; @@ -243,6 +245,18 @@ namespace LibHac.FsService } } + public Result SetGlobalAccessLogMode(GlobalAccessLogMode mode) + { + LogMode = mode; + return Result.Success; + } + + public Result GetGlobalAccessLogMode(out GlobalAccessLogMode mode) + { + mode = LogMode; + return Result.Success; + } + private string GetSaveDataIdPath(ulong saveDataId) { return $"/{saveDataId:x16}";