aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/state/data.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/state/data.go')
-rw-r--r--internal/state/data.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/internal/state/data.go b/internal/state/data.go
new file mode 100644
index 00000000..65b6395e
--- /dev/null
+++ b/internal/state/data.go
@@ -0,0 +1,51 @@
+package state
+
+import (
+ "encoding/gob"
+ "os"
+ "path"
+)
+
+// we unfortunately have to assume there are never races between processes
+// this and launcher should eventually be replaced by a server process
+
+type launcherState struct {
+ PID int
+ Launcher string
+ Argv []string
+ Command []string
+ Capability Enablements
+}
+
+func ReadLaunchers(runDirPath, uid string) ([]*launcherState, error) {
+ var f *os.File
+ var r []*launcherState
+ launcherPrefix := path.Join(runDirPath, uid)
+
+ if pl, err := os.ReadDir(launcherPrefix); err != nil {
+ return nil, err
+ } else {
+ for _, e := range pl {
+ if err = func() error {
+ if f, err = os.Open(path.Join(launcherPrefix, e.Name())); err != nil {
+ return err
+ } else {
+ defer func() {
+ if f.Close() != nil {
+ // unreachable
+ panic("foreign state file closed prematurely")
+ }
+ }()
+
+ var s launcherState
+ r = append(r, &s)
+ return gob.NewDecoder(f).Decode(&s)
+ }
+ }(); err != nil {
+ return nil, err
+ }
+ }
+ }
+
+ return r, nil
+}