All checks were successful
Test / Create distribution (push) Successful in 35s
Test / Sandbox (push) Successful in 2m18s
Test / Hakurei (push) Successful in 3m17s
Test / Sandbox (race detector) (push) Successful in 4m7s
Test / Hpkg (push) Successful in 4m13s
Test / Hakurei (race detector) (push) Successful in 5m3s
Test / Flake checks (push) Successful in 1m40s
These packages are highly specific to hakurei and are difficult to use safely from other pieces of code. Their exported symbols are made available until v0.4.0 where they will be removed for #24. Signed-off-by: Ophestra <cat@gensokyo.uk>
106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
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}
|
|
}
|