aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/params/params.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-04-07 16:31:46 +0900
committerOphestra <cat@gensokyo.uk>2026-04-07 16:37:44 +0900
commitc61cdc505f05decd940cb2d861241039a49251e3 (patch)
treee6f34ad86c7a4d0e98b896cd37d4f77cbcb9ea66 /internal/params/params.go
parent062edb3487c1cc116cae78bf77420b65c43517d1 (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.go42
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)
+}