diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-09-25 13:46:21 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-09-25 13:51:54 +0900 |
| commit | ae2df2c450dd655b93a950124b6ab16e2b4d967b (patch) | |
| tree | 849ab40049228e17891351d97097f8c9d0e18c10 /internal/sys/hsu.go | |
| parent | 6e3f34f2ecfe0f3cd024a6e73bf6560080feac53 (diff) | |
internal: remove sys package
This package is replaced by container/stub. Remove and replace it with unexported implementation for the upcoming test suite rewrite.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/sys/hsu.go')
| -rw-r--r-- | internal/sys/hsu.go | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/internal/sys/hsu.go b/internal/sys/hsu.go deleted file mode 100644 index 5ae12046..00000000 --- a/internal/sys/hsu.go +++ /dev/null @@ -1,88 +0,0 @@ -package sys - -import ( - "errors" - "fmt" - "log" - "os" - "os/exec" - "strconv" - "sync" - - "hakurei.app/container" - "hakurei.app/hst" - "hakurei.app/internal" - "hakurei.app/internal/hlog" -) - -// Hsu caches responses from cmd/hsu. -type Hsu struct { - idOnce sync.Once - idErr error - id int -} - -var ErrHsuAccess = errors.New("current user is not in the hsurc file") - -// ID returns the current user hsurc identifier. ErrHsuAccess is returned if the current user is not in hsurc. -func (h *Hsu) ID() (int, error) { - h.idOnce.Do(func() { - h.id = -1 - hsuPath := internal.MustHsuPath() - - cmd := exec.Command(hsuPath) - cmd.Path = hsuPath - cmd.Stderr = os.Stderr // pass through fatal messages - cmd.Env = make([]string, 0) - cmd.Dir = container.FHSRoot - var ( - p []byte - exitError *exec.ExitError - ) - - const step = "obtain uid from hsu" - if p, h.idErr = cmd.Output(); h.idErr == nil { - h.id, h.idErr = strconv.Atoi(string(p)) - if h.idErr != nil { - h.idErr = &hst.AppError{Step: step, Err: h.idErr, Msg: "invalid uid string from hsu"} - } - } else if errors.As(h.idErr, &exitError) && exitError != nil && exitError.ExitCode() == 1 { - // hsu prints an error message in this case - h.idErr = &hst.AppError{Step: step, Err: ErrHsuAccess} - } else if os.IsNotExist(h.idErr) { - h.idErr = &hst.AppError{Step: step, Err: os.ErrNotExist, - Msg: fmt.Sprintf("the setuid helper is missing: %s", hsuPath)} - } - }) - - return h.id, h.idErr -} - -func (h *Hsu) Uid(identity int) (int, error) { - id, err := h.ID() - if err == nil { - return 1000000 + id*10000 + identity, nil - } - return id, 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 - } -} |
