All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 35s
				
			Test / Sandbox (push) Successful in 2m22s
				
			Test / Hpkg (push) Successful in 4m2s
				
			Test / Sandbox (race detector) (push) Successful in 4m28s
				
			Test / Hakurei (race detector) (push) Successful in 5m21s
				
			Test / Hakurei (push) Successful in 2m9s
				
			Test / Flake checks (push) Successful in 1m29s
				
			This package is quite useful. This change allows it to be imported without importing container. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			228 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package container
 | 
						|
 | 
						|
import (
 | 
						|
	"io"
 | 
						|
	"io/fs"
 | 
						|
	"os"
 | 
						|
	"os/exec"
 | 
						|
	"os/signal"
 | 
						|
	"path/filepath"
 | 
						|
	"runtime"
 | 
						|
	"syscall"
 | 
						|
 | 
						|
	"hakurei.app/container/seccomp"
 | 
						|
	"hakurei.app/message"
 | 
						|
)
 | 
						|
 | 
						|
type osFile interface {
 | 
						|
	Name() string
 | 
						|
	io.Writer
 | 
						|
	fs.File
 | 
						|
}
 | 
						|
 | 
						|
// syscallDispatcher provides methods that make state-dependent system calls as part of their behaviour.
 | 
						|
type syscallDispatcher interface {
 | 
						|
	// new starts a goroutine with a new instance of syscallDispatcher.
 | 
						|
	// A syscallDispatcher must never be used in any goroutine other than the one owning it,
 | 
						|
	// just synchronising access is not enough, as this is for test instrumentation.
 | 
						|
	new(f func(k syscallDispatcher))
 | 
						|
 | 
						|
	// lockOSThread provides [runtime.LockOSThread].
 | 
						|
	lockOSThread()
 | 
						|
 | 
						|
	// setPtracer provides [SetPtracer].
 | 
						|
	setPtracer(pid uintptr) error
 | 
						|
	// setDumpable provides [SetDumpable].
 | 
						|
	setDumpable(dumpable uintptr) error
 | 
						|
	// setNoNewPrivs provides [SetNoNewPrivs].
 | 
						|
	setNoNewPrivs() error
 | 
						|
 | 
						|
	// lastcap provides [LastCap].
 | 
						|
	lastcap(msg message.Msg) uintptr
 | 
						|
	// capset provides capset.
 | 
						|
	capset(hdrp *capHeader, datap *[2]capData) error
 | 
						|
	// capBoundingSetDrop provides capBoundingSetDrop.
 | 
						|
	capBoundingSetDrop(cap uintptr) error
 | 
						|
	// capAmbientClearAll provides capAmbientClearAll.
 | 
						|
	capAmbientClearAll() error
 | 
						|
	// capAmbientRaise provides capAmbientRaise.
 | 
						|
	capAmbientRaise(cap uintptr) error
 | 
						|
	// isatty provides [Isatty].
 | 
						|
	isatty(fd int) bool
 | 
						|
	// receive provides [Receive].
 | 
						|
	receive(key string, e any, fdp *uintptr) (closeFunc func() error, err error)
 | 
						|
 | 
						|
	// bindMount provides procPaths.bindMount.
 | 
						|
	bindMount(msg message.Msg, source, target string, flags uintptr) error
 | 
						|
	// remount provides procPaths.remount.
 | 
						|
	remount(msg message.Msg, target string, flags uintptr) error
 | 
						|
	// mountTmpfs provides mountTmpfs.
 | 
						|
	mountTmpfs(fsname, target string, flags uintptr, size int, perm os.FileMode) error
 | 
						|
	// ensureFile provides ensureFile.
 | 
						|
	ensureFile(name string, perm, pperm os.FileMode) error
 | 
						|
 | 
						|
	// seccompLoad provides [seccomp.Load].
 | 
						|
	seccompLoad(rules []seccomp.NativeRule, flags seccomp.ExportFlag) error
 | 
						|
	// notify provides [signal.Notify].
 | 
						|
	notify(c chan<- os.Signal, sig ...os.Signal)
 | 
						|
	// start starts [os/exec.Cmd].
 | 
						|
	start(c *exec.Cmd) error
 | 
						|
	// signal signals the underlying process of [os/exec.Cmd].
 | 
						|
	signal(c *exec.Cmd, sig os.Signal) error
 | 
						|
	// evalSymlinks provides [filepath.EvalSymlinks].
 | 
						|
	evalSymlinks(path string) (string, error)
 | 
						|
 | 
						|
	// exit provides [os.Exit].
 | 
						|
	exit(code int)
 | 
						|
	// getpid provides [os.Getpid].
 | 
						|
	getpid() int
 | 
						|
	// stat provides [os.Stat].
 | 
						|
	stat(name string) (os.FileInfo, error)
 | 
						|
	// mkdir provides [os.Mkdir].
 | 
						|
	mkdir(name string, perm os.FileMode) error
 | 
						|
	// mkdirTemp provides [os.MkdirTemp].
 | 
						|
	mkdirTemp(dir, pattern string) (string, error)
 | 
						|
	// mkdirAll provides [os.MkdirAll].
 | 
						|
	mkdirAll(path string, perm os.FileMode) error
 | 
						|
	// readdir provides [os.ReadDir].
 | 
						|
	readdir(name string) ([]os.DirEntry, error)
 | 
						|
	// openNew provides [os.Open].
 | 
						|
	openNew(name string) (osFile, error)
 | 
						|
	// writeFile provides [os.WriteFile].
 | 
						|
	writeFile(name string, data []byte, perm os.FileMode) error
 | 
						|
	// createTemp provides [os.CreateTemp].
 | 
						|
	createTemp(dir, pattern string) (osFile, error)
 | 
						|
	// remove provides os.Remove.
 | 
						|
	remove(name string) error
 | 
						|
	// newFile provides os.NewFile.
 | 
						|
	newFile(fd uintptr, name string) *os.File
 | 
						|
	// symlink provides os.Symlink.
 | 
						|
	symlink(oldname, newname string) error
 | 
						|
	// readlink provides [os.Readlink].
 | 
						|
	readlink(name string) (string, error)
 | 
						|
 | 
						|
	// umask provides syscall.Umask.
 | 
						|
	umask(mask int) (oldmask int)
 | 
						|
	// sethostname provides syscall.Sethostname
 | 
						|
	sethostname(p []byte) (err error)
 | 
						|
	// chdir provides syscall.Chdir
 | 
						|
	chdir(path string) (err error)
 | 
						|
	// fchdir provides syscall.Fchdir
 | 
						|
	fchdir(fd int) (err error)
 | 
						|
	// open provides syscall.Open
 | 
						|
	open(path string, mode int, perm uint32) (fd int, err error)
 | 
						|
	// close provides syscall.Close
 | 
						|
	close(fd int) (err error)
 | 
						|
	// pivotRoot provides syscall.PivotRoot
 | 
						|
	pivotRoot(newroot, putold string) (err error)
 | 
						|
	// mount provides syscall.Mount
 | 
						|
	mount(source, target, fstype string, flags uintptr, data string) (err error)
 | 
						|
	// unmount provides syscall.Unmount
 | 
						|
	unmount(target string, flags int) (err error)
 | 
						|
	// wait4 provides syscall.Wait4
 | 
						|
	wait4(pid int, wstatus *syscall.WaitStatus, options int, rusage *syscall.Rusage) (wpid int, err error)
 | 
						|
 | 
						|
	// printf provides the Printf method of [log.Logger].
 | 
						|
	printf(msg message.Msg, format string, v ...any)
 | 
						|
	// fatal provides the Fatal method of [log.Logger]
 | 
						|
	fatal(msg message.Msg, v ...any)
 | 
						|
	// fatalf provides the Fatalf method of [log.Logger]
 | 
						|
	fatalf(msg message.Msg, format string, v ...any)
 | 
						|
}
 | 
						|
 | 
						|
