diff options
Diffstat (limited to 'internal/system.go')
| -rw-r--r-- | internal/system.go | 72 |
1 files changed, 39 insertions, 33 deletions
diff --git a/internal/system.go b/internal/system.go index e98bb67e..3e973b56 100644 --- a/internal/system.go +++ b/internal/system.go @@ -1,6 +1,7 @@ package internal import ( + "errors" "io/fs" "os" "os/exec" @@ -37,6 +38,8 @@ type System interface { // Paths returns a populated [Paths] struct. Paths() Paths + // SdBooted implements https://www.freedesktop.org/software/systemd/man/sd_booted.html + SdBooted() bool } // Paths contains environment dependent paths used by fortify. @@ -71,50 +74,53 @@ func CopyPaths(os System, v *Paths) { type Std struct { paths Paths pathsOnce sync.Once -} - -func (s *Std) Geteuid() int { - return os.Geteuid() -} - -func (s *Std) LookupEnv(key string) (string, bool) { - return os.LookupEnv(key) -} -func (s *Std) TempDir() string { - return os.TempDir() + sdBooted bool + sdBootedOnce sync.Once } -func (s *Std) LookPath(file string) (string, error) { - return exec.LookPath(file) -} +func (s *Std) Geteuid() int { return os.Geteuid() } +func (s *Std) LookupEnv(key string) (string, bool) { return os.LookupEnv(key) } +func (s *Std) TempDir() string { return os.TempDir() } +func (s *Std) LookPath(file string) (string, error) { return exec.LookPath(file) } +func (s *Std) Executable() (string, error) { return os.Executable() } +func (s *Std) Lookup(username string) (*user.User, error) { return user.Lookup(username) } +func (s *Std) ReadDir(name string) ([]os.DirEntry, error) { return os.ReadDir(name) } +func (s *Std) Stat(name string) (fs.FileInfo, error) { return os.Stat(name) } +func (s *Std) Open(name string) (fs.File, error) { return os.Open(name) } +func (s *Std) Exit(code int) { fmsg.Exit(code) } -func (s *Std) Executable() (string, error) { - return os.Executable() -} +const xdgRuntimeDir = "XDG_RUNTIME_DIR" -func (s *Std) Lookup(username string) (*user.User, error) { - return user.Lookup(username) +func (s *Std) Paths() Paths { + s.pathsOnce.Do(func() { CopyPaths(s, &s.paths) }) + return s.paths } -func (s *Std) ReadDir(name string) ([]os.DirEntry, error) { - return os.ReadDir(name) +func (s *Std) SdBooted() bool { + s.sdBootedOnce.Do(func() { s.sdBooted = copySdBooted() }) + return s.sdBooted } -func (s *Std) Stat(name string) (fs.FileInfo, error) { - return os.Stat(name) -} +const systemdCheckPath = "/run/systemd/system" -func (s *Std) Open(name string) (fs.File, error) { - return os.Open(name) -} -func (s *Std) Exit(code int) { - fmsg.Exit(code) +func copySdBooted() bool { + if v, err := sdBooted(); err != nil { + fmsg.Println("cannot read systemd marker:", err) + return false + } else { + return v + } } -const xdgRuntimeDir = "XDG_RUNTIME_DIR" +func sdBooted() (bool, error) { + _, err := os.Stat(systemdCheckPath) + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + err = nil + } + return false, err + } -func (s *Std) Paths() Paths { - s.pathsOnce.Do(func() { CopyPaths(s, &s.paths) }) - return s.paths + return true, nil } |
