diff --git a/languages/apl/run.sh b/languages/apl/run.sh index 8ac5a27..f1abb7d 100644 --- a/languages/apl/run.sh +++ b/languages/apl/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.apl +cat > program.apl apl --OFF -s -f program.apl || true diff --git a/languages/bash/run.sh b/languages/bash/run.sh index 5dbb459..d9d92ce 100644 --- a/languages/bash/run.sh +++ b/languages/bash/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.sh +cat > program.sh bash program.sh || true diff --git a/languages/brainfuck/run.sh b/languages/brainfuck/run.sh index b9bdc7a..4afe07d 100644 --- a/languages/brainfuck/run.sh +++ b/languages/brainfuck/run.sh @@ -1 +1 @@ -printf %s "$1" | bf || true +cat | bf || true diff --git a/languages/c/run.sh b/languages/c/run.sh index f8f5345..b3595a4 100644 --- a/languages/c/run.sh +++ b/languages/c/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.c +cat > program.c gcc program.c -o program && ./program || true diff --git a/languages/clojure/run.sh b/languages/clojure/run.sh index dc5b764..a2c80ee 100644 --- a/languages/clojure/run.sh +++ b/languages/clojure/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.clj +cat > program.clj clojure program.clj || true diff --git a/languages/cpp/run.sh b/languages/cpp/run.sh index d9e2f85..189291b 100644 --- a/languages/cpp/run.sh +++ b/languages/cpp/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.cpp +cat > program.cpp g++ program.cpp -o program && ./program || true diff --git a/languages/csharp/run.sh b/languages/csharp/run.sh index a3b9e1d..42e29f5 100644 --- a/languages/csharp/run.sh +++ b/languages/csharp/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.cs +cat > program.cs csc program.cs >/dev/null && mono program.exe || true diff --git a/languages/elixir/run.sh b/languages/elixir/run.sh index ab64413..48054c7 100644 --- a/languages/elixir/run.sh +++ b/languages/elixir/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.exs +cat > program.exs elixir program.exs || true diff --git a/languages/erlang/run.sh b/languages/erlang/run.sh index 20c4beb..d7c154f 100644 --- a/languages/erlang/run.sh +++ b/languages/erlang/run.sh @@ -1,3 +1,3 @@ echo "%% -*- erlang -*-" > program.erl -printf %s "$1" >> program.erl +cat >> program.erl escript program.erl || true diff --git a/languages/fsharp/run.sh b/languages/fsharp/run.sh index 2a0d0a2..4e98607 100644 --- a/languages/fsharp/run.sh +++ b/languages/fsharp/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.fs +cat > program.fs fsharpc --optimize- program.fs >/dev/null && mono program.exe || true diff --git a/languages/go/run.sh b/languages/go/run.sh index 9f4c157..19073dd 100644 --- a/languages/go/run.sh +++ b/languages/go/run.sh @@ -1,3 +1,3 @@ export GOCACHE=/tmp/"$CODEDIR"/cache -printf %s "$1" > program.go +cat > program.go go run program.go || true diff --git a/languages/haskell/run.sh b/languages/haskell/run.sh index 3d7d1f2..1399e5a 100644 --- a/languages/haskell/run.sh +++ b/languages/haskell/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.hs +cat > program.hs ghc -e main program.hs || true diff --git a/languages/idris/run.sh b/languages/idris/run.sh index d9410d5..f0e3120 100644 --- a/languages/idris/run.sh +++ b/languages/idris/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > Main.idr +cat > Main.idr idris --execute ./Main.idr || true diff --git a/languages/java/run.sh b/languages/java/run.sh index db8e8ce..072f7b8 100644 --- a/languages/java/run.sh +++ b/languages/java/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > Main.java +cat > Main.java javac Main.java && java Main || true diff --git a/languages/javascript/run.sh b/languages/javascript/run.sh index 9cc1877..95d2773 100644 --- a/languages/javascript/run.sh +++ b/languages/javascript/run.sh @@ -1 +1 @@ -printf %s "$1" | node -p || true +cat | node -p || true diff --git a/languages/julia/run.sh b/languages/julia/run.sh index 2639c37..b3e40cc 100644 --- a/languages/julia/run.sh +++ b/languages/julia/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.jl +cat > program.jl julia program.jl || true diff --git a/languages/lua/run.sh b/languages/lua/run.sh index f229802..74e962e 100644 --- a/languages/lua/run.sh +++ b/languages/lua/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.lua +cat > program.lua lua5.3 program.lua || true diff --git a/languages/ocaml/run.sh b/languages/ocaml/run.sh index cdaaa9a..1ba7c10 100644 --- a/languages/ocaml/run.sh +++ b/languages/ocaml/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.ml +cat > program.ml ocamlopt -cclib --static -o program program.ml && ./program || true diff --git a/languages/pascal/run.sh b/languages/pascal/run.sh index 99afe11..179639c 100644 --- a/languages/pascal/run.sh +++ b/languages/pascal/run.sh @@ -1,4 +1,4 @@ -printf %s "$1" > program.pas +cat > program.pas # fpc does not use stderr, ld however does, capture both res="$(fpc program.pas 2>&1)" diff --git a/languages/perl/run.sh b/languages/perl/run.sh index 3ba6d9e..94934ab 100644 --- a/languages/perl/run.sh +++ b/languages/perl/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.pl +cat > program.pl perl program.pl || true diff --git a/languages/php/run.sh b/languages/php/run.sh index aeac323..6cc646e 100644 --- a/languages/php/run.sh +++ b/languages/php/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.php +cat > program.php php program.php || true diff --git a/languages/prolog/run.sh b/languages/prolog/run.sh index 81cbdee..2af923b 100644 --- a/languages/prolog/run.sh +++ b/languages/prolog/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.pl +cat > program.pl swipl --quiet program.pl || true diff --git a/languages/python/run.sh b/languages/python/run.sh index 480954f..d583685 100644 --- a/languages/python/run.sh +++ b/languages/python/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.py +cat > program.py python program.py || true diff --git a/languages/racket/run.sh b/languages/racket/run.sh index 0b89642..541b665 100644 --- a/languages/racket/run.sh +++ b/languages/racket/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.rkt +cat > program.rkt racket program.rkt || true diff --git a/languages/ruby/run.sh b/languages/ruby/run.sh index 688c3b0..945575a 100644 --- a/languages/ruby/run.sh +++ b/languages/ruby/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.rb +cat > program.rb ruby program.rb || true diff --git a/languages/rust/run.sh b/languages/rust/run.sh index b150608..6555a3e 100644 --- a/languages/rust/run.sh +++ b/languages/rust/run.sh @@ -1,2 +1,2 @@ -printf %s "$1" > program.rs +cat > program.rs rustc -C opt-level=0 --color never program.rs && ./program || true diff --git a/src/Myriad/Docker.hs b/src/Myriad/Docker.hs index 7d89ba1..85250ff 100644 --- a/src/Myriad/Docker.hs +++ b/src/Myriad/Docker.hs @@ -179,8 +179,9 @@ evalCode lang@LanguageConfig { name, timeout, retries } numRetries code = withCo exec_ ["docker exec ", cs cnt, " mkdir eval/", show snowflake] exec_ ["docker exec ", cs cnt, " chmod 777 eval/", show snowflake] -- User 1001 will be used for the actual execution so that they can't access `eval` itself - let args = ["exec", "-u1001:1001", "-w/tmp/eval/" <> show snowflake, cnt, "/bin/sh", "/var/run/run.sh", code] - output <- readProcessInterleaved_ $ proc "docker" args + let cmd = concat ["docker exec -i -u1001:1001 -w/tmp/eval/", show snowflake, " ", cnt, " /bin/sh /var/run/run.sh | head -c 4K"] + pr = setStdin (byteStringInput $ cs code) $ shell cmd + output <- readProcessInterleaved_ pr exec_ ["docker exec ", cnt, " rm -rf eval/", show snowflake] logInfo ["Ran code in container ", cs cnt, ", evaluation ", cs $ show snowflake] pure $ EvalOk output