54 lines
1.3 KiB
C#
54 lines
1.3 KiB
C#
using System.Text.Json;
|
|
|
|
if (args.Length < 4
|
|
|| args[0] != "wait-for-break"
|
|
|| string.IsNullOrWhiteSpace(args[1])
|
|
|| string.IsNullOrWhiteSpace(args[2]))
|
|
{
|
|
return 64;
|
|
}
|
|
|
|
string readyPath = Path.GetFullPath(args[1]);
|
|
string breakPath = Path.GetFullPath(args[2]);
|
|
string label = args[3];
|
|
string[] payloadArguments = args.Skip(4).ToArray();
|
|
using var stopped = new ManualResetEventSlim(false);
|
|
ConsoleCancelEventHandler handler = (_, eventArgs) =>
|
|
{
|
|
if (eventArgs.SpecialKey != ConsoleSpecialKey.ControlBreak)
|
|
{
|
|
return;
|
|
}
|
|
|
|
eventArgs.Cancel = true;
|
|
try
|
|
{
|
|
File.WriteAllText(breakPath, label);
|
|
}
|
|
finally
|
|
{
|
|
stopped.Set();
|
|
}
|
|
};
|
|
Console.CancelKeyPress += handler;
|
|
try
|
|
{
|
|
string stdin = Console.In.ReadToEnd();
|
|
Directory.CreateDirectory(Path.GetDirectoryName(readyPath)!);
|
|
File.WriteAllText(
|
|
readyPath,
|
|
JsonSerializer.Serialize(new
|
|
{
|
|
processId = Environment.ProcessId,
|
|
label,
|
|
arguments = payloadArguments,
|
|
stdinLength = stdin.Length,
|
|
stdinLineCount = stdin.Count(character => character == '\n'),
|
|
}));
|
|
|
|
return stopped.Wait(TimeSpan.FromSeconds(30)) ? 0 : 75;
|
|
}
|
|
finally
|
|
{
|
|
Console.CancelKeyPress -= handler;
|
|
}
|