All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 33s
				
			Test / Sandbox (push) Successful in 2m13s
				
			Test / Hakurei (push) Successful in 3m3s
				
			Test / Sandbox (race detector) (push) Successful in 3m58s
				
			Test / Hpkg (push) Successful in 4m4s
				
			Test / Hakurei (race detector) (push) Successful in 4m46s
				
			Test / Flake checks (push) Successful in 1m27s
				
			This is useful as package "syscall" does not provide such a wrapper. This change also improves error handling to fully conform to the manpage. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package container
 | 
						|
 | 
						|
import (
 | 
						|
	"syscall"
 | 
						|
	"unsafe"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	_LINUX_CAPABILITY_VERSION_3 = 0x20080522
 | 
						|
 | 
						|
	PR_CAP_AMBIENT           = 0x2f
 | 
						|
	PR_CAP_AMBIENT_RAISE     = 0x2
 | 
						|
	PR_CAP_AMBIENT_CLEAR_ALL = 0x4
 | 
						|
 | 
						|
	CAP_SYS_ADMIN    = 0x15
 | 
						|
	CAP_SETPCAP      = 0x8
 | 
						|
	CAP_DAC_OVERRIDE = 0x1
 | 
						|
)
 | 
						|
 | 
						|
type (
 | 
						|
	capHeader struct {
 | 
						|
		version uint32
 | 
						|
		pid     int32
 | 
						|
	}
 | 
						|
 | 
						|
	capData struct {
 | 
						|
		effective   uint32
 | 
						|
		permitted   uint32
 | 
						|
		inheritable uint32
 | 
						|
	}
 | 
						|
)
 | 
						|
 | 
						|
// See CAP_TO_INDEX in linux/capability.h:
 | 
						|
func capToIndex(cap uintptr) uintptr { return cap >> 5 }
 | 
						|
 | 
						|
// See CAP_TO_MASK in linux/capability.h:
 | 
						|
func capToMask(cap uintptr) uint32 { return 1 << uint(cap&31) }
 | 
						|
 | 
						|
func capset(hdrp *capHeader, datap *[2]capData) error {
 | 
						|
	r, _, errno := syscall.Syscall(
 | 
						|
		syscall.SYS_CAPSET,
 | 
						|
		uintptr(unsafe.Pointer(hdrp)),
 | 
						|
		uintptr(unsafe.Pointer(&datap[0])), 0,
 | 
						|
	)
 | 
						|
	if r != 0 {
 | 
						|
		return errno
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// capBoundingSetDrop drops a capability from the calling thread's capability bounding set.
 | 
						|
func capBoundingSetDrop(cap uintptr) error { return Prctl(syscall.PR_CAPBSET_DROP, cap, 0) }
 | 
						|
 | 
						|
// capAmbientClearAll clears the ambient capability set of the calling thread.
 | 
						|
func capAmbientClearAll() error { return Prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_CLEAR_ALL, 0) }
 | 
						|
 | 
						|
// capAmbientRaise adds to the ambient capability set of the calling thread.
 | 
						|
func capAmbientRaise(cap uintptr) error { return Prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, cap) }
 |