diff options
Diffstat (limited to 'internal/sys')
| -rw-r--r-- | internal/sys/hsu.go | 23 | ||||
| -rw-r--r-- | internal/sys/interface.go | 10 | ||||
| -rw-r--r-- | internal/sys/std.go | 28 |
3 files changed, 26 insertions, 35 deletions
diff --git a/internal/sys/hsu.go b/internal/sys/hsu.go index 84bb0731..2be12d1e 100644 --- a/internal/sys/hsu.go +++ b/internal/sys/hsu.go @@ -3,6 +3,7 @@ package sys import ( "errors" "fmt" + "log" "os" "os/exec" "strconv" @@ -11,6 +12,7 @@ import ( "hakurei.app/container" "hakurei.app/hst" "hakurei.app/internal" + "hakurei.app/internal/hlog" ) // Hsu caches responses from cmd/hsu. @@ -79,3 +81,24 @@ func (h *Hsu) Uid(identity int) (int, error) { } return u.uid, u.err } + +// MustUid calls [State.Uid] and terminates on error. +func MustUid(s State, identity int) int { + uid, err := s.Uid(identity) + if err == nil { + return uid + } + + const fallback = "cannot obtain uid from setuid wrapper:" + if errors.Is(err, ErrHsuAccess) { + hlog.Verbose("*"+fallback, err) + os.Exit(1) + return -0xdeadbeef + } else if m, ok := container.GetErrorMessage(err); ok { + log.Fatal(m) + return -0xdeadbeef + } else { + log.Fatalln(fallback, err) + return -0xdeadbeef + } +} diff --git a/internal/sys/interface.go b/internal/sys/interface.go index ed765ece..f2465e62 100644 --- a/internal/sys/interface.go +++ b/internal/sys/interface.go @@ -49,14 +49,8 @@ type State interface { Uid(identity int) (int, error) } -// GetUserID obtains user id from hsu by querying uid of identity 0. -func GetUserID(os State) (int, error) { - if uid, err := os.Uid(0); err != nil { - return -1, err - } else { - return (uid / 10000) - 100, nil - } -} +// MustGetUserID obtains user id from hsu by querying uid of identity 0. +func MustGetUserID(os State) int { return (MustUid(os, 0) / 10000) - 100 } // CopyPaths is a generic implementation of [hst.Paths]. func CopyPaths(os State, v *hst.Paths, userid int) { diff --git a/internal/sys/std.go b/internal/sys/std.go index 24b36fa2..11334c72 100644 --- a/internal/sys/std.go +++ b/internal/sys/std.go @@ -1,9 +1,7 @@ package sys import ( - "errors" "io/fs" - "log" "os" "os/exec" "os/user" @@ -41,30 +39,6 @@ func (s *Std) Printf(format string, v ...any) { hlog.Verbosef(form const xdgRuntimeDir = "XDG_RUNTIME_DIR" func (s *Std) Paths() hst.Paths { - s.pathsOnce.Do(func() { - if userid, err := GetUserID(s); err != nil { - // TODO(ophestra): this duplicates code in cmd/hakurei/command.go, keep this up to date until removal - hlog.BeforeExit() - const fallback = "cannot obtain user id from hsu:" - - // this indicates the error message has already reached stderr, outside the current process's control; - // this is only reached when hsu fails for any reason, as a second error message following hsu is confusing - if errors.Is(err, ErrHsuAccess) { - hlog.Verbose("*"+fallback, err) - os.Exit(1) - return - } - - m, ok := container.GetErrorMessage(err) - if !ok { - log.Fatalln(fallback, err) - return - } - - log.Fatal(m) - } else { - CopyPaths(s, &s.paths, userid) - } - }) + s.pathsOnce.Do(func() { CopyPaths(s, &s.paths, MustGetUserID(s)) }) return s.paths } |
