Hopefully fixes all issues with linux based path finding
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user