go-judge/cmd/executorserver/cinterface.go
2020-04-24 22:34:50 -04:00

73 lines
1.4 KiB
Go

package main
import "C"
import (
"bytes"
"encoding/json"
"os"
)
type initParameter struct {
CInitPath string `json:"cinitPath`
Parallism int `json:"parallism"`
TmpFsParam string `json:"tmpfsParam"`
Dir string `json:"dir"`
NetShare bool `json:"netShare"`
MountConf string `json:"mountConf"`
}
// Init initialize the sandbox environment
//export Init
func Init(i *C.char) C.int {
is := C.GoString(i)
var ip initParameter
if err := json.NewDecoder(bytes.NewBufferString(is)).Decode(&ip); err != nil {
return -1
}
if ip.Parallism == 0 {
ip.Parallism = 4
}
parallism = &ip.Parallism
if ip.TmpFsParam == "" {
ip.TmpFsParam = "size=16m,nr_inodes=4k"
}
tmpFsParam = &ip.TmpFsParam
if ip.MountConf == "" {
ip.MountConf = "mount.yaml"
}
if ip.Dir == "" {
fs = newFileMemoryStore()
} else {
os.MkdirAll(ip.Dir, 0755)
fs = newFileLocalStore(ip.Dir)
}
initEnvPool()
startWorkers()
return 0
}
// Exec runs command inside container runner
//export Exec
func Exec(e *C.char) *C.char {
es := C.GoString(e)
var req request
if err := json.NewDecoder(bytes.NewBufferString(es)).Decode(&req); err != nil {
return nil
}
ret := <-submitRequest(&req)
if ret.Error != nil {
ret.ErrorMsg = ret.Error.Error()
}
var buf bytes.Buffer
if err := json.NewEncoder(&buf).Encode(ret); err != nil {
return nil
}
return C.CString(buf.String())
}