aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/app.go
blob: 902df10f129e4373283b16bb94db5277a7c47ce3 (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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Package app defines the generic [App] interface.
package app

import (
	"syscall"
	"time"

	"git.gensokyo.uk/security/hakurei/hst"
)

type App interface {
	// ID returns a copy of [ID] held by App.
	ID() ID

	// Seal determines the outcome of config as a [SealedApp].
	// The value of config might be overwritten and must not be used again.
	Seal(config *hst.Config) (SealedApp, error)

	String() string
}

type SealedApp interface {
	// Run commits sealed system setup and starts the app process.
	Run(rs *RunState) error
}

// RunState stores the outcome of a call to [SealedApp.Run].
type RunState struct {
	// Time is the exact point in time where the process was created.
	// Location must be set to UTC.
	//
	// Time is nil if no process was ever created.
	Time *time.Time
	// RevertErr is stored by the deferred revert call.
	RevertErr error
	// WaitErr is the generic error value created by the standard library.
	WaitErr error

	syscall.WaitStatus
}

// SetStart stores the current time in [RunState] once.
func (rs *RunState) SetStart() {
	if rs.Time != nil {
		panic("attempted to store time twice")
	}
	now := time.Now().UTC()
	rs.Time = &now
}

// Paths contains environment-dependent paths used by hakurei.
type Paths struct {
	// path to shared directory (usually `/tmp/hakurei.%d`)
	SharePath string `json:"share_path"`
	// XDG_RUNTIME_DIR value (usually `/run/user/%d`)
	RuntimePath string `json:"runtime_path"`
	// application runtime directory (usually `/run/user/%d/hakurei`)
	RunDirPath string `json:"run_dir_path"`
}