From 0b29ce168e80c65d0c9990c9b16d5ab8cc03aff6 Mon Sep 17 00:00:00 2001 From: Roman Pytkov Date: Wed, 5 Nov 2025 22:39:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D1=88=D1=82=D1=83=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/CppCompilationServiceIsolate.cs | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src/LiquidCode.Tester.Worker/Services/CppCompilationServiceIsolate.cs b/src/LiquidCode.Tester.Worker/Services/CppCompilationServiceIsolate.cs index c7c99f1..4069560 100644 --- a/src/LiquidCode.Tester.Worker/Services/CppCompilationServiceIsolate.cs +++ b/src/LiquidCode.Tester.Worker/Services/CppCompilationServiceIsolate.cs @@ -5,6 +5,7 @@ using System.Linq; using LiquidCode.Tester.Worker.Services.Isolate; using LiquidCode.Tester.Worker.Models; +/// namespace LiquidCode.Tester.Worker.Services; /// @@ -113,12 +114,7 @@ public class CppCompilationServiceIsolate : ICompilationService // Build compiler arguments var arguments = new List(compilerFlags); - var directoryBindings = new List - { - new DirectoryBinding { HostPath = "/usr/include", SandboxPath = "/usr/include", ReadOnly = true }, - new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true }, - new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true } - }; + var includeCounter = 0; // Add include directories if (includeDirectories != null) @@ -135,13 +131,10 @@ public class CppCompilationServiceIsolate : ICompilationService if (Directory.Exists(resolvedIncludeDir)) { - arguments.Add($"-I{resolvedIncludeDir}"); - directoryBindings.Add(new DirectoryBinding - { - HostPath = resolvedIncludeDir, - SandboxPath = resolvedIncludeDir, - ReadOnly = true - }); + includeCounter++; + var targetIncludeDir = Path.Combine(boxDir, $"include_{includeCounter}"); + CopyDirectory(resolvedIncludeDir, targetIncludeDir); + arguments.Add($"-I/box/include_{includeCounter}"); } else { @@ -182,7 +175,12 @@ public class CppCompilationServiceIsolate : ICompilationService EnableNetwork = false, StderrFile = stderrFilePath, WorkingDirectory = "/box", - DirectoryBindings = directoryBindings + DirectoryBindings = new List + { + new DirectoryBinding { HostPath = "/usr/include", SandboxPath = "/usr/include", ReadOnly = true }, + new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true }, + new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true } + } }); // Read compiler output @@ -275,6 +273,29 @@ public class CppCompilationServiceIsolate : ICompilationService } } + private static void CopyDirectory(string sourceDirectory, string destinationDirectory) + { + var sourceRoot = Path.GetFullPath(sourceDirectory); + var destinationRoot = Path.GetFullPath(destinationDirectory); + + Directory.CreateDirectory(destinationRoot); + + foreach (var directory in Directory.EnumerateDirectories(sourceRoot, "*", SearchOption.AllDirectories)) + { + var relativePath = Path.GetRelativePath(sourceRoot, directory); + var targetDir = Path.Combine(destinationRoot, relativePath); + Directory.CreateDirectory(targetDir); + } + + foreach (var file in Directory.EnumerateFiles(sourceRoot, "*", SearchOption.AllDirectories)) + { + var relativePath = Path.GetRelativePath(sourceRoot, file); + var targetFile = Path.Combine(destinationRoot, relativePath); + Directory.CreateDirectory(Path.GetDirectoryName(targetFile)!); + File.Copy(file, targetFile, overwrite: true); + } + } + private (string compiler, List compilerFlags) ResolveVersion(string? version) { var defaultCompiler = _configuration["Cpp:Compiler"] ?? "g++";