mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
53 lines
1.6 KiB
Go
53 lines
1.6 KiB
Go
//go:build linux
|
|||
|
|
// +build linux
|
||
|
|
|
||
|
|
package platform
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
llsyscall "github.com/landlock-lsm/go-landlock/landlock/syscall"
|
||
|
|
)
|
||
|
|
|
||
|
|
// landlockABI represents the detected Landlock ABI version and its feature capabilities.
|
||
|
|
// Each boolean flag indicates whether the corresponding Landlock feature is available
|
||
|
|
// at the detected ABI version.
|
||
|
|
type landlockABI struct {
|
||
|
|
Version int // 1-6, 0 if unsupported
|
||
|
|
HasRefer bool // V2+: rename across directories (atomic writes)
|
||
|
|
HasTruncate bool // V3+: file truncation
|
||
|
|
HasNetwork bool // V4+: TCP port filtering
|
||
|
|
HasIoctlDev bool // V5+: device ioctl (PTY terminal ops)
|
||
|
|
HasScoping bool // V6+: signal isolation
|
||
|
|
}
|
||
|
|
|
||
|
|
// newLandlockABI constructs a landlockABI with feature flags derived from the version number.
|
||
|
|
// Version <= 0 means all flags are false (unsupported). Versions > 6 have all flags set
|
||
|
|
// to true since we assume forward compatibility for known features.
|
||
|
|
func newLandlockABI(version int) *landlockABI {
|
||
|
|
return &landlockABI{
|
||
|
|
Version: version,
|
||
|
|
HasRefer: version >= 2,
|
||
|
|
HasTruncate: version >= 3,
|
||
|
|
HasNetwork: version >= 4,
|
||
|
|
HasIoctlDev: version >= 5,
|
||
|
|
HasScoping: version >= 6,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// landlockDetectABI probes the running kernel for Landlock support and returns
|
||
|
|
// the detected ABI version with feature flags. Returns an error if Landlock is
|
||
|
|
// not supported by the kernel.
|
||
|
|
func landlockDetectABI() (*landlockABI, error) {
|
||
|
|
version, err := llsyscall.LandlockGetABIVersion()
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("landlock not supported: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
if version <= 0 {
|
||
|
|
return nil, fmt.Errorf("landlock not supported: ABI version %d", version)
|
||
|
|
}
|
||
|
|
|
||
|
|
return newLandlockABI(version), nil
|
||
|
|
}
|