diff options
Diffstat (limited to 'internal/app/spdbus.go')
| -rw-r--r-- | internal/app/spdbus.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/internal/app/spdbus.go b/internal/app/spdbus.go new file mode 100644 index 00000000..42d523dd --- /dev/null +++ b/internal/app/spdbus.go @@ -0,0 +1,50 @@ +package app + +import ( + "hakurei.app/container" + "hakurei.app/hst" + "hakurei.app/system/acl" + "hakurei.app/system/dbus" +) + +// spDBusOp maintains an xdg-dbus-proxy instance for the container. +type spDBusOp struct { + // Whether to bind the system bus socket. + // Populated during toSystem. + ProxySystem bool +} + +func (s *spDBusOp) toSystem(state *outcomeStateSys, config *hst.Config) error { + if config.SessionBus == nil { + config.SessionBus = dbus.NewConfig(config.ID, true, true) + } + + // downstream socket paths + sessionPath, systemPath := state.instance().Append("bus"), state.instance().Append("system_bus_socket") + + if err := state.sys.ProxyDBus( + config.SessionBus, config.SystemBus, + sessionPath, systemPath, + ); err != nil { + return err + } + + state.sys.UpdatePerm(sessionPath, acl.Read, acl.Write) + if config.SystemBus != nil { + s.ProxySystem = true + state.sys.UpdatePerm(systemPath, acl.Read, acl.Write) + } + return nil +} + +func (s *spDBusOp) toContainer(state *outcomeStateParams) error { + sessionInner := state.runtimeDir.Append("bus") + state.env["DBUS_SESSION_BUS_ADDRESS"] = "unix:path=" + sessionInner.String() + state.params.Bind(state.instancePath().Append("bus"), sessionInner, 0) + if s.ProxySystem { + systemInner := container.AbsFHSRun.Append("dbus/system_bus_socket") + state.env["DBUS_SYSTEM_BUS_ADDRESS"] = "unix:path=" + systemInner.String() + state.params.Bind(state.instancePath().Append("system_bus_socket"), systemInner, 0) + } + return nil +} |
