aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/sys
diff options
context:
space:
mode:
Diffstat (limited to 'internal/sys')
-rw-r--r--internal/sys/hsu.go23
-rw-r--r--internal/sys/interface.go10
-rw-r--r--internal/sys/std.go28
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
}