aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/environ.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/environ.go')
-rw-r--r--internal/environ.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/internal/environ.go b/internal/environ.go
new file mode 100644
index 00000000..25f44964
--- /dev/null
+++ b/internal/environ.go
@@ -0,0 +1,59 @@
+package internal
+
+import (
+ "fmt"
+ "os"
+ "path"
+ "strconv"
+ "sync"
+
+ "git.ophivana.moe/cat/fortify/internal/verbose"
+)
+
+// state that remain constant for the lifetime of the process
+// fetched and cached here
+
+const (
+ xdgRuntimeDir = "XDG_RUNTIME_DIR"
+)
+
+// SystemConstants contains state from the operating system
+type SystemConstants struct {
+ // path to shared directory e.g. /tmp/fortify.%d
+ SharePath string `json:"share_path"`
+ // XDG_RUNTIME_DIR value e.g. /run/user/%d
+ RuntimePath string `json:"runtime_path"`
+ // application runtime directory e.g. /run/user/%d/fortify
+ RunDirPath string `json:"run_dir_path"`
+}
+
+var (
+ scVal SystemConstants
+ scOnce sync.Once
+)
+
+func copySC() {
+ sc := SystemConstants{
+ SharePath: path.Join(os.TempDir(), "fortify."+strconv.Itoa(os.Geteuid())),
+ }
+
+ verbose.Println("process share directory at", sc.SharePath)
+
+ // runtimePath, runDirPath
+ if r, ok := os.LookupEnv(xdgRuntimeDir); !ok {
+ fmt.Println("Env variable", xdgRuntimeDir, "unset")
+ os.Exit(1)
+ } else {
+ sc.RuntimePath = r
+ sc.RunDirPath = path.Join(sc.RuntimePath, "fortify")
+ verbose.Println("XDG runtime directory at", sc.RunDirPath)
+ }
+
+ scVal = sc
+}
+
+// GetSC returns a populated SystemConstants value
+func GetSC() SystemConstants {
+ scOnce.Do(copySC)
+ return scVal
+}