Hopefully fixes all issues with linux based path finding

This commit is contained in:
cake
2025-11-10 03:52:37 +01:00
parent e9082ab8d0
commit d7182e9d57
3 changed files with 347 additions and 204 deletions

View File

@@ -136,13 +136,18 @@ namespace LightlessSync.Services.Compression
psi = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = "-c " + QuoteDouble(inner),
Arguments = "-lc " + QuoteDouble(inner),
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = "/"
};
if (!psi.Environment.TryGetValue("PATH", out var p) || string.IsNullOrWhiteSpace(p))
psi.Environment["PATH"] = "/usr/sbin:/usr/bin:/bin";
else
psi.Environment["PATH"] = "/usr/sbin:/usr/bin:/bin:" + p;
}
else
{
@@ -154,29 +159,38 @@ namespace LightlessSync.Services.Compression
UseShellExecute = false,
CreateNoWindow = true
};
if (!psi.Environment.TryGetValue("PATH", out var p) || string.IsNullOrWhiteSpace(p))
psi.Environment["PATH"] = "/usr/sbin:/usr/bin:/bin";
else
psi.Environment["PATH"] = "/usr/sbin:/usr/bin:/bin:" + p;
psi.ArgumentList.Add("-v");
psi.ArgumentList.Add("--");
foreach (var p in list) psi.ArgumentList.Add(p);
foreach (var path in list)
psi.ArgumentList.Add(path);
}
using var proc = Process.Start(psi) ?? throw new InvalidOperationException("Failed to start filefrag");
var stdoutTask = proc.StandardOutput.ReadToEndAsync(_cts.Token);
var stderrTask = proc.StandardError.ReadToEndAsync(_cts.Token);
await Task.WhenAll(stdoutTask, stderrTask).ConfigureAwait(false);
try
{
await proc.WaitForExitAsync(_cts.Token).ConfigureAwait(false);
}
catch (Exception ex)
var outTask = proc.StandardOutput.ReadToEndAsync(_cts.Token);
var errTask = proc.StandardError.ReadToEndAsync(_cts.Token);
var timeout = TimeSpan.FromSeconds(15);
var combined = Task.WhenAll(outTask, errTask);
var finished = await Task.WhenAny(combined, Task.Delay(timeout, _cts.Token)).ConfigureAwait(false);
if (finished != combined)
{
_log.LogWarning(ex, "Error in the batch frag service. proc = {proc}", proc);
try { proc.Kill(entireProcessTree: true); } catch { /* ignore */ }
try { await combined.ConfigureAwait(false); } catch { /* ignore */ }
}
var stdout = await stdoutTask.ConfigureAwait(false);
var stderr = await stderrTask.ConfigureAwait(false);
var stdout = outTask.IsCompletedSuccessfully ? await outTask.ConfigureAwait(false) : "";
var stderr = errTask.IsCompletedSuccessfully ? await errTask.ConfigureAwait(false) : "";
if (proc.ExitCode != 0 && !string.IsNullOrWhiteSpace(stderr))
_log.LogTrace("filefrag exited {code}: {err}", proc.ExitCode, stderr.Trim());
if (!string.IsNullOrWhiteSpace(stderr))
_log.LogTrace("filefrag stderr (batch): {err}", stderr.Trim());
ParseFilefrag(stdout, result);
return result;