All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 32s
				
			Test / Sandbox (push) Successful in 2m19s
				
			Test / Hakurei (push) Successful in 3m9s
				
			Test / Hpkg (push) Successful in 3m53s
				
			Test / Sandbox (race detector) (push) Successful in 4m2s
				
			Test / Hakurei (race detector) (push) Successful in 4m43s
				
			Test / Flake checks (push) Successful in 1m23s
				
			This package will also hold syscall lookup tables for seccomp. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package ldd
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"context"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"time"
 | |
| 
 | |
| 	"hakurei.app/container"
 | |
| 	"hakurei.app/container/check"
 | |
| 	"hakurei.app/container/comp"
 | |
| 	"hakurei.app/container/fhs"
 | |
| 	"hakurei.app/container/seccomp"
 | |
| 	"hakurei.app/message"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	msgStatic      = []byte("Not a valid dynamic program")
 | |
| 	msgStaticGlibc = []byte("not a dynamic executable")
 | |
| )
 | |
| 
 | |
| func Exec(ctx context.Context, msg message.Msg, p string) ([]*Entry, error) {
 | |
| 	const (
 | |
| 		lddName    = "ldd"
 | |
| 		lddTimeout = 4 * time.Second
 | |
| 	)
 | |
| 
 | |
| 	c, cancel := context.WithTimeout(ctx, lddTimeout)
 | |
| 	defer cancel()
 | |
| 
 | |
| 	var toolPath *check.Absolute
 | |
| 	if s, err := exec.LookPath(lddName); err != nil {
 | |
| 		return nil, err
 | |
| 	} else if toolPath, err = check.NewAbs(s); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	z := container.NewCommand(c, msg, toolPath, lddName, p)
 | |
| 	z.Hostname = "hakurei-" + lddName
 | |
| 	z.SeccompFlags |= seccomp.AllowMultiarch
 | |
| 	z.SeccompPresets |= comp.PresetStrict
 | |
| 	stdout, stderr := new(bytes.Buffer), new(bytes.Buffer)
 | |
| 	z.Stdout = stdout
 | |
| 	z.Stderr = stderr
 | |
| 	z.
 | |
| 		Bind(fhs.AbsRoot, fhs.AbsRoot, 0).
 | |
| 		Proc(fhs.AbsProc).
 | |
| 		Dev(fhs.AbsDev, false)
 | |
| 
 | |
| 	if err := z.Start(); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	defer func() { _, _ = io.Copy(os.Stderr, stderr) }()
 | |
| 	if err := z.Serve(); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	if err := z.Wait(); err != nil {
 | |
| 		m := stderr.Bytes()
 | |
| 		if bytes.Contains(m, append([]byte(p+": "), msgStatic...)) ||
 | |
| 			bytes.Contains(m, msgStaticGlibc) {
 | |
| 			return nil, nil
 | |
| 		}
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	v := stdout.Bytes()
 | |
| 	return Parse(v)
 | |
| }
 |