Files
exec/proot/proot_linux.go
Matheus Sampaio Queiroga 31bcff2719 update proot
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2025-07-30 16:32:39 -03:00

90 lines
1.9 KiB
Go

//go:build linux || android
package proot
import (
"context"
"os"
"os/exec"
"runtime"
"syscall"
goexec "sirherobrine23.com.br/go-bds/exec/exec"
)
const (
DISABLED = iota
DISABLING
ENABLED
FILTER_SYSEXIT = 0x1
)
const (
SIGSTOP_IGNORED = iota /* Ignore SIGSTOP (once the parent is known). */
SIGSTOP_ALLOWED /* Allow SIGSTOP (once the parent is known). */
SIGSTOP_PENDING /* Block SIGSTOP until the parent is unknown. */
)
var _ = goexec.Register("proot", NewProc)
func NewProc() (*Proot, error) {
return &Proot{
Rootfs: "/",
Cmd: nil,
}, nil
}
func (proot *Proot) Kill() error { return proot.Cmd.Process.Kill() }
func (proot *Proot) Signal(s os.Signal) error { return proot.Cmd.Process.Signal(s) }
func (proot *Proot) Close() error {
if proot.Cmd.Process != nil {
return proot.Cmd.Process.Signal(os.Interrupt)
}
return nil
}
func (proot *Proot) Start(options *goexec.Exec) error {
proot.Cmd = exec.Command(options.Arguments[0], options.Arguments[1:]...)
if err := proot.Cmd.Err; err != nil {
return err
}
if proot.Cmd.SysProcAttr == nil {
proot.Cmd.SysProcAttr = &syscall.SysProcAttr{}
}
proot.Cmd.SysProcAttr.Ptrace = true
proot.Cmd.SysProcAttr.Cloneflags = syscall.CLONE_NEWUSER
// attach stdin
switch {
case options.Stdin != nil:
proot.Cmd.Stdin = options.Stdin
case proot.Stdin != nil:
proot.Cmd.Stdin = proot.Stdin
}
// attach stdout
switch {
case options.Stdout != nil:
proot.Cmd.Stdout = options.Stdout
case proot.Stdout != nil:
proot.Cmd.Stdout = proot.Stdout
}
// attach stderr
switch {
case options.Stderr != nil:
proot.Cmd.Stderr = options.Stderr
case proot.Stderr != nil:
proot.Cmd.Stderr = proot.Stderr
}
runtime.LockOSThread() // Lock thread to use PTRACE
proot.done, proot.donefFn = context.WithCancel(context.Background())
// go proot.Event() // Start background loop event
return proot.Cmd.Start()
}