All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 34s
				
			Test / Sandbox (push) Successful in 2m9s
				
			Test / Hakurei (push) Successful in 3m9s
				
			Test / Hpkg (push) Successful in 4m12s
				
			Test / Sandbox (race detector) (push) Successful in 4m29s
				
			Test / Hakurei (race detector) (push) Successful in 5m6s
				
			Test / Flake checks (push) Successful in 1m29s
				
			The file is very difficult to stub. Pass fd instead as it is the value that is actually useful. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package container
 | |
| 
 | |
| import (
 | |
| 	"encoding/gob"
 | |
| 	"errors"
 | |
| 	"os"
 | |
| 	"strconv"
 | |
| 	"syscall"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	ErrNotSet   = errors.New("environment variable not set")
 | |
| 	ErrFdFormat = errors.New("bad file descriptor representation")
 | |
| )
 | |
| 
 | |
| // Setup appends the read end of a pipe for setup params transmission and returns its fd.
 | |
| func Setup(extraFiles *[]*os.File) (int, *gob.Encoder, error) {
 | |
| 	if r, w, err := os.Pipe(); err != nil {
 | |
| 		return -1, nil, err
 | |
| 	} else {
 | |
| 		fd := 3 + len(*extraFiles)
 | |
| 		*extraFiles = append(*extraFiles, r)
 | |
| 		return fd, gob.NewEncoder(w), nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // 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, ErrNotSet
 | |
| 	} else {
 | |
| 		if fd, err := strconv.Atoi(s); err != nil {
 | |
| 			return nil, ErrFdFormat
 | |
| 		} else {
 | |
| 			setup = os.NewFile(uintptr(fd), "setup")
 | |
| 			if setup == nil {
 | |
| 				return nil, syscall.EBADF
 | |
| 			}
 | |
| 			if fdp != nil {
 | |
| 				*fdp = setup.Fd()
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return setup.Close, gob.NewDecoder(setup).Decode(e)
 | |
| }
 |