All checks were successful
		
		
	
	Test / Hpkg (push) Successful in 4m11s
				
			Test / Sandbox (race detector) (push) Successful in 4m13s
				
			Test / Hakurei (race detector) (push) Successful in 5m3s
				
			Test / Flake checks (push) Successful in 1m30s
				
			Test / Create distribution (push) Successful in 36s
				
			Test / Sandbox (push) Successful in 2m16s
				
			Test / Hakurei (push) Successful in 3m16s
				
			This increases flexibility of how caller wants to handle the I/O. Also makes it no longer rely on finalizer. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			48 lines
		
	
	
		
			1015 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1015 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package container
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/gob"
 | 
						|
	"errors"
 | 
						|
	"os"
 | 
						|
	"strconv"
 | 
						|
	"syscall"
 | 
						|
)
 | 
						|
 | 
						|
// Setup appends the read end of a pipe for setup params transmission and returns its fd.
 | 
						|
func Setup(extraFiles *[]*os.File) (int, *os.File, error) {
 | 
						|
	if r, w, err := os.Pipe(); err != nil {
 | 
						|
		return -1, nil, err
 | 
						|
	} else {
 | 
						|
		fd := 3 + len(*extraFiles)
 | 
						|
		*extraFiles = append(*extraFiles, r)
 | 
						|
		return fd, w, nil
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
var (
 | 
						|
	ErrReceiveEnv = errors.New("environment variable not set")
 | 
						|
)
 | 
						|
 | 
						|
// Receive retrieves setup fd from the environment and receives params.
 | 
						|
func Receive(key string, e any, fdp *uintptr) (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 {
 | 
						|
			return nil, optionalErrorUnwrap(err)
 | 
						|
		} else {
 | 
						|
			setup = os.NewFile(uintptr(fd), "setup")
 | 
						|
			if setup == nil {
 | 
						|
				return nil, syscall.EDOM
 | 
						|
			}
 | 
						|
			if fdp != nil {
 | 
						|
				*fdp = setup.Fd()
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return setup.Close, gob.NewDecoder(setup).Decode(e)
 | 
						|
}
 |