// direct implements syscallDispatcher on the current kernel.
 | 
						|
type direct struct{}
 | 
						|
 | 
						|
func (k direct) new(f func(k syscallDispatcher)) { go f(k) }
 | 
						|
 | 
						|
func (direct) lockOSThread() { runtime.LockOSThread() }
 | 
						|
 | 
						|
func (direct) setPtracer(pid uintptr) error       { return SetPtracer(pid) }
 | 
						|
func (direct) setDumpable(dumpable uintptr) error { return SetDumpable(dumpable) }
 | 
						|
func (direct) setNoNewPrivs() error               { return SetNoNewPrivs() }
 | 
						|
 | 
						|
func (direct) lastcap(msg message.Msg) uintptr                 { return LastCap(msg) }
 | 
						|
func (direct) capset(hdrp *capHeader, datap *[2]capData) error { return capset(hdrp, datap) }
 | 
						|
func (direct) capBoundingSetDrop(cap uintptr) error            { return capBoundingSetDrop(cap) }
 | 
						|
func (direct) capAmbientClearAll() error                       { return capAmbientClearAll() }
 | 
						|
func (direct) capAmbientRaise(cap uintptr) error               { return capAmbientRaise(cap) }
 | 
						|
func (direct) isatty(fd int) bool                              { return Isatty(fd) }
 | 
						|
func (direct) receive(key string, e any, fdp *uintptr) (func() error, error) {
 | 
						|
	return Receive(key, e, fdp)
 | 
						|
}
 | 
						|
 | 
						|
func (direct) bindMount(msg message.Msg, source, target string, flags uintptr) error {
 | 
						|
	return hostProc.bindMount(msg, source, target, flags)
 | 
						|
}
 | 
						|
func (direct) remount(msg message.Msg, target string, flags uintptr) error {
 | 
						|
	return hostProc.remount(msg, target, flags)
 | 
						|
}
 | 
						|
