Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
90 lines
1.9 KiB
Go
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()
|
|
}
|