diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-04-07 16:31:46 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-04-07 16:37:44 +0900 |
| commit | c61cdc505f05decd940cb2d861241039a49251e3 (patch) | |
| tree | e6f34ad86c7a4d0e98b896cd37d4f77cbcb9ea66 /internal/params/params.go | |
| parent | 062edb3487c1cc116cae78bf77420b65c43517d1 (diff) | |
internal/params: relocate from package container
This does not make sense as part of the public API, so make it internal.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/params/params.go')
| -rw-r--r-- | internal/params/params.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/internal/params/params.go b/internal/params/params.go new file mode 100644 index 00000000..6f1962af --- /dev/null +++ b/internal/params/params.go @@ -0,0 +1,42 @@ +// Package params provides helpers for receiving setup payload from parent. +package params + +import ( + "encoding/gob" + "errors" + "os" + "strconv" + "syscall" +) + +// ErrReceiveEnv is returned by [Receive] if setup fd is not present in environment. +var ErrReceiveEnv = errors.New("environment variable not set") + +// Receive retrieves setup fd from the environment and receives params. +// +// The file descriptor written to the value pointed to by fdp must not be passed +// to any system calls. It is made available for ordering file descriptor only. +func Receive(key string, v any, fdp *int) (func() error, error) { + var setup *os.File + + if s, ok := os.LookupEnv(key); !ok { + return nil, ErrReceiveEnv + } else { + if fd, err := strconv.Atoi(s); err != nil { + if _err := errors.Unwrap(err); _err != nil { + err = _err + } + return nil, err + } else { + setup = os.NewFile(uintptr(fd), "setup") + if setup == nil { + return nil, syscall.EDOM + } + if fdp != nil { + *fdp = fd + } + } + } + + return setup.Close, gob.NewDecoder(setup).Decode(v) +} |
