Added comments, clean-up

This commit is contained in:
cake
2025-10-29 22:54:50 +01:00
parent c37e3badf1
commit 7c4d0fd5e9
4 changed files with 45 additions and 39 deletions

View File

@@ -409,11 +409,17 @@ public sealed class CacheMonitor : DisposableMediatorSubscriberBase
return; return;
} }
FileCacheSize = -1; FileCacheSize = -1;
DriveInfo di = new(new DirectoryInfo(_configService.Current.CacheFolder).Root.FullName);
var drive = DriveInfo.GetDrives().FirstOrDefault(d => _configService.Current.CacheFolder.StartsWith(d.Name, StringComparison.Ordinal));
if (drive == null)
{
return;
}
try try
{ {
FileCacheDriveFree = di.AvailableFreeSpace; FileCacheDriveFree = drive.AvailableFreeSpace;
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -1,10 +1,8 @@
using LightlessSync.LightlessConfiguration; using LightlessSync.LightlessConfiguration;
using LightlessSync.Services; using LightlessSync.Services;
using LightlessSync.Utils;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Diagnostics; using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading.Channels; using System.Threading.Channels;
using static LightlessSync.Utils.FileSystemHelper; using static LightlessSync.Utils.FileSystemHelper;
@@ -106,6 +104,7 @@ public sealed class FileCompactor : IDisposable
try try
{ {
long blocks = RunStatGetBlocks(fileInfo.FullName); long blocks = RunStatGetBlocks(fileInfo.FullName);
//st_blocks are always calculated in 512-byte units, hence we use 512L
return blocks * 512L; return blocks * 512L;
} }
catch (Exception ex) catch (Exception ex)
@@ -161,17 +160,17 @@ public sealed class FileCompactor : IDisposable
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
private struct Statvfs private struct Statvfs
{ {
public ulong f_bsize; public ulong f_bsize; /* Filesystem block size */
public ulong f_frsize; public ulong f_frsize; /* Fragment size */
public ulong f_blocks; public ulong f_blocks; /* Size of fs in f_frsize units */
public ulong f_bfree; public ulong f_bfree; /* Number of free blocks */
public ulong f_bavail; public ulong f_bavail; /* Number of free blocks for unprivileged users */
public ulong f_files; public ulong f_files; /* Number of inodes */
public ulong f_ffree; public ulong f_ffree; /* Number of free inodes */
public ulong f_favail; public ulong f_favail; /* Number of free inodes for unprivileged users */
public ulong f_fsid; public ulong f_fsid; /* Filesystem ID */
public ulong f_flag; public ulong f_flag; /* Mount flags */
public ulong f_namemax; public ulong f_namemax; /* Maximum filename length */
} }
private static int GetLinuxBlockSize(string path) private static int GetLinuxBlockSize(string path)
@@ -182,6 +181,7 @@ public sealed class FileCompactor : IDisposable
if (result != 0) if (result != 0)
return -1; return -1;
//return fragment size of linux
return (int)buf.f_frsize; return (int)buf.f_frsize;
} }
catch catch
@@ -346,9 +346,7 @@ public sealed class FileCompactor : IDisposable
var mountOptions = GetMountOptionsForPath(path); var mountOptions = GetMountOptionsForPath(path);
if (mountOptions.Contains("compress", StringComparison.OrdinalIgnoreCase)) if (mountOptions.Contains("compress", StringComparison.OrdinalIgnoreCase))
{ {
_logger.LogWarning( _logger.LogWarning("Cannot safely decompress {file}: filesystem mounted with compression ({opts}). Remount with 'compress=no' before running decompression.", path, mountOptions);
"Cannot safely decompress {file}: filesystem mounted with compression ({opts}). " +
"Remount with 'compress=no' before running decompression.", path, mountOptions);
return; return;
} }
@@ -369,6 +367,7 @@ public sealed class FileCompactor : IDisposable
return; return;
} }
//End stream of process to read the files
var stdout = proc.StandardOutput.ReadToEnd(); var stdout = proc.StandardOutput.ReadToEnd();
var stderr = proc.StandardError.ReadToEnd(); var stderr = proc.StandardError.ReadToEnd();
proc.WaitForExit(); proc.WaitForExit();

View File

@@ -1,16 +1,15 @@
using System; using System.Security.Cryptography;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text; using System.Text;
namespace LightlessSync.Utils; namespace LightlessSync.Utils;
public static class Crypto public static class Crypto
{ {
//This buffersize seems to be the best sweetpoint for Linux and Windows
private const int _bufferSize = 65536;
#pragma warning disable SYSLIB0021 // Type or member is obsolete #pragma warning disable SYSLIB0021 // Type or member is obsolete
private static readonly Dictionary<(string, ushort), string> _hashListPlayersSHA256 = new(); private static readonly Dictionary<(string, ushort), string> _hashListPlayersSHA256 = [];
private static readonly Dictionary<string, string> _hashListSHA256 = new(StringComparer.Ordinal); private static readonly Dictionary<string, string> _hashListSHA256 = new(StringComparer.Ordinal);
private static readonly SHA256CryptoServiceProvider _sha256CryptoProvider = new(); private static readonly SHA256CryptoServiceProvider _sha256CryptoProvider = new();
@@ -23,21 +22,21 @@ public static class Crypto
public static async Task<string> GetFileHashAsync(string filePath, CancellationToken cancellationToken = default) public static async Task<string> GetFileHashAsync(string filePath, CancellationToken cancellationToken = default)
{ {
var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete, bufferSize: 65536, options: FileOptions.Asynchronous); var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete, bufferSize: _bufferSize, options: FileOptions.Asynchronous);
await using (stream.ConfigureAwait(false)) await using (stream.ConfigureAwait(false))
{ {
using var sha1 = SHA1.Create(); using var sha1 = SHA1.Create();
var buffer = new byte[8192]; var buffer = new byte[8192];
int bytesRead; int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, cancellationToken).ConfigureAwait(false)) > 0) while ((bytesRead = await stream.ReadAsync(buffer, cancellationToken).ConfigureAwait(false)) > 0)
{ {
sha1.TransformBlock(buffer, 0, bytesRead, outputBuffer: null, 0); sha1.TransformBlock(buffer, 0, bytesRead, outputBuffer: null, 0);
} }
sha1.TransformFinalBlock([], 0, 0); sha1.TransformFinalBlock([], 0, 0);
return BitConverter.ToString(sha1.Hash!).Replace("-", "", StringComparison.Ordinal); return Convert.ToHexString(sha1.Hash!);
} }
} }

View File

@@ -8,17 +8,18 @@ namespace LightlessSync.Utils
public enum FilesystemType public enum FilesystemType
{ {
Unknown = 0, Unknown = 0,
NTFS, NTFS, // Compressable
Btrfs, Btrfs, // Compressable
Ext4, Ext4,
Xfs, Xfs,
Apfs, Apfs,
HfsPlus, HfsPlus,
Fat, Fat,
Exfat, Exfat,
Zfs Zfs // Compressable
} }
private const string _mountPath = "/proc/mounts";
private static readonly ConcurrentDictionary<string, FilesystemType> _filesystemTypeCache = new(StringComparer.OrdinalIgnoreCase); private static readonly ConcurrentDictionary<string, FilesystemType> _filesystemTypeCache = new(StringComparer.OrdinalIgnoreCase);
public static FilesystemType GetFilesystemType(string filePath, bool isWine = false) public static FilesystemType GetFilesystemType(string filePath, bool isWine = false)
@@ -75,8 +76,8 @@ namespace LightlessSync.Utils
try try
{ {
var path = Path.GetFullPath(filePath); var path = Path.GetFullPath(filePath);
if (!File.Exists("/proc/mounts")) return "/"; if (!File.Exists(_mountPath)) return "/";
var mounts = File.ReadAllLines("/proc/mounts"); var mounts = File.ReadAllLines(_mountPath);
string bestMount = "/"; string bestMount = "/";
foreach (var line in mounts) foreach (var line in mounts)
@@ -109,7 +110,7 @@ namespace LightlessSync.Utils
try try
{ {
var mountPoint = GetMountPoint(filePath); var mountPoint = GetMountPoint(filePath);
var mounts = File.ReadAllLines("/proc/mounts"); var mounts = File.ReadAllLines(_mountPath);
foreach (var line in mounts) foreach (var line in mounts)
{ {
@@ -140,6 +141,7 @@ namespace LightlessSync.Utils
} }
} }
//Extra check on
private static bool IsProbablyWine() => Environment.GetEnvironmentVariable("WINELOADERNOEXEC") != null || Environment.GetEnvironmentVariable("WINEDLLPATH") != null || Directory.Exists("/proc/self") && File.Exists("/proc/mounts"); private static bool IsProbablyWine() => Environment.GetEnvironmentVariable("WINELOADERNOEXEC") != null || Environment.GetEnvironmentVariable("WINEDLLPATH") != null || Directory.Exists("/proc/self") && File.Exists("/proc/mounts");
} }
} }