diff options
Diffstat (limited to 'internal/system/xhost.go')
| -rw-r--r-- | internal/system/xhost.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/internal/system/xhost.go b/internal/system/xhost.go new file mode 100644 index 00000000..27e60c2b --- /dev/null +++ b/internal/system/xhost.go @@ -0,0 +1,38 @@ +package system + +import ( + "hakurei.app/hst" + "hakurei.app/internal/system/xcb" +) + +// ChangeHosts inserts the target user into X11 hosts and deletes it once its [Enablement] is no longer satisfied. +func (sys *I) ChangeHosts(username string) *I { + sys.ops = append(sys.ops, xhostOp(username)) + return sys +} + +// xhostOp implements [I.ChangeHosts]. +type xhostOp string + +func (x xhostOp) Type() hst.Enablement { return hst.EX11 } + +func (x xhostOp) apply(sys *I) error { + sys.msg.Verbosef("inserting entry %s to X11", x) + return newOpError("xhost", + sys.xcbChangeHosts(xcb.HostModeInsert, xcb.FamilyServerInterpreted, "localuser\x00"+string(x)), false) +} + +func (x xhostOp) revert(sys *I, ec *Criteria) error { + if ec.hasType(x.Type()) { + sys.msg.Verbosef("deleting entry %s from X11", x) + return newOpError("xhost", + sys.xcbChangeHosts(xcb.HostModeDelete, xcb.FamilyServerInterpreted, "localuser\x00"+string(x)), true) + } else { + sys.msg.Verbosef("skipping entry %s in X11", x) + return nil + } +} + +func (x xhostOp) Is(o Op) bool { target, ok := o.(xhostOp); return ok && x == target } +func (x xhostOp) Path() string { return "/tmp/.X11-unix" } +func (x xhostOp) String() string { return string("SI:localuser:" + x) } |
