diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-10-14 01:33:44 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-10-14 01:33:44 +0900 |
| commit | 790d77075e40ee3162d7925e983f01747b5c2c89 (patch) | |
| tree | 56a59641aa87a40c9b28600ff8bd5d5642d95f5e /system | |
| parent | e5ff40e7d32d28cace183cd2c80f40f142855ff5 (diff) | |
system/dbus: remove builder state leak
This enables external testing of system.I state.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'system')
| -rw-r--r-- | system/dbus.go | 21 | ||||
| -rw-r--r-- | system/dbus/dbus.go | 48 | ||||
| -rw-r--r-- | system/dbus_test.go | 35 | ||||
| -rw-r--r-- | system/dispatcher.go | 6 | ||||
| -rw-r--r-- | system/dispatcher_test.go | 6 |
5 files changed, 62 insertions, 54 deletions
diff --git a/system/dbus.go b/system/dbus.go index 1cc24a22..424f9dfa 100644 --- a/system/dbus.go +++ b/system/dbus.go @@ -12,18 +12,19 @@ import ( "syscall" "hakurei.app/container" - "hakurei.app/container/check" "hakurei.app/hst" "hakurei.app/system/dbus" ) -var ( - ErrDBusConfig = errors.New("dbus config not supplied") -) +// ErrDBusConfig is returned when a required [hst.BusConfig] argument is nil. +var ErrDBusConfig = errors.New("dbus config not supplied") // MustProxyDBus calls ProxyDBus and panics if an error is returned. -func (sys *I) MustProxyDBus(sessionPath *check.Absolute, session *hst.BusConfig, systemPath *check.Absolute, system *hst.BusConfig) *I { - if err := sys.ProxyDBus(session, system, sessionPath, systemPath); err != nil { +func (sys *I) MustProxyDBus( + session, system *hst.BusConfig, + sessionBus, systemBus dbus.ProxyPair, +) *I { + if err := sys.ProxyDBus(session, system, sessionBus, systemBus); err != nil { panic(err.Error()) } else { return sys @@ -32,7 +33,10 @@ func (sys *I) MustProxyDBus(sessionPath *check.Absolute, session *hst.BusConfig, // ProxyDBus finalises configuration ahead of time and starts xdg-dbus-proxy via [dbus] and terminates it on revert. // This [Op] is always [Process] scoped. -func (sys *I) ProxyDBus(session, system *hst.BusConfig, sessionPath, systemPath *check.Absolute) error { +func (sys *I) ProxyDBus( + session, system *hst.BusConfig, + sessionBus, systemBus dbus.ProxyPair, +) error { d := new(dbusProxyOp) // session bus is required as otherwise this is effectively a very expensive noop @@ -44,9 +48,6 @@ func (sys *I) ProxyDBus(session, system *hst.BusConfig, sessionPath, systemPath // system bus is optional d.system = system != nil - var sessionBus, systemBus dbus.ProxyPair - sessionBus[0], systemBus[0] = sys.dbusAddress() - sessionBus[1], systemBus[1] = sessionPath.String(), systemPath.String() d.out = &linePrefixWriter{println: log.Println, prefix: "(dbus) ", buf: new(strings.Builder)} if final, err := sys.dbusFinalise(sessionBus, systemBus, session, system); err != nil { if errors.Is(err, syscall.EINVAL) { diff --git a/system/dbus/dbus.go b/system/dbus/dbus.go index 08db8f1b..9ea89f51 100644 --- a/system/dbus/dbus.go +++ b/system/dbus/dbus.go @@ -8,27 +8,31 @@ import ( ) const ( - /*SessionBusAddress is the name of the environment variable where the address of the login session message bus is given in. + /* + SessionBusAddress is the name of the environment variable where the address of the login session message bus is given in. - If that variable is not set, applications may also try to read the address from the X Window System root window property _DBUS_SESSION_BUS_ADDRESS. - The root window property must have type STRING. The environment variable should have precedence over the root window property. + If that variable is not set, applications may also try to read the address from the X Window System root window property _DBUS_SESSION_BUS_ADDRESS. + The root window property must have type STRING. The environment variable should have precedence over the root window property. - The address of the login session message bus is given in the DBUS_SESSION_BUS_ADDRESS environment variable. - If DBUS_SESSION_BUS_ADDRESS is not set, or if it's set to the string "autolaunch:", - the system should use platform-specific methods of locating a running D-Bus session server, - or starting one if a running instance cannot be found. - Note that this mechanism is not recommended for attempting to determine if a daemon is running. - It is inherently racy to attempt to make this determination, since the bus daemon may be started just before or just after the determination is made. - Therefore, it is recommended that applications do not try to make this determination for their functionality purposes, and instead they should attempt to start the server. + The address of the login session message bus is given in the DBUS_SESSION_BUS_ADDRESS environment variable. + If DBUS_SESSION_BUS_ADDRESS is not set, or if it's set to the string "autolaunch:", + the system should use platform-specific methods of locating a running D-Bus session server, + or starting one if a running instance cannot be found. + Note that this mechanism is not recommended for attempting to determine if a daemon is running. + It is inherently racy to attempt to make this determination, since the bus daemon may be started just before or just after the determination is made. + Therefore, it is recommended that applications do not try to make this determination for their functionality purposes, and instead they should attempt to start the server. - This package diverges from the specification, as the caller is unlikely to be an X client, or be in a position to autolaunch a dbus server. - So a fallback address with a socket located in the well-known default XDG_RUNTIME_DIR formatting is used.*/ + This package diverges from the specification, as the caller is unlikely to be an X client, or be in a position to autolaunch a dbus server. + So a fallback address with a socket located in the well-known default XDG_RUNTIME_DIR formatting is used. + */ SessionBusAddress = "DBUS_SESSION_BUS_ADDRESS" - /*SystemBusAddress is the name of the environment variable where the address of the system message bus is given in. + /* + SystemBusAddress is the name of the environment variable where the address of the system message bus is given in. - If that variable is not set, applications should try to connect to the well-known address unix:path=/var/run/dbus/system_bus_socket. - Implementations of the well-known system bus should listen on an address that will result in that connection being successful.*/ + If that variable is not set, applications should try to connect to the well-known address unix:path=/var/run/dbus/system_bus_socket. + Implementations of the well-known system bus should listen on an address that will result in that connection being successful. + */ SystemBusAddress = "DBUS_SYSTEM_BUS_ADDRESS" // FallbackSystemBusAddress is used when [SystemBusAddress] is not set. @@ -36,28 +40,30 @@ const ( ) var ( - addresses [2]string + address [2]string addressOnce sync.Once ) +// Address returns the session and system bus addresses copied from environment, +// or appropriate fallback values if they are not set. func Address() (session, system string) { addressOnce.Do(func() { // resolve upstream session bus address if addr, ok := os.LookupEnv(SessionBusAddress); !ok { // fall back to default format - addresses[0] = fmt.Sprintf("unix:path=/run/user/%d/bus", os.Getuid()) + address[0] = fmt.Sprintf("unix:path=/run/user/%d/bus", os.Getuid()) } else { - addresses[0] = addr + address[0] = addr } // resolve upstream system bus address if addr, ok := os.LookupEnv(SystemBusAddress); !ok { // fall back to default hardcoded value - addresses[1] = FallbackSystemBusAddress + address[1] = FallbackSystemBusAddress } else { - addresses[1] = addr + address[1] = addr } }) - return addresses[0], addresses[1] + return address[0], address[1] } diff --git a/system/dbus_test.go b/system/dbus_test.go index 2a1f12db..a346711e 100644 --- a/system/dbus_test.go +++ b/system/dbus_test.go @@ -85,7 +85,7 @@ func TestDBusProxyOp(t *testing.T) { Op: "dbus", Err: ErrDBusConfig, Msg: "attempted to create message bus proxy args without session bus config", } - if err := sys.ProxyDBus(nil, new(hst.BusConfig), nil, nil); !reflect.DeepEqual(err, wantErr) { + if err := sys.ProxyDBus(nil, new(hst.BusConfig), dbus.ProxyPair{}, dbus.ProxyPair{}); !reflect.DeepEqual(err, wantErr) { t.Errorf("ProxyDBus: error = %v, want %v", err, wantErr) } }, nil, stub.Expect{}}, @@ -99,15 +99,20 @@ func TestDBusProxyOp(t *testing.T) { }() sys.MustProxyDBus( - m("/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"), &hst.BusConfig{ + &hst.BusConfig{ // use impossible value here as an implicit assert that it goes through the stub Talk: []string{"session\x00"}, Filter: true, - }, m("/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"), &hst.BusConfig{ + }, &hst.BusConfig{ // use impossible value here as an implicit assert that it goes through the stub Talk: []string{"system\x00"}, Filter: true, + }, dbus.ProxyPair{ + "unix:path=/run/user/1000/bus", + "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", + }, dbus.ProxyPair{ + "unix:path=/run/dbus/system_bus_socket", + "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", }) }, nil, stub.Expect{Calls: []stub.Call{ - call("dbusAddress", stub.ExpectArgs{}, [2]string{"unix:path=/run/user/1000/bus", "unix:path=/run/dbus/system_bus_socket"}, nil), call("dbusFinalise", stub.ExpectArgs{ dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"}, dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"}, @@ -128,13 +133,16 @@ func TestDBusProxyOp(t *testing.T) { }, &hst.BusConfig{ // use impossible value here as an implicit assert that it goes through the stub Talk: []string{"system\x00"}, Filter: true, - }, - m("/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"), - m("/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket")); !reflect.DeepEqual(err, wantErr) { + }, dbus.ProxyPair{ + "unix:path=/run/user/1000/bus", + "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", + }, dbus.ProxyPair{ + "unix:path=/run/dbus/system_bus_socket", + "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", + }); !reflect.DeepEqual(err, wantErr) { t.Errorf("ProxyDBus: error = %v", err) } }, nil, stub.Expect{Calls: []stub.Call{ - call("dbusAddress", stub.ExpectArgs{}, [2]string{"unix:path=/run/user/1000/bus", "unix:path=/run/dbus/system_bus_socket"}, nil), call("dbusFinalise", stub.ExpectArgs{ dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"}, dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"}, @@ -145,12 +153,18 @@ func TestDBusProxyOp(t *testing.T) { {"full", 0xcafebabe, func(_ *testing.T, sys *I) { sys.MustProxyDBus( - m("/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"), &hst.BusConfig{ + &hst.BusConfig{ // use impossible value here as an implicit assert that it goes through the stub Talk: []string{"session\x00"}, Filter: true, - }, m("/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"), &hst.BusConfig{ + }, &hst.BusConfig{ // use impossible value here as an implicit assert that it goes through the stub Talk: []string{"system\x00"}, Filter: true, + }, dbus.ProxyPair{ + "unix:path=/run/user/1000/bus", + "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", + }, dbus.ProxyPair{ + "unix:path=/run/dbus/system_bus_socket", + "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", }) }, []Op{ &dbusProxyOp{ @@ -158,7 +172,6 @@ func TestDBusProxyOp(t *testing.T) { system: true, }, }, stub.Expect{Calls: []stub.Call{ - call("dbusAddress", stub.ExpectArgs{}, [2]string{"unix:path=/run/user/1000/bus", "unix:path=/run/dbus/system_bus_socket"}, nil), call("dbusFinalise", stub.ExpectArgs{ dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"}, dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"}, diff --git a/system/dispatcher.go b/system/dispatcher.go index 3f17dc1a..cdc95072 100644 --- a/system/dispatcher.go +++ b/system/dispatcher.go @@ -48,8 +48,6 @@ type syscallDispatcher interface { // xcbChangeHosts provides [xcb.ChangeHosts]. xcbChangeHosts(mode xcb.HostMode, family xcb.Family, address string) error - // dbusAddress provides [dbus.Address]. - dbusAddress() (session, system string) // dbusFinalise provides [dbus.Finalise]. dbusFinalise(sessionBus, systemBus dbus.ProxyPair, session, system *hst.BusConfig) (final *dbus.Final, err error) // dbusProxyStart provides the Start method of [dbus.Proxy]. @@ -82,10 +80,6 @@ func (k direct) xcbChangeHosts(mode xcb.HostMode, family xcb.Family, address str return xcb.ChangeHosts(mode, family, address) } -func (k direct) dbusAddress() (session, system string) { - return dbus.Address() -} - func (k direct) dbusFinalise(sessionBus, systemBus dbus.ProxyPair, session, system *hst.BusConfig) (final *dbus.Final, err error) { return dbus.Finalise(sessionBus, systemBus, session, system) } diff --git a/system/dispatcher_test.go b/system/dispatcher_test.go index 5edc2751..fd6e5d09 100644 --- a/system/dispatcher_test.go +++ b/system/dispatcher_test.go @@ -276,12 +276,6 @@ func (k *kstub) xcbChangeHosts(mode xcb.HostMode, family xcb.Family, address str stub.CheckArg(k.Stub, "address", address, 2)) } -func (k *kstub) dbusAddress() (session, system string) { - k.Helper() - ret := k.Expects("dbusAddress").Ret.([2]string) - return ret[0], ret[1] -} - func (k *kstub) dbusFinalise(sessionBus, systemBus dbus.ProxyPair, session, system *hst.BusConfig) (final *dbus.Final, err error) { k.Helper() expect := k.Expects("dbusFinalise") |
