All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 34s
				
			Test / Sandbox (push) Successful in 1m30s
				
			Test / Hakurei (push) Successful in 2m21s
				
			Test / Hpkg (push) Successful in 3m23s
				
			Test / Sandbox (race detector) (push) Successful in 4m1s
				
			Test / Hakurei (race detector) (push) Successful in 4m46s
				
			Test / Flake checks (push) Successful in 1m27s
				
			This package turns out to be much less widely used than anticipated, and might be facing removal. This change makes test cases cleaner. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package dbus
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"io"
 | |
| 	"sync"
 | |
| 	"syscall"
 | |
| 
 | |
| 	"hakurei.app/helper"
 | |
| 	"hakurei.app/hst"
 | |
| 	"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}
 | |
| }
 |