Compare commits
No commits in common. "f69e8e753e12d086f77ebf8b8506f2a91e7c8c1c" and "2f676c9d6e7baac289409cbcabde5b6e53b32ec3" have entirely different histories.
f69e8e753e
...
2f676c9d6e
@ -1,18 +1,19 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/gob"
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
init0 "git.ophivana.moe/security/fortify/cmd/finit/ipc"
|
init0 "git.ophivana.moe/security/fortify/cmd/finit/ipc"
|
||||||
"git.ophivana.moe/security/fortify/internal"
|
"git.ophivana.moe/security/fortify/internal"
|
||||||
"git.ophivana.moe/security/fortify/internal/fmsg"
|
"git.ophivana.moe/security/fortify/internal/fmsg"
|
||||||
"git.ophivana.moe/security/fortify/internal/proc"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -47,24 +48,30 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// receive setup payload
|
// setup pipe fd from environment
|
||||||
var (
|
var setup *os.File
|
||||||
payload init0.Payload
|
if s, ok := os.LookupEnv(init0.Env); !ok {
|
||||||
closeSetup func() error
|
|
||||||
)
|
|
||||||
if f, err := proc.Receive(init0.Env, &payload); err != nil {
|
|
||||||
if errors.Is(err, proc.ErrInvalid) {
|
|
||||||
fmsg.Fatal("invalid config descriptor")
|
|
||||||
}
|
|
||||||
if errors.Is(err, proc.ErrNotSet) {
|
|
||||||
fmsg.Fatal("FORTIFY_INIT not set")
|
fmsg.Fatal("FORTIFY_INIT not set")
|
||||||
|
panic("unreachable")
|
||||||
|
} else {
|
||||||
|
if fd, err := strconv.Atoi(s); err != nil {
|
||||||
|
fmsg.Fatalf("cannot parse %q: %v", s, err)
|
||||||
|
panic("unreachable")
|
||||||
|
} else {
|
||||||
|
setup = os.NewFile(uintptr(fd), "setup")
|
||||||
|
if setup == nil {
|
||||||
|
fmsg.Fatal("invalid config descriptor")
|
||||||
|
panic("unreachable")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fmsg.Fatalf("cannot decode init setup payload: %v", err)
|
var payload init0.Payload
|
||||||
|
if err := gob.NewDecoder(setup).Decode(&payload); err != nil {
|
||||||
|
fmsg.Fatal("cannot decode init setup payload:", err)
|
||||||
panic("unreachable")
|
panic("unreachable")
|
||||||
} else {
|
} else {
|
||||||
fmsg.SetVerbose(payload.Verbose)
|
fmsg.SetVerbose(payload.Verbose)
|
||||||
closeSetup = f
|
|
||||||
|
|
||||||
// child does not need to see this
|
// child does not need to see this
|
||||||
if err = os.Unsetenv(init0.Env); err != nil {
|
if err = os.Unsetenv(init0.Env); err != nil {
|
||||||
@ -91,7 +98,7 @@ func main() {
|
|||||||
fmsg.Suspend()
|
fmsg.Suspend()
|
||||||
|
|
||||||
// close setup pipe as setup is now complete
|
// close setup pipe as setup is now complete
|
||||||
if err := closeSetup(); err != nil {
|
if err := setup.Close(); err != nil {
|
||||||
fmsg.Println("cannot close setup pipe:", err)
|
fmsg.Println("cannot close setup pipe:", err)
|
||||||
// not fatal
|
// not fatal
|
||||||
}
|
}
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
package proc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/gob"
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrNotSet = errors.New("environment variable not set")
|
|
||||||
ErrInvalid = errors.New("bad file descriptor")
|
|
||||||
)
|
|
||||||
|
|
||||||
func Receive(key string, e any) (func() error, error) {
|
|
||||||
var setup *os.File
|
|
||||||
|
|
||||||
if s, ok := os.LookupEnv(key); !ok {
|
|
||||||
return nil, ErrNotSet
|
|
||||||
} else {
|
|
||||||
if fd, err := strconv.Atoi(s); err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else {
|
|
||||||
setup = os.NewFile(uintptr(fd), "setup")
|
|
||||||
if setup == nil {
|
|
||||||
return nil, ErrInvalid
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return func() error { return setup.Close() }, gob.NewDecoder(setup).Decode(e)
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user