aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/state/track.go
blob: 308be28a9b7c3bfb15b7c7c5526f4304ecf174d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package state

import (
	"encoding/gob"
	"errors"
	"io/fs"
	"os"
	"os/exec"
	"path"
	"strconv"
)

// SaveProcess called after process start, before wait
func SaveProcess(uid string, cmd *exec.Cmd, runDirPath string, command []string, enablements Enablements) (string, error) {
	statePath := path.Join(runDirPath, uid, strconv.Itoa(cmd.Process.Pid))
	state := launcherState{
		PID:        cmd.Process.Pid,
		Launcher:   cmd.Path,
		Argv:       cmd.Args,
		Command:    command,
		Capability: enablements,
	}

	if err := os.Mkdir(path.Join(runDirPath, uid), 0700); err != nil && !errors.Is(err, fs.ErrExist) {
		return statePath, err
	}

	if f, err := os.OpenFile(statePath, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600); err != nil {
		return statePath, err
	} else {
		defer func() {
			if f.Close() != nil {
				// unreachable
				panic("state file closed prematurely")
			}
		}()
		return statePath, gob.NewEncoder(f).Encode(state)
	}
}