From a91920310d20e1fc472dea044fce8fd9438835df Mon Sep 17 00:00:00 2001 From: Ophestra Date: Sat, 15 Nov 2025 13:47:09 +0900 Subject: internal: relocate packages Signed-off-by: Ophestra --- internal/dbus/proxy.go | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 internal/dbus/proxy.go (limited to 'internal/dbus/proxy.go') diff --git a/internal/dbus/proxy.go b/internal/dbus/proxy.go new file mode 100644 index 00000000..9de49c41 --- /dev/null +++ b/internal/dbus/proxy.go @@ -0,0 +1,105 @@ +package dbus + +import ( + "context" + "io" + "sync" + "syscall" + + "hakurei.app/hst" + "hakurei.app/internal/helper" + "hakurei.app/message" +) + +// ProxyName is the file name or path to the proxy program. +// Overriding ProxyName will only affect Proxy instance created after the change. +var ProxyName = "xdg-dbus-proxy" + +// Proxy holds the state of a xdg-dbus-proxy process, and should never be copied. +type Proxy struct { + helper helper.Helper + ctx context.Context + msg message.Msg + + cancel context.CancelCauseFunc + cause func() error + + final *Final + output io.Writer + useSandbox bool + + name string + + mu, pmu sync.RWMutex +} + +func (p *Proxy) String() string { + if p == nil { + return "(invalid dbus proxy)" + } + + p.mu.RLock() + defer p.mu.RUnlock() + + if p.helper != nil { + return p.helper.String() + } + + return "(unused dbus proxy)" +} + +// Final describes the outcome of a proxy configuration. +type Final struct { + Session, System ProxyPair + // parsed upstream address + SessionUpstream, SystemUpstream []AddrEntry + io.WriterTo +} + +// Finalise creates a checked argument writer for [Proxy]. +func Finalise(sessionBus, systemBus ProxyPair, session, system *hst.BusConfig) (final *Final, err error) { + if session == nil && system == nil { + return nil, syscall.EBADE + } + + var args []string + if session != nil { + if err = session.CheckInterfaces("session"); err != nil { + return + } + args = append(args, Args(session, sessionBus)...) + } + if system != nil { + if err = system.CheckInterfaces("system"); err != nil { + return + } + args = append(args, Args(system, systemBus)...) + } + + final = &Final{Session: sessionBus, System: systemBus} + + final.WriterTo, err = helper.NewCheckedArgs(args...) + if err != nil { + return + } + + if session != nil { + final.SessionUpstream, err = Parse([]byte(final.Session[0])) + if err != nil { + return + } + } + if system != nil { + final.SystemUpstream, err = Parse([]byte(final.System[0])) + if err != nil { + return + } + } + + return +} + +// New returns a new instance of [Proxy]. +func New(ctx context.Context, msg message.Msg, final *Final, output io.Writer) *Proxy { + return &Proxy{name: ProxyName, ctx: ctx, msg: msg, final: final, output: output, useSandbox: true} +} -- cgit v1.3.1