65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"io"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
|
||
|
"git.gensokyo.uk/security/fortify/fst"
|
||
|
"git.gensokyo.uk/security/fortify/internal"
|
||
|
"git.gensokyo.uk/security/fortify/internal/fmsg"
|
||
|
)
|
||
|
|
||
|
func fortifyApp(config *fst.Config, beforeFail func()) {
|
||
|
var (
|
||
|
cmd *exec.Cmd
|
||
|
st io.WriteCloser
|
||
|
)
|
||
|
if p, ok := internal.Check(internal.Fortify); !ok {
|
||
|
beforeFail()
|
||
|
fmsg.Fatal("invalid fortify path, this copy of fpkg is not compiled correctly")
|
||
|
panic("unreachable")
|
||
|
} else if r, w, err := os.Pipe(); err != nil {
|
||
|
beforeFail()
|
||
|
fmsg.Fatalf("cannot pipe: %v", err)
|
||
|
panic("unreachable")
|
||
|
} else {
|
||
|
if fmsg.Verbose() {
|
||
|
cmd = exec.Command(p, "-v", "app", "3")
|
||
|
} else {
|
||
|
cmd = exec.Command(p, "app", "3")
|
||
|
}
|
||
|
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
||
|
cmd.ExtraFiles = []*os.File{r}
|
||
|
st = w
|
||
|
}
|
||
|
|
||
|
go func() {
|
||
|
if err := json.NewEncoder(st).Encode(config); err != nil {
|
||
|
beforeFail()
|
||
|
fmsg.Fatalf("cannot send configuration: %v", err)
|
||
|
panic("unreachable")
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
if err := cmd.Start(); err != nil {
|
||
|
beforeFail()
|
||
|
fmsg.Fatalf("cannot start fortify: %v", err)
|
||
|
panic("unreachable")
|
||
|
}
|
||
|
if err := cmd.Wait(); err != nil {
|
||
|
var exitError *exec.ExitError
|
||
|
if errors.As(err, &exitError) {
|
||
|
beforeFail()
|
||
|
fmsg.Exit(exitError.ExitCode())
|
||
|
panic("unreachable")
|
||
|
} else {
|
||
|
beforeFail()
|
||
|
fmsg.Fatalf("cannot wait: %v", err)
|
||
|
panic("unreachable")
|
||
|
}
|
||
|
}
|
||
|
}
|