diff --git a/go.mod b/go.mod index bc70741..2105659 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/criyle/go-judge go 1.13 -require github.com/criyle/go-sandbox v0.0.0-20191014070058-6e46a732897f +require github.com/criyle/go-sandbox v0.0.0-20191016053250-f2a28034f310 diff --git a/go.sum b/go.sum index 82faeb2..3400d29 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/criyle/go-sandbox v0.0.0-20191014070058-6e46a732897f h1:5PNJaA2V/NVR98BegmbYW2g5pHdiX3b1iXdaV/fPA9M= -github.com/criyle/go-sandbox v0.0.0-20191014070058-6e46a732897f/go.mod h1:q6ywqlRA0V2VxWo9E+dQkzK2s5mHyq2GXHtF8oZq+mI= +github.com/criyle/go-sandbox v0.0.0-20191016053250-f2a28034f310 h1:mE+H7/ycELStwFvM4+1hPUhILrf5lC4WbdiyT8RlD5M= +github.com/criyle/go-sandbox v0.0.0-20191016053250-f2a28034f310/go.mod h1:q6ywqlRA0V2VxWo9E+dQkzK2s5mHyq2GXHtF8oZq+mI= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/language/interface.go b/language/interface.go index 20f7091..ea83c93 100644 --- a/language/interface.go +++ b/language/interface.go @@ -17,6 +17,7 @@ type Language interface { // ExecParam defines specs to compile / run program type ExecParam struct { Args []string + Env []string // Compile SourceFileName string // put code when compile diff --git a/runner/run.go b/runner/run.go index 31a3992..c97d55b 100644 --- a/runner/run.go +++ b/runner/run.go @@ -21,10 +21,6 @@ const cgroupPrefix = "go-judge" const minCPUPercent = 40 // 40% const checkIntervalMS = 50 -var env = []string{ - "PATH=/usr/local/bin:/usr/bin:/bin", -} - func (r *Runner) run(done <-chan struct{}, task *types.RunTask) *types.RunTaskResult { t := language.TypeExec if task.Type == "compile" { @@ -35,33 +31,33 @@ func (r *Runner) run(done <-chan struct{}, task *types.RunTask) *types.RunTaskRe // init input / output / error files inputFile, err := task.InputFile.Open() if err != nil { - return errResult("failed to initialize input file") + return errResult("initialize input file" + err.Error()) } defer inputFile.Close() outputPipe, err := pipe.NewBuffer(maxOutput) if err != nil { - return errResult("failed to initialize output pipe") + return errResult("initialize output pipe" + err.Error()) } defer outputPipe.W.Close() errorPipe, err := pipe.NewBuffer(maxOutput) if err != nil { - return errResult("failed to initialize output pipe") + return errResult("initialize output pipe: " + err.Error()) } defer errorPipe.W.Close() // init cgroup cg, err := cgroup.NewCGroup(cgroupPrefix) if err != nil { - return errResult("failed to initialize cgroup") + return errResult("initialize cgroup: " + err.Error()) } defer cg.Destroy() // get daemon runner m, err := r.pool.Get() if err != nil { - return errResult("failed to get daemon instance") + return errResult("get daemon instance: " + err.Error()) } defer r.pool.Put(m) @@ -77,7 +73,7 @@ func (r *Runner) run(done <-chan struct{}, task *types.RunTask) *types.RunTaskRe // set running parameters execParam := daemon.ExecveParam{ Args: param.Args, - Env: env, + Env: param.Env, Fds: []uintptr{inputFile.Fd(), outputPipe.W.Fd(), errorPipe.W.Fd()}, SyncFunc: cg.AddProc, }