73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
package helper
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"slices"
|
|
"strconv"
|
|
|
|
"git.gensokyo.uk/security/fortify/helper/bwrap"
|
|
"git.gensokyo.uk/security/fortify/helper/proc"
|
|
)
|
|
|
|
// BubblewrapName is the file name or path to bubblewrap.
|
|
var BubblewrapName = "bwrap"
|
|
|
|
// MustNewBwrap initialises a new Bwrap instance with wt as the null-terminated argument writer.
|
|
// If wt is nil, the child process spawned by bwrap will not get an argument pipe.
|
|
// Function argF returns an array of arguments passed directly to the child process.
|
|
func MustNewBwrap(
|
|
ctx context.Context,
|
|
name string,
|
|
wt io.WriterTo,
|
|
stat bool,
|
|
argF func(argsFd, statFd int) []string,
|
|
cmdF func(cmd *exec.Cmd),
|
|
extraFiles []*os.File,
|
|
conf *bwrap.Config,
|
|
syncFd *os.File,
|
|
) Helper {
|
|
b, err := NewBwrap(ctx, name, wt, stat, argF, cmdF, extraFiles, conf, syncFd)
|
|
if err != nil {
|
|
panic(err.Error())
|
|
} else {
|
|
return b
|
|
}
|
|
}
|
|
|
|
// NewBwrap initialises a new Bwrap instance with wt as the null-terminated argument writer.
|
|
// If wt is nil, the child process spawned by bwrap will not get an argument pipe.
|
|
// Function argF returns an array of arguments passed directly to the child process.
|
|
func NewBwrap(
|
|
ctx context.Context,
|
|
name string,
|
|
wt io.WriterTo,
|
|
stat bool,
|
|
argF func(argsFd, statFd int) []string,
|
|
cmdF func(cmd *exec.Cmd),
|
|
extraFiles []*os.File,
|
|
conf *bwrap.Config,
|
|
syncFd *os.File,
|
|
) (Helper, error) {
|
|
b, args := newHelperCmd(ctx, BubblewrapName, wt, stat, argF, extraFiles)
|
|
|
|
var argsFd uintptr
|
|
if v, err := NewCheckedArgs(conf.Args(syncFd, b.extraFiles, &b.files)); err != nil {
|
|
return nil, err
|
|
} else {
|
|
f := proc.NewWriterTo(v)
|
|
argsFd = proc.InitFile(f, b.extraFiles)
|
|
b.files = append(b.files, f)
|
|
}
|
|
|
|
b.Args = slices.Grow(b.Args, 4+len(args))
|
|
b.Args = append(b.Args, "--args", strconv.Itoa(int(argsFd)), "--", name)
|
|
b.Args = append(b.Args, args...)
|
|
if cmdF != nil {
|
|
cmdF(b.Cmd)
|
|
}
|
|
return b, nil
|
|
}
|