func (k direct) mountTmpfs(fsname, target string, flags uintptr, size int, perm os.FileMode) error {
 | 
						|
	return mountTmpfs(k, fsname, target, flags, size, perm)
 | 
						|
}
 | 
						|
func (direct) ensureFile(name string, perm, pperm os.FileMode) error {
 | 
						|
	return ensureFile(name, perm, pperm)
 | 
						|
}
 | 
						|
 | 
						|
func (direct) seccompLoad(rules []seccomp.NativeRule, flags seccomp.ExportFlag) error {
 | 
						|
	return seccomp.Load(rules, flags)
 | 
						|
}
 | 
						|
func (direct) notify(c chan<- os.Signal, sig ...os.Signal) { signal.Notify(c, sig...) }
 | 
						|
func (direct) start(c *exec.Cmd) error                     { return c.Start() }
 | 
						|
func (direct) signal(c *exec.Cmd, sig os.Signal) error     { return c.Process.Signal(sig) }
 | 
						|
func (direct) evalSymlinks(path string) (string, error)    { return filepath.EvalSymlinks(path) }
 | 
						|
 | 
						|
func (direct) exit(code int)                                 { os.Exit(code) }
 | 
						|
func (direct) getpid() int                                   { return os.Getpid() }
 | 
						|
func (direct) stat(name string) (os.FileInfo, error)         { return os.Stat(name) }
 | 
						|
func (direct) mkdir(name string, perm os.FileMode) error     { return os.Mkdir(name, perm) }
 | 
						|
func (direct) mkdirTemp(dir, pattern string) (string, error) { return os.MkdirTemp(dir, pattern) }
 | 
						|
func (direct) mkdirAll(path string, perm os.FileMode) error  { return os.MkdirAll(path, perm) }
 | 
						|
func (direct) readdir(name string) ([]os.DirEntry, error)    { return os.ReadDir(name) }
 | 
						|
func (direct) openNew(name string) (osFile, error)           { return os.Open(name) }
 | 
						|
func (direct) writeFile(name string, data []byte, perm os.FileMode) error {
 | 
						|
	return os.WriteFile(name, data, perm)
 | 
						|
}
 | 
						|
func (direct) createTemp(dir, pattern string) (osFile, error) {
 | 
						|
	return os.CreateTemp(dir, pattern)
 | 
						|
}
 | 
						|
func (direct) remove(name string) error {
 | 
						|
	return os.Remove(name)
 | 
						|
}
 | 
						|
func (direct) newFile(fd uintptr, name string) *os.File {
 | 
						|
	return os.NewFile(fd, name)
 | 
						|
}
 | 
						|
func (direct) symlink(oldname, newname string) error {
 | 
						|
	return os.Symlink(oldname, newname)
 | 
						|
}
 | 
						|
func (direct) readlink(name string) (string, error) {
 | 
						|
	return os.Readlink(name)
 | 
						|
}
 | 
						|
 | 
						|
func (direct) umask(mask int) (oldmask int)     { return syscall.Umask(mask) }
 | 
						|
func (direct) sethostname(p []byte) (err error) { return syscall.Sethostname(p) }
 | 
						|
func (direct) chdir(path string) (err error)    { return syscall.Chdir(path) }
 | 
						|
func (direct) fchdir(fd int) (err error)        { return syscall.Fchdir(fd) }
 | 
						|
func (direct) open(path string, mode int, perm uint32) (fd int, err error) {
 | 
						|
	return syscall.Open(path, mode, perm)
 | 
						|
}
 | 
						|
func (direct) close(fd int) (err error) {
 | 
						|
	return syscall.Close(fd)
 | 
						|
}
 | 
						|
func (direct) pivotRoot(newroot, putold string) (err error) {
 | 
						|
	return syscall.PivotRoot(newroot, putold)
 | 
						|
}
 | 
						|
func (direct) mount(source, target, fstype string, flags uintptr, data string) (err error) {
 | 
						|
	return mount(source, target, fstype, flags, data)
 | 
						|
}
 | 
						|
func (direct) unmount(target string, flags int) (err error) {
 | 
						|
	return syscall.Unmount(target, flags)
 | 
						|
}
 | 
						|
func (direct) wait4(pid int, wstatus *syscall.WaitStatus, options int, rusage *syscall.Rusage) (wpid int, err error) {
 | 
						|
	return syscall.Wait4(pid, wstatus, options, rusage)
 | 
						|
}
 | 
						|
 | 
						|
func (direct) printf(msg message.Msg, format string, v ...any) { msg.GetLogger().Printf(format, v...) }
 | 
						|
func (direct) fatal(msg message.Msg, v ...any)                 { msg.GetLogger().Fatal(v...) }
 | 
						|
func (direct) fatalf(msg message.Msg, format string, v ...any) { msg.GetLogger().Fatalf(format, v...) }
 |