diff options
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) +} |
