diff options
| author | Ophestra Umiker <cat@ophivana.moe> | 2024-12-18 16:48:41 +0900 |
|---|---|---|
| committer | Ophestra Umiker <cat@ophivana.moe> | 2024-12-18 16:48:41 +0900 |
| commit | ef8fd37e9d21b353f8d9805644833a19467d3044 (patch) | |
| tree | 380c082dbc437d534d05536de75a595b03c834b4 /internal | |
| parent | 2f676c9d6e7baac289409cbcabde5b6e53b32ec3 (diff) | |
proc: setup payload receive
Generic implementation of setup payload receiver adapted from finit.
Signed-off-by: Ophestra Umiker <cat@ophivana.moe>
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/proc/fd.go | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/internal/proc/fd.go b/internal/proc/fd.go new file mode 100644 index 00000000..1d63427b --- /dev/null +++ b/internal/proc/fd.go @@ -0,0 +1,32 @@ +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) +} |
