diff options
Diffstat (limited to 'internal/state')
| -rw-r--r-- | internal/state/enablement.go | 34 | ||||
| -rw-r--r-- | internal/state/exit.go | 2 | ||||
| -rw-r--r-- | internal/state/register.go | 7 | ||||
| -rw-r--r-- | internal/state/track.go | 57 |
4 files changed, 86 insertions, 14 deletions
diff --git a/internal/state/enablement.go b/internal/state/enablement.go new file mode 100644 index 00000000..9358f432 --- /dev/null +++ b/internal/state/enablement.go @@ -0,0 +1,34 @@ +package state + +type ( + Enablement uint8 + Enablements uint64 +) + +const ( + EnableWayland Enablement = iota + EnableX + EnableDBus + EnablePulse + + enableLength +) + +var enablementString = [enableLength]string{ + "Wayland", + "X11", + "D-Bus", + "PulseAudio", +} + +func (e Enablement) String() string { + return enablementString[e] +} + +func (e Enablement) Mask() Enablements { + return 1 << e +} + +func (es Enablements) Has(e Enablement) bool { + return es&e.Mask() != 0 +} diff --git a/internal/state/exit.go b/internal/state/exit.go index e0e2c04a..3da1f48e 100644 --- a/internal/state/exit.go +++ b/internal/state/exit.go @@ -33,7 +33,7 @@ func BeforeExit() { } } - if d, err := readLaunchers(); err != nil { + if d, err := readLaunchers(u.Uid); err != nil { fmt.Println("Error reading active launchers:", err) os.Exit(1) } else if len(d) > 0 { diff --git a/internal/state/register.go b/internal/state/register.go index 2fff565e..25c22894 100644 --- a/internal/state/register.go +++ b/internal/state/register.go @@ -4,6 +4,13 @@ func RegisterRevertPath(p string) { cleanupCandidate = append(cleanupCandidate, p) } +func RegisterEnablement(e Enablements) { + if enablements != nil { + panic("enablement state set twice") + } + enablements = &e +} + func XcbActionComplete() { if xcbActionComplete { Fatal("xcb inserted twice") diff --git a/internal/state/track.go b/internal/state/track.go index 913d684d..96e9353d 100644 --- a/internal/state/track.go +++ b/internal/state/track.go @@ -10,6 +10,8 @@ import ( "os/exec" "path" "strconv" + "strings" + "text/tabwriter" "git.ophivana.moe/cat/fortify/internal/system" ) @@ -22,13 +24,15 @@ var ( statePath string cleanupCandidate []string xcbActionComplete bool + enablements *Enablements ) type launcherState struct { - PID int - Launcher string - Argv []string - Command []string + PID int + Launcher string + Argv []string + Command []string + Capability Enablements } func init() { @@ -40,15 +44,41 @@ func Early() { return } - launchers, err := readLaunchers() + launchers, err := readLaunchers(u.Uid) if err != nil { fmt.Println("Error reading launchers:", err) os.Exit(1) } - fmt.Println("\tPID\tLauncher") + stdout := tabwriter.NewWriter(os.Stdout, 0, 1, 4, ' ', 0) + if !system.V.Verbose { + _, _ = fmt.Fprintln(stdout, "\tPID\tEnablements\tLauncher\tCommand") + } else { + _, _ = fmt.Fprintln(stdout, "\tPID\tArgv") + } + for _, state := range launchers { - fmt.Printf("\t%d\t%s\nCommand: %s\nArgv: %s\n", state.PID, state.Launcher, state.Command, state.Argv) + enablementsDescription := strings.Builder{} + for i := Enablement(0); i < enableLength; i++ { + if state.Capability.Has(i) { + enablementsDescription.WriteString(", " + i.String()) + } + } + if enablementsDescription.Len() == 0 { + enablementsDescription.WriteString("none") + } + + if !system.V.Verbose { + _, _ = fmt.Fprintf(stdout, "\t%d\t%s\t%s\t%s\n", + state.PID, strings.TrimPrefix(enablementsDescription.String(), ", "), state.Launcher, + state.Command) + } else { + _, _ = fmt.Fprintf(stdout, "\t%d\t%s\n", + state.PID, state.Argv) + } + } + if err = stdout.Flush(); err != nil { + fmt.Println("warn: error formatting output:", err) } os.Exit(0) @@ -58,10 +88,11 @@ func Early() { func SaveProcess(uid string, cmd *exec.Cmd) error { statePath = path.Join(system.V.RunDir, uid, strconv.Itoa(cmd.Process.Pid)) state := launcherState{ - PID: cmd.Process.Pid, - Launcher: cmd.Path, - Argv: cmd.Args, - Command: command, + PID: cmd.Process.Pid, + Launcher: cmd.Path, + Argv: cmd.Args, + Command: command, + Capability: *enablements, } if err := os.Mkdir(path.Join(system.V.RunDir, uid), 0700); err != nil && !errors.Is(err, fs.ErrExist) { @@ -81,10 +112,10 @@ func SaveProcess(uid string, cmd *exec.Cmd) error { } } -func readLaunchers() ([]*launcherState, error) { +func readLaunchers(uid string) ([]*launcherState, error) { var f *os.File var r []*launcherState - launcherPrefix := path.Join(system.V.RunDir, u.Uid) + launcherPrefix := path.Join(system.V.RunDir, uid) if pl, err := os.ReadDir(launcherPrefix); err != nil { return nil, err |
