go-judge/env/linuxcontainer/envbuilder_linux.go
criyle ffdf3e3925
Some checks are pending
Build / Goreleaser (push) Waiting to run
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, darwin) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, linux) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, windows) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, darwin) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, linux) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, windows) (push) Blocked by required conditions
linuxc: try support faster new clone3(CLONE_INTO_CGROUP) syscall
criyle/go-sandbox#13
2025-02-20 22:42:24 +00:00

70 lines
1.5 KiB
Go

package linuxcontainer
import (
"fmt"
"syscall"
"github.com/criyle/go-judge/env/pool"
"github.com/criyle/go-sandbox/container"
)
// Config specifies configuration to build environment builder
type Config struct {
Builder EnvironmentBuilder
CgroupPool CgroupPool
WorkDir string
Seccomp []syscall.SockFilter
Cpuset string
CPURate bool
CgroupFd bool // whether to enable cgroup fd with clone3, kernel >= 5.7
}
type environmentBuilder struct {
builder EnvironmentBuilder
cgPool CgroupPool
workDir string
seccomp []syscall.SockFilter
cpuset string
cpuRate bool
cgFd bool
}
// NewEnvBuilder creates builder for linux container pools
func NewEnvBuilder(c Config) pool.EnvBuilder {
return &environmentBuilder{
builder: c.Builder,
cgPool: c.CgroupPool,
workDir: c.WorkDir,
seccomp: c.Seccomp,
cpuset: c.Cpuset,
cpuRate: c.CPURate,
cgFd: c.CgroupFd,
}
}
// Build creates linux container
func (b *environmentBuilder) Build() (pool.Environment, error) {
m, err := b.builder.Build()
if err != nil {
return nil, err
}
wd, err := m.Open([]container.OpenCmd{{
Path: b.workDir,
Flag: syscall.O_CLOEXEC | syscall.O_DIRECTORY,
Perm: 0777,
}})
if err != nil {
return nil, fmt.Errorf("container: failed to prepare work directory")
}
return &environ{
Environment: m,
cgPool: b.cgPool,
wd: wd[0],
workDir: b.workDir,
cpuset: b.cpuset,
cpuRate: b.cpuRate,
seccomp: b.seccomp,
cgFd: b.cgFd,
}, nil
}