|
|
@@ -36,6 +36,13 @@ namespace Avalonia.FreeDesktop
|
|
|
|
|
|
private string GetSymlinkTarget(string x) => Path.GetFullPath(Path.Combine(DevByLabelDir, NativeMethods.ReadLink(x)));
|
|
|
|
|
|
+ private string UnescapeString(string input, string regexText, int escapeBase) =>
|
|
|
+ new Regex(regexText).Replace(input, m => Convert.ToChar(Convert.ToByte(m.Groups[1].Value, escapeBase)).ToString());
|
|
|
+
|
|
|
+ private string UnescapePathFromProcMounts(string input) => UnescapeString(input, @"\\(\d{3})", 8);
|
|
|
+
|
|
|
+ private string UnescapeDeviceLabel(string input) => UnescapeString(input, @"\\x([0-9a-f]{2})", 16);
|
|
|
+
|
|
|
private void Poll(long _)
|
|
|
{
|
|
|
var fProcPartitions = File.ReadAllLines(ProcPartitionsDir)
|
|
|
@@ -47,14 +54,14 @@ namespace Avalonia.FreeDesktop
|
|
|
|
|
|
var fProcMounts = File.ReadAllLines(ProcMountsDir)
|
|
|
.Select(x => x.Split(' '))
|
|
|
- .Select(x => (x[0], x[1]))
|
|
|
+ .Select(x => (x[0], UnescapePathFromProcMounts(x[1])))
|
|
|
.Where(x => !x.Item2.StartsWith("/snap/", StringComparison.InvariantCultureIgnoreCase));
|
|
|
|
|
|
var labelDirEnum = Directory.Exists(DevByLabelDir) ?
|
|
|
new DirectoryInfo(DevByLabelDir).GetFiles() : Enumerable.Empty<FileInfo>();
|
|
|
|
|
|
var labelDevPathPairs = labelDirEnum
|
|
|
- .Select(x => (GetSymlinkTarget(x.FullName), x.Name));
|
|
|
+ .Select(x => (GetSymlinkTarget(x.FullName), UnescapeDeviceLabel(x.Name)));
|
|
|
|
|
|
var q1 = from mount in fProcMounts
|
|
|
join device in fProcPartitions on mount.Item1 equals device.Item2
|
|
|
@@ -64,7 +71,7 @@ namespace Avalonia.FreeDesktop
|
|
|
{
|
|
|
VolumePath = mount.Item2,
|
|
|
VolumeSizeBytes = device.Item1,
|
|
|
- VolumeLabel = x.Name
|
|
|
+ VolumeLabel = x.Item2
|
|
|
};
|
|
|
|
|
|
var mountVolInfos = q1.ToArray();
|