aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/helper/helper.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-11-12 23:12:38 +0900
committerOphestra <cat@gensokyo.uk>2025-11-12 23:16:13 +0900
commitf347d44c2281f507e3786aa498f634bfa4c92d84 (patch)
treefe85b41d5f6a5e308b87585f46efd64f90221e2b /internal/helper/helper.go
parentb5630f6883c874d458d9ae3c666cfb7ae5e3121d (diff)
internal/helper: relocate from helper
This package is ugly and is pending removal only kept alive by xdg-dbus-proxy. Its exported symbols are made available until v0.4.0 where it will be removed for #24. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/helper/helper.go')
-rw-r--r--internal/helper/helper.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/internal/helper/helper.go b/internal/helper/helper.go
new file mode 100644
index 00000000..378d9471
--- /dev/null
+++ b/internal/helper/helper.go
@@ -0,0 +1,83 @@
+// Package helper runs external helpers with optional sandboxing.
+package helper
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "os"
+ "time"
+
+ "hakurei.app/internal/helper/proc"
+)
+
+var WaitDelay = 2 * time.Second
+
+const (
+ // HakureiHelper is set to 1 when args fd is enabled and 0 otherwise.
+ HakureiHelper = "HAKUREI_HELPER"
+ // HakureiStatus is set to 1 when stat fd is enabled and 0 otherwise.
+ HakureiStatus = "HAKUREI_STATUS"
+)
+
+type Helper interface {
+ // Start starts the helper process.
+ Start() error
+ // Wait blocks until Helper exits.
+ Wait() error
+
+ fmt.Stringer
+}
+
+func newHelperFiles(
+ ctx context.Context,
+ wt io.WriterTo,
+ stat bool,
+ argF func(argsFd, statFd int) []string,
+ extraFiles []*os.File,
+) (hl *helperFiles, args []string) {
+ hl = new(helperFiles)
+ hl.ctx = ctx
+ hl.useArgsFd = wt != nil
+ hl.useStatFd = stat
+
+ hl.extraFiles = new(proc.ExtraFilesPre)
+ for _, f := range extraFiles {
+ _, v := hl.extraFiles.Append()
+ *v = f
+ }
+
+ argsFd := -1
+ if hl.useArgsFd {
+ f := proc.NewWriterTo(wt)
+ argsFd = int(proc.InitFile(f, hl.extraFiles))
+ hl.files = append(hl.files, f)
+ }
+
+ statFd := -1
+ if hl.useStatFd {
+ f := proc.NewStat(&hl.stat)
+ statFd = int(proc.InitFile(f, hl.extraFiles))
+ hl.files = append(hl.files, f)
+ }
+
+ args = argF(argsFd, statFd)
+ return
+}
+
+// helperFiles provides a generic wrapper around helper ipc.
+type helperFiles struct {
+ // whether argsFd is present
+ useArgsFd bool
+ // whether statFd is present
+ useStatFd bool
+
+ // closes statFd
+ stat io.Closer
+ // deferred extraFiles fulfillment
+ files []proc.File
+ // passed through to [proc.Fulfill] and [proc.InitFile]
+ extraFiles *proc.ExtraFilesPre
+
+ ctx context.Context
+}