1pub mod jail;
2pub mod js_args;
3pub mod limits;
4pub mod runtime;
5pub mod steps;
6
7#[cfg(test)]
8mod jail_tests;
9#[cfg(test)]
10mod js_args_tests;
11#[cfg(test)]
12mod limits_tests;
13#[cfg(test)]
14mod runtime_tests;
15#[cfg(test)]
16mod steps_tests;
17
18use std::io::{BufReader, BufWriter};
19
20use crate::protocol::{
21 CodeModeRunnerInput, CodeModeRunnerOutput, CodeModeRunnerResult, CodeModeRunnerState,
22 RUNNER_STATE,
23};
24
25pub fn run_code_mode_runner_stdio_blocking() -> Result<(), String> {
26 #[cfg(all(unix, target_os = "linux"))]
27 {
28 let _ = nix::sys::prctl::set_dumpable(false);
29 }
30 RUNNER_STATE.with(|state| {
31 *state.borrow_mut() = Some(CodeModeRunnerState {
32 reader: BufReader::new(std::io::stdin()),
33 writer: BufWriter::new(std::io::stdout()),
34 next_seq: 0,
35 });
36 });
37 loop {
38 match runtime::run_next() {
39 Ok(runtime::RunnerLoopOutcome::Completed) => {
40 runtime::cleanup_execution_jail(false);
41 runtime::reset_sequence();
42 }
43 Ok(runtime::RunnerLoopOutcome::InputClosed) => {
44 runtime::cleanup_execution_jail(true);
45 return Ok(());
46 }
47 Err(error) => {
48 runtime::emit_error(error);
49 runtime::cleanup_execution_jail(false);
50 runtime::reset_sequence();
51 }
52 }
53 }
54}
55
56pub fn run_code_mode_runner_once(
57 input: CodeModeRunnerInput,
58) -> Result<CodeModeRunnerOutput, String> {
59 runtime::run_start_without_io(input)
60}
61
62pub fn result_from_value(value: Option<serde_json::Value>) -> CodeModeRunnerResult {
63 CodeModeRunnerResult::from_response_result(value)
64}