Merge pull request #2242 from AkihiroSuda/vendor-systemd

vendor: update go-systemd and godbus
This commit is contained in:
Akihiro Suda
2020-03-25 02:40:22 +09:00
committed by GitHub
65 changed files with 435 additions and 238 deletions

4
go.mod
View File

@@ -6,10 +6,10 @@ require (
github.com/checkpoint-restore/go-criu v0.0.0-20181120144056-17b0214f6c48 github.com/checkpoint-restore/go-criu v0.0.0-20181120144056-17b0214f6c48
github.com/cilium/ebpf v0.0.0-20191025125908-95b36a581eed github.com/cilium/ebpf v0.0.0-20191025125908-95b36a581eed
github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50 github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e github.com/coreos/go-systemd/v22 v22.0.0
github.com/cyphar/filepath-securejoin v0.2.2 github.com/cyphar/filepath-securejoin v0.2.2
github.com/docker/go-units v0.3.3 github.com/docker/go-units v0.3.3
github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f github.com/godbus/dbus/v5 v5.0.3
github.com/golang/protobuf v1.0.0 github.com/golang/protobuf v1.0.0
github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618 github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559 github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559

8
go.sum
View File

@@ -4,16 +4,16 @@ github.com/cilium/ebpf v0.0.0-20191025125908-95b36a581eed h1:/UgmF+cZTm9kp4uJ122
github.com/cilium/ebpf v0.0.0-20191025125908-95b36a581eed/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20191025125908-95b36a581eed/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50 h1:WMpHmC6AxwWb9hMqhudkqG7A/p14KiMnl6d3r1iUMjU= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50 h1:WMpHmC6AxwWb9hMqhudkqG7A/p14KiMnl6d3r1iUMjU=
github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg=
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f h1:zlOR3rOlPAVvtfuxGKoghCmop5B0TRyu/ZieziZuGiM= github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME=
github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang/protobuf v1.0.0 h1:lsek0oXi8iFE9L+EXARyHIjU5rlWIhhTkjDz3vHhWWQ= github.com/golang/protobuf v1.0.0 h1:lsek0oXi8iFE9L+EXARyHIjU5rlWIhhTkjDz3vHhWWQ=
github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=

View File

@@ -13,8 +13,8 @@ import (
"sync" "sync"
"time" "time"
systemdDbus "github.com/coreos/go-systemd/dbus" systemdDbus "github.com/coreos/go-systemd/v22/dbus"
"github.com/godbus/dbus" dbus "github.com/godbus/dbus/v5"
"github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/cgroups/fs" "github.com/opencontainers/runc/libcontainer/cgroups/fs"
"github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs"

View File

@@ -12,7 +12,7 @@ import (
"sync" "sync"
"time" "time"
systemdDbus "github.com/coreos/go-systemd/dbus" systemdDbus "github.com/coreos/go-systemd/v22/dbus"
"github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/cgroups/fs2" "github.com/opencontainers/runc/libcontainer/cgroups/fs2"
"github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs"

View File

@@ -1,7 +1,7 @@
package configs package configs
import ( import (
systemdDbus "github.com/coreos/go-systemd/dbus" systemdDbus "github.com/coreos/go-systemd/v22/dbus"
) )
type FreezerState string type FreezerState string

View File

@@ -13,8 +13,8 @@ import (
"strings" "strings"
"time" "time"
systemdDbus "github.com/coreos/go-systemd/dbus" systemdDbus "github.com/coreos/go-systemd/v22/dbus"
"github.com/godbus/dbus" dbus "github.com/godbus/dbus/v5"
"github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs"
"github.com/opencontainers/runc/libcontainer/seccomp" "github.com/opencontainers/runc/libcontainer/seccomp"

View File

@@ -9,7 +9,7 @@ import (
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"github.com/godbus/dbus" dbus "github.com/godbus/dbus/v5"
"github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs"
"github.com/opencontainers/runc/libcontainer/configs/validate" "github.com/opencontainers/runc/libcontainer/configs/validate"
"github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/runtime-spec/specs-go"

View File

@@ -19,7 +19,7 @@ import (
"github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/runtime-spec/specs-go"
selinux "github.com/opencontainers/selinux/go-selinux" selinux "github.com/opencontainers/selinux/go-selinux"
"github.com/coreos/go-systemd/activation" "github.com/coreos/go-systemd/v22/activation"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli"

View File

@@ -67,7 +67,7 @@ func TLSListeners(tlsConfig *tls.Config) ([]net.Listener, error) {
return nil, err return nil, err
} }
if tlsConfig != nil && err == nil { if tlsConfig != nil {
for i, l := range listeners { for i, l := range listeners {
// Activate TLS only for TCP sockets // Activate TLS only for TCP sockets
if l.Addr().Network() == "tcp" { if l.Addr().Network() == "tcp" {
@@ -88,7 +88,7 @@ func TLSListenersWithNames(tlsConfig *tls.Config) (map[string][]net.Listener, er
return nil, err return nil, err
} }
if tlsConfig != nil && err == nil { if tlsConfig != nil {
for _, ll := range listeners { for _, ll := range listeners {
// Activate TLS only for TCP sockets // Activate TLS only for TCP sockets
for i, l := range ll { for i, l := range ll {

View File

@@ -23,7 +23,7 @@ import (
"strings" "strings"
"sync" "sync"
"github.com/godbus/dbus" "github.com/godbus/dbus/v5"
) )
const ( const (

View File

@@ -20,7 +20,7 @@ import (
"path" "path"
"strconv" "strconv"
"github.com/godbus/dbus" "github.com/godbus/dbus/v5"
) )
func (c *Conn) jobComplete(signal *dbus.Signal) { func (c *Conn) jobComplete(signal *dbus.Signal) {
@@ -197,6 +197,12 @@ func (c *Conn) GetUnitPathProperties(path dbus.ObjectPath) (map[string]interface
return c.getProperties(path, "org.freedesktop.systemd1.Unit") return c.getProperties(path, "org.freedesktop.systemd1.Unit")
} }
// GetAllProperties takes the (unescaped) unit name and returns all of its dbus object properties.
func (c *Conn) GetAllProperties(unit string) (map[string]interface{}, error) {
path := unitPath(unit)
return c.getProperties(path, "")
}
func (c *Conn) getProperty(unit string, dbusInterface string, propertyName string) (*Property, error) { func (c *Conn) getProperty(unit string, dbusInterface string, propertyName string) (*Property, error) {
var err error var err error
var prop dbus.Variant var prop dbus.Variant

View File

@@ -15,7 +15,7 @@
package dbus package dbus
import ( import (
"github.com/godbus/dbus" "github.com/godbus/dbus/v5"
) )
// From the systemd docs: // From the systemd docs:
@@ -56,7 +56,7 @@ type execStart struct {
// http://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart= // http://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
func PropExecStart(command []string, uncleanIsFailure bool) Property { func PropExecStart(command []string, uncleanIsFailure bool) Property {
execStarts := []execStart{ execStarts := []execStart{
execStart{ {
Path: command[0], Path: command[0],
Args: command, Args: command,
UncleanIsFailure: uncleanIsFailure, UncleanIsFailure: uncleanIsFailure,

View File

@@ -19,7 +19,7 @@ import (
"log" "log"
"time" "time"
"github.com/godbus/dbus" "github.com/godbus/dbus/v5"
) )
const ( const (

View File

@@ -1,46 +0,0 @@
dist: precise
language: go
go_import_path: github.com/godbus/dbus
sudo: true
go:
- 1.7.3
- 1.8.7
- 1.9.5
- 1.10.1
- tip
env:
global:
matrix:
- TARGET=amd64
- TARGET=arm64
- TARGET=arm
- TARGET=386
- TARGET=ppc64le
matrix:
fast_finish: true
allow_failures:
- go: tip
exclude:
- go: tip
env: TARGET=arm
- go: tip
env: TARGET=arm64
- go: tip
env: TARGET=386
- go: tip
env: TARGET=ppc64le
addons:
apt:
packages:
- dbus
- dbus-x11
before_install:
script:
- go test -v -race ./... # Run all the tests with the race detector enabled
- go vet ./... # go vet is the official Go static analyzer

View File

@@ -1 +0,0 @@
module github.com/godbus/dbus

50
vendor/github.com/godbus/dbus/v5/.travis.yml generated vendored Normal file
View File

@@ -0,0 +1,50 @@
dist: bionic
language: go
go_import_path: github.com/godbus/dbus
go:
- 1.11.x
- 1.12.x
- 1.13.x
- tip
matrix:
fast_finish: true
allow_failures:
- go: tip
addons:
apt:
packages:
- dbus
- dbus-x11
before_install:
- export GO111MODULE=on
script:
- go test -v -race -mod=readonly ./... # Run all the tests with the race detector enabled
- go vet ./... # go vet is the official Go static analyzer
jobs:
include:
# The build matrix doesn't cover build stages, so manually expand
# the jobs with anchors
- &multiarch
stage: "Multiarch Test"
go: 1.11.x
env: TARGETS="386 arm arm64 ppc64le"
before_install:
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
script:
- |
set -e
for target in $TARGETS; do
printf "\e[1mRunning test suite under ${target}.\e[0m\n"
GOARCH="$target" go test -v ./...
printf "\n\n"
done
- <<: *multiarch
go: 1.12.x
- <<: *multiarch
go: 1.13.x

View File

@@ -77,7 +77,7 @@ func (conn *Conn) Auth(methods []Auth) error {
for _, m := range methods { for _, m := range methods {
if name, data, status := m.FirstData(); bytes.Equal(v, name) { if name, data, status := m.FirstData(); bytes.Equal(v, name) {
var ok bool var ok bool
err = authWriteLine(conn.transport, []byte("AUTH"), []byte(v), data) err = authWriteLine(conn.transport, []byte("AUTH"), v, data)
if err != nil { if err != nil {
return err return err
} }
@@ -127,7 +127,7 @@ func (conn *Conn) Auth(methods []Auth) error {
// tryAuth tries to authenticate with m as the mechanism, using state as the // tryAuth tries to authenticate with m as the mechanism, using state as the
// initial authState and in for reading input. It returns (nil, true) on // initial authState and in for reading input. It returns (nil, true) on
// success, (nil, false) on a REJECTED and (someErr, false) if some other // success, (nil, false) on a REJECTED and (someErr, false) if some other
// error occured. // error occurred.
func (conn *Conn) tryAuth(m Auth, state authState, in *bufio.Reader) (error, bool) { func (conn *Conn) tryAuth(m Auth, state authState, in *bufio.Reader) (error, bool) {
for { for {
s, err := authReadLine(in) s, err := authReadLine(in)

View File

@@ -60,7 +60,7 @@ func (a authCookieSha1) HandleData(data []byte) ([]byte, AuthStatus) {
// getCookie searches for the cookie identified by id in context and returns // getCookie searches for the cookie identified by id in context and returns
// the cookie content or nil. (Since HandleData can't return a specific error, // the cookie content or nil. (Since HandleData can't return a specific error,
// but only whether an error occured, this function also doesn't bother to // but only whether an error occurred, this function also doesn't bother to
// return an error.) // return an error.)
func (a authCookieSha1) getCookie(context, id []byte) []byte { func (a authCookieSha1) getCookie(context, id []byte) []byte {
file, err := os.Open(a.home + "/.dbus-keyrings/" + string(context)) file, err := os.Open(a.home + "/.dbus-keyrings/" + string(context))

View File

@@ -5,7 +5,6 @@ import (
"errors" "errors"
"io" "io"
"os" "os"
"reflect"
"strings" "strings"
"sync" "sync"
) )
@@ -31,6 +30,12 @@ var ErrClosed = errors.New("dbus: connection closed by user")
type Conn struct { type Conn struct {
transport transport
ctx context.Context
cancelCtx context.CancelFunc
closeOnce sync.Once
closeErr error
busObj BusObject busObj BusObject
unixFD bool unixFD bool
uuid string uuid string
@@ -38,6 +43,8 @@ type Conn struct {
handler Handler handler Handler
signalHandler SignalHandler signalHandler SignalHandler
serialGen SerialGenerator serialGen SerialGenerator
inInt Interceptor
outInt Interceptor
names *nameTracker names *nameTracker
calls *callTracker calls *callTracker
@@ -134,6 +141,8 @@ func SystemBus() (conn *Conn, err error) {
} }
// SystemBusPrivate returns a new private connection to the system bus. // SystemBusPrivate returns a new private connection to the system bus.
// Note: this connection is not ready to use. One must perform Auth and Hello
// on the connection before it is useable.
func SystemBusPrivate(opts ...ConnOption) (*Conn, error) { func SystemBusPrivate(opts ...ConnOption) (*Conn, error) {
return Dial(getSystemBusPlatformAddress(), opts...) return Dial(getSystemBusPlatformAddress(), opts...)
} }
@@ -188,6 +197,33 @@ func WithSerialGenerator(gen SerialGenerator) ConnOption {
} }
} }
// Interceptor intercepts incoming and outgoing messages.
type Interceptor func(msg *Message)
// WithIncomingInterceptor sets the given interceptor for incoming messages.
func WithIncomingInterceptor(interceptor Interceptor) ConnOption {
return func(conn *Conn) error {
conn.inInt = interceptor
return nil
}
}
// WithOutgoingInterceptor sets the given interceptor for outgoing messages.
func WithOutgoingInterceptor(interceptor Interceptor) ConnOption {
return func(conn *Conn) error {
conn.outInt = interceptor
return nil
}
}
// WithContext overrides the default context for the connection.
func WithContext(ctx context.Context) ConnOption {
return func(conn *Conn) error {
conn.ctx = ctx
return nil
}
}
// NewConn creates a new private *Conn from an already established connection. // NewConn creates a new private *Conn from an already established connection.
func NewConn(conn io.ReadWriteCloser, opts ...ConnOption) (*Conn, error) { func NewConn(conn io.ReadWriteCloser, opts ...ConnOption) (*Conn, error) {
return newConn(genericTransport{conn}, opts...) return newConn(genericTransport{conn}, opts...)
@@ -209,6 +245,15 @@ func newConn(tr transport, opts ...ConnOption) (*Conn, error) {
return nil, err return nil, err
} }
} }
if conn.ctx == nil {
conn.ctx = context.Background()
}
conn.ctx, conn.cancelCtx = context.WithCancel(conn.ctx)
go func() {
<-conn.ctx.Done()
conn.Close()
}()
conn.calls = newCallTracker() conn.calls = newCallTracker()
if conn.handler == nil { if conn.handler == nil {
conn.handler = NewDefaultHandler() conn.handler = NewDefaultHandler()
@@ -235,6 +280,7 @@ func (conn *Conn) BusObject() BusObject {
// and the channels passed to Eavesdrop and Signal are closed. This method must // and the channels passed to Eavesdrop and Signal are closed. This method must
// not be called on shared connections. // not be called on shared connections.
func (conn *Conn) Close() error { func (conn *Conn) Close() error {
conn.closeOnce.Do(func() {
conn.outHandler.close() conn.outHandler.close()
if term, ok := conn.signalHandler.(Terminator); ok { if term, ok := conn.signalHandler.(Terminator); ok {
term.Terminate() term.Terminate()
@@ -250,12 +296,22 @@ func (conn *Conn) Close() error {
} }
conn.eavesdroppedLck.Unlock() conn.eavesdroppedLck.Unlock()
return conn.transport.Close() conn.cancelCtx()
conn.closeErr = conn.transport.Close()
})
return conn.closeErr
}
// Context returns the context associated with the connection. The
// context will be cancelled when the connection is closed.
func (conn *Conn) Context() context.Context {
return conn.ctx
} }
// Eavesdrop causes conn to send all incoming messages to the given channel // Eavesdrop causes conn to send all incoming messages to the given channel
// without further processing. Method replies, errors and signals will not be // without further processing. Method replies, errors and signals will not be
// sent to the appropiate channels and method calls will not be handled. If nil // sent to the appropriate channels and method calls will not be handled. If nil
// is passed, the normal behaviour is restored. // is passed, the normal behaviour is restored.
// //
// The caller has to make sure that ch is sufficiently buffered; // The caller has to make sure that ch is sufficiently buffered;
@@ -267,7 +323,7 @@ func (conn *Conn) Eavesdrop(ch chan<- *Message) {
conn.eavesdroppedLck.Unlock() conn.eavesdroppedLck.Unlock()
} }
// GetSerial returns an unused serial. // getSerial returns an unused serial.
func (conn *Conn) getSerial() uint32 { func (conn *Conn) getSerial() uint32 {
return conn.serialGen.GetSerial() return conn.serialGen.GetSerial()
} }
@@ -292,7 +348,7 @@ func (conn *Conn) inWorker() {
msg, err := conn.ReadMessage() msg, err := conn.ReadMessage()
if err != nil { if err != nil {
if _, ok := err.(InvalidMessageError); !ok { if _, ok := err.(InvalidMessageError); !ok {
// Some read error occured (usually EOF); we can't really do // Some read error occurred (usually EOF); we can't really do
// anything but to shut down all stuff and returns errors to all // anything but to shut down all stuff and returns errors to all
// pending replies. // pending replies.
conn.Close() conn.Close()
@@ -321,6 +377,10 @@ func (conn *Conn) inWorker() {
// Ignore it. // Ignore it.
continue continue
} }
if conn.inInt != nil {
conn.inInt(msg)
}
switch msg.Type { switch msg.Type {
case TypeError: case TypeError:
conn.serialGen.RetireSerial(conn.calls.handleDBusError(msg)) conn.serialGen.RetireSerial(conn.calls.handleDBusError(msg))
@@ -381,13 +441,10 @@ func (conn *Conn) Object(dest string, path ObjectPath) BusObject {
return &Object{conn, dest, path} return &Object{conn, dest, path}
} }
// outWorker runs in an own goroutine, encoding and sending messages that are
// sent to conn.out.
func (conn *Conn) sendMessage(msg *Message) {
conn.sendMessageAndIfClosed(msg, func() {})
}
func (conn *Conn) sendMessageAndIfClosed(msg *Message, ifClosed func()) { func (conn *Conn) sendMessageAndIfClosed(msg *Message, ifClosed func()) {
if conn.outInt != nil {
conn.outInt(msg)
}
err := conn.outHandler.sendAndIfClosed(msg, ifClosed) err := conn.outHandler.sendAndIfClosed(msg, ifClosed)
conn.calls.handleSendError(msg, err) conn.calls.handleSendError(msg, err)
if err != nil { if err != nil {
@@ -483,7 +540,7 @@ func (conn *Conn) sendError(err error, dest string, serial uint32) {
if len(e.Body) > 0 { if len(e.Body) > 0 {
msg.Headers[FieldSignature] = MakeVariant(SignatureOf(e.Body...)) msg.Headers[FieldSignature] = MakeVariant(SignatureOf(e.Body...))
} }
conn.sendMessage(msg) conn.sendMessageAndIfClosed(msg, nil)
} }
// sendReply creates a method reply message corresponding to the parameters and // sendReply creates a method reply message corresponding to the parameters and
@@ -501,33 +558,54 @@ func (conn *Conn) sendReply(dest string, serial uint32, values ...interface{}) {
if len(values) > 0 { if len(values) > 0 {
msg.Headers[FieldSignature] = MakeVariant(SignatureOf(values...)) msg.Headers[FieldSignature] = MakeVariant(SignatureOf(values...))
} }
conn.sendMessage(msg) conn.sendMessageAndIfClosed(msg, nil)
} }
func (conn *Conn) defaultSignalAction(fn func(h *defaultSignalHandler, ch chan<- *Signal), ch chan<- *Signal) { // AddMatchSignal registers the given match rule to receive broadcast
if !isDefaultSignalHandler(conn.signalHandler) { // signals based on their contents.
return func (conn *Conn) AddMatchSignal(options ...MatchOption) error {
} options = append([]MatchOption{withMatchType("signal")}, options...)
handler := conn.signalHandler.(*defaultSignalHandler) return conn.busObj.Call(
fn(handler, ch) "org.freedesktop.DBus.AddMatch", 0,
formatMatchOptions(options),
).Store()
}
// RemoveMatchSignal removes the first rule that matches previously registered with AddMatchSignal.
func (conn *Conn) RemoveMatchSignal(options ...MatchOption) error {
options = append([]MatchOption{withMatchType("signal")}, options...)
return conn.busObj.Call(
"org.freedesktop.DBus.RemoveMatch", 0,
formatMatchOptions(options),
).Store()
} }
// Signal registers the given channel to be passed all received signal messages. // Signal registers the given channel to be passed all received signal messages.
// The caller has to make sure that ch is sufficiently buffered; if a message
// arrives when a write to c is not possible, it is discarded.
// //
// Multiple of these channels can be registered at the same time. // Multiple of these channels can be registered at the same time.
// //
// These channels are "overwritten" by Eavesdrop; i.e., if there currently is a // These channels are "overwritten" by Eavesdrop; i.e., if there currently is a
// channel for eavesdropped messages, this channel receives all signals, and // channel for eavesdropped messages, this channel receives all signals, and
// none of the channels passed to Signal will receive any signals. // none of the channels passed to Signal will receive any signals.
//
// Panics if the signal handler is not a `SignalRegistrar`.
func (conn *Conn) Signal(ch chan<- *Signal) { func (conn *Conn) Signal(ch chan<- *Signal) {
conn.defaultSignalAction((*defaultSignalHandler).addSignal, ch) handler, ok := conn.signalHandler.(SignalRegistrar)
if !ok {
panic("cannot use this method with a non SignalRegistrar handler")
}
handler.AddSignal(ch)
} }
// RemoveSignal removes the given channel from the list of the registered channels. // RemoveSignal removes the given channel from the list of the registered channels.
//
// Panics if the signal handler is not a `SignalRegistrar`.
func (conn *Conn) RemoveSignal(ch chan<- *Signal) { func (conn *Conn) RemoveSignal(ch chan<- *Signal) {
conn.defaultSignalAction((*defaultSignalHandler).removeSignal, ch) handler, ok := conn.signalHandler.(SignalRegistrar)
if !ok {
panic("cannot use this method with a non SignalRegistrar handler")
}
handler.RemoveSignal(ch)
} }
// SupportsUnixFDs returns whether the underlying transport supports passing of // SupportsUnixFDs returns whether the underlying transport supports passing of
@@ -614,18 +692,6 @@ func getTransport(address string) (transport, error) {
return nil, err return nil, err
} }
// dereferenceAll returns a slice that, assuming that vs is a slice of pointers
// of arbitrary types, containes the values that are obtained from dereferencing
// all elements in vs.
func dereferenceAll(vs []interface{}) []interface{} {
for i := range vs {
v := reflect.ValueOf(vs[i])
v = v.Elem()
vs[i] = v.Interface()
}
return vs
}
// getKey gets a key from a the list of keys. Returns "" on error / not found... // getKey gets a key from a the list of keys. Returns "" on error / not found...
func getKey(s, key string) string { func getKey(s, key string) string {
for _, keyEqualsValue := range strings.Split(s, ",") { for _, keyEqualsValue := range strings.Split(s, ",") {
@@ -650,7 +716,9 @@ func (h *outputHandler) sendAndIfClosed(msg *Message, ifClosed func()) error {
h.closed.lck.RLock() h.closed.lck.RLock()
defer h.closed.lck.RUnlock() defer h.closed.lck.RUnlock()
if h.closed.isClosed { if h.closed.isClosed {
if ifClosed != nil {
ifClosed() ifClosed()
}
return nil return nil
} }
h.sendLck.Lock() h.sendLck.Lock()
@@ -801,7 +869,6 @@ func (tracker *callTracker) finalize(sn uint32) {
delete(tracker.calls, sn) delete(tracker.calls, sn)
c.ContextCancel() c.ContextCancel()
} }
return
} }
func (tracker *callTracker) finalizeWithBody(sn uint32, body []interface{}) { func (tracker *callTracker) finalizeWithBody(sn uint32, body []interface{}) {
@@ -815,7 +882,6 @@ func (tracker *callTracker) finalizeWithBody(sn uint32, body []interface{}) {
c.Body = body c.Body = body
c.done() c.done()
} }
return
} }
func (tracker *callTracker) finalizeWithError(sn uint32, err error) { func (tracker *callTracker) finalizeWithError(sn uint32, err error) {
@@ -829,7 +895,6 @@ func (tracker *callTracker) finalizeWithError(sn uint32, err error) {
c.Err = err c.Err = err
c.done() c.done()
} }
return
} }
func (tracker *callTracker) finalizeAllWithError(err error) { func (tracker *callTracker) finalizeAllWithError(err error) {

View File

@@ -14,8 +14,10 @@ import (
"strings" "strings"
) )
var execCommand = exec.Command
func getSessionBusPlatformAddress() (string, error) { func getSessionBusPlatformAddress() (string, error) {
cmd := exec.Command("dbus-launch") cmd := execCommand("dbus-launch")
b, err := cmd.CombinedOutput() b, err := cmd.CombinedOutput()
if err != nil { if err != nil {
@@ -25,7 +27,7 @@ func getSessionBusPlatformAddress() (string, error) {
i := bytes.IndexByte(b, '=') i := bytes.IndexByte(b, '=')
j := bytes.IndexByte(b, '\n') j := bytes.IndexByte(b, '\n')
if i == -1 || j == -1 { if i == -1 || j == -1 || i > j {
return "", errors.New("dbus: couldn't determine address of session bus") return "", errors.New("dbus: couldn't determine address of session bus")
} }

View File

@@ -4,7 +4,6 @@ package dbus
import ( import (
"os" "os"
"fmt"
) )
const defaultSystemBusAddress = "unix:path=/var/run/dbus/system_bus_socket" const defaultSystemBusAddress = "unix:path=/var/run/dbus/system_bus_socket"
@@ -12,7 +11,7 @@ const defaultSystemBusAddress = "unix:path=/var/run/dbus/system_bus_socket"
func getSystemBusPlatformAddress() string { func getSystemBusPlatformAddress() string {
address := os.Getenv("DBUS_SYSTEM_BUS_ADDRESS") address := os.Getenv("DBUS_SYSTEM_BUS_ADDRESS")
if address != "" { if address != "" {
return fmt.Sprintf("unix:path=%s", address) return address
} }
return defaultSystemBusAddress return defaultSystemBusAddress
} }

View File

@@ -87,6 +87,7 @@ func setDest(dest, src reflect.Value) error {
} }
if isVariant(src.Type()) && !isVariant(dest.Type()) { if isVariant(src.Type()) && !isVariant(dest.Type()) {
src = getVariantValue(src) src = getVariantValue(src)
return store(dest, src)
} }
if !src.Type().ConvertibleTo(dest.Type()) { if !src.Type().ConvertibleTo(dest.Type()) {
return fmt.Errorf( return fmt.Errorf(

View File

@@ -188,8 +188,14 @@ func (dec *decoder) decode(s string, depth int) interface{} {
if depth >= 64 { if depth >= 64 {
panic(FormatError("input exceeds container depth limit")) panic(FormatError("input exceeds container depth limit"))
} }
sig := s[1:]
length := dec.decode("u", depth).(uint32) length := dec.decode("u", depth).(uint32)
v := reflect.MakeSlice(reflect.SliceOf(typeFor(s[1:])), 0, int(length)) // capacity can be determined only for fixed-size element types
var capacity int
if s := sigByteSize(sig); s != 0 {
capacity = int(length) / s
}
v := reflect.MakeSlice(reflect.SliceOf(typeFor(sig)), 0, capacity)
// Even for empty arrays, the correct padding must be included // Even for empty arrays, the correct padding must be included
align := alignment(typeFor(s[1:])) align := alignment(typeFor(s[1:]))
if len(s) > 1 && s[1] == '(' { if len(s) > 1 && s[1] == '(' {
@@ -227,6 +233,51 @@ func (dec *decoder) decode(s string, depth int) interface{} {
} }
} }
// sigByteSize tries to calculates size of the given signature in bytes.
//
// It returns zero when it can't, for example when it contains non-fixed size
// types such as strings, maps and arrays that require reading of the transmitted
// data, for that we would need to implement the unread method for Decoder first.
func sigByteSize(sig string) int {
var total int
for offset := 0; offset < len(sig); {
switch sig[offset] {
case 'y':
total += 1
offset += 1
case 'n', 'q':
total += 2
offset += 1
case 'b', 'i', 'u', 'h':
total += 4
offset += 1
case 'x', 't', 'd':
total += 8
offset += 1
case '(':
i := 1
depth := 1
for i < len(sig[offset:]) && depth != 0 {
if sig[offset+i] == '(' {
depth++
} else if sig[offset+i] == ')' {
depth--
}
i++
}
s := sigByteSize(sig[offset+1 : offset+i-1])
if s == 0 {
return 0
}
total += s
offset += i
default:
return 0
}
}
return total
}
// A FormatError is an error in the wire format. // A FormatError is an error in the wire format.
type FormatError string type FormatError string

View File

@@ -47,7 +47,7 @@ func (h *defaultHandler) introspectPath(path ObjectPath) string {
subpath := make(map[string]struct{}) subpath := make(map[string]struct{})
var xml bytes.Buffer var xml bytes.Buffer
xml.WriteString("<node>") xml.WriteString("<node>")
for obj, _ := range h.objects { for obj := range h.objects {
p := string(path) p := string(path)
if p != "/" { if p != "/" {
p += "/" p += "/"
@@ -57,7 +57,7 @@ func (h *defaultHandler) introspectPath(path ObjectPath) string {
subpath[node_name] = struct{}{} subpath[node_name] = struct{}{}
} }
} }
for s, _ := range subpath { for s := range subpath {
xml.WriteString("\n\t<node name=\"" + s + "\"/>") xml.WriteString("\n\t<node name=\"" + s + "\"/>")
} }
xml.WriteString("\n</node>") xml.WriteString("\n</node>")
@@ -234,88 +234,95 @@ func (obj *exportedIntf) isFallbackInterface() bool {
// //
// Deprecated: this is the default value, don't use it, it will be unexported. // Deprecated: this is the default value, don't use it, it will be unexported.
func NewDefaultSignalHandler() *defaultSignalHandler { func NewDefaultSignalHandler() *defaultSignalHandler {
return &defaultSignalHandler{ return &defaultSignalHandler{}
closeChan: make(chan struct{}),
}
}
func isDefaultSignalHandler(handler SignalHandler) bool {
_, ok := handler.(*defaultSignalHandler)
return ok
} }
type defaultSignalHandler struct { type defaultSignalHandler struct {
sync.RWMutex mu sync.RWMutex
closed bool closed bool
signals []chan<- *Signal signals []*signalChannelData
closeChan chan struct{}
} }
func (sh *defaultSignalHandler) DeliverSignal(intf, name string, signal *Signal) { func (sh *defaultSignalHandler) DeliverSignal(intf, name string, signal *Signal) {
sh.RLock() sh.mu.RLock()
defer sh.RUnlock() defer sh.mu.RUnlock()
if sh.closed { if sh.closed {
return return
} }
for _, ch := range sh.signals { for _, scd := range sh.signals {
select { scd.deliver(signal)
case ch <- signal:
case <-sh.closeChan:
return
default:
go func() {
select {
case ch <- signal:
case <-sh.closeChan:
return
} }
}()
}
}
}
func (sh *defaultSignalHandler) Init() error {
sh.Lock()
sh.signals = make([]chan<- *Signal, 0)
sh.closeChan = make(chan struct{})
sh.Unlock()
return nil
} }
func (sh *defaultSignalHandler) Terminate() { func (sh *defaultSignalHandler) Terminate() {
sh.Lock() sh.mu.Lock()
if !sh.closed { defer sh.mu.Unlock()
close(sh.closeChan)
}
sh.closed = true
for _, ch := range sh.signals {
close(ch)
}
sh.signals = nil
sh.Unlock()
}
func (sh *defaultSignalHandler) addSignal(ch chan<- *Signal) {
sh.Lock()
defer sh.Unlock()
if sh.closed { if sh.closed {
return return
} }
sh.signals = append(sh.signals, ch)
for _, scd := range sh.signals {
scd.close()
close(scd.ch)
}
sh.closed = true
sh.signals = nil
} }
func (sh *defaultSignalHandler) removeSignal(ch chan<- *Signal) { func (sh *defaultSignalHandler) AddSignal(ch chan<- *Signal) {
sh.Lock() sh.mu.Lock()
defer sh.Unlock() defer sh.mu.Unlock()
if sh.closed {
return
}
sh.signals = append(sh.signals, &signalChannelData{
ch: ch,
done: make(chan struct{}),
})
}
func (sh *defaultSignalHandler) RemoveSignal(ch chan<- *Signal) {
sh.mu.Lock()
defer sh.mu.Unlock()
if sh.closed { if sh.closed {
return return
} }
for i := len(sh.signals) - 1; i >= 0; i-- { for i := len(sh.signals) - 1; i >= 0; i-- {
if ch == sh.signals[i] { if ch == sh.signals[i].ch {
sh.signals[i].close()
copy(sh.signals[i:], sh.signals[i+1:]) copy(sh.signals[i:], sh.signals[i+1:])
sh.signals[len(sh.signals)-1] = nil sh.signals[len(sh.signals)-1] = nil
sh.signals = sh.signals[:len(sh.signals)-1] sh.signals = sh.signals[:len(sh.signals)-1]
} }
} }
} }
type signalChannelData struct {
wg sync.WaitGroup
ch chan<- *Signal
done chan struct{}
}
func (scd *signalChannelData) deliver(signal *Signal) {
select {
case scd.ch <- signal:
case <-scd.done:
return
default:
scd.wg.Add(1)
go scd.deferredDeliver(signal)
}
}
func (scd *signalChannelData) deferredDeliver(signal *Signal) {
select {
case scd.ch <- signal:
case <-scd.done:
}
scd.wg.Done()
}
func (scd *signalChannelData) close() {
close(scd.done)
scd.wg.Wait() // wait until all spawned goroutines return
}

View File

@@ -61,7 +61,7 @@ Handling Unix file descriptors deserves special mention. To use them, you should
first check that they are supported on a connection by calling SupportsUnixFDs. first check that they are supported on a connection by calling SupportsUnixFDs.
If it returns true, all method of Connection will translate messages containing If it returns true, all method of Connection will translate messages containing
UnixFD's to messages that are accompanied by the given file descriptors with the UnixFD's to messages that are accompanied by the given file descriptors with the
UnixFD values being substituted by the correct indices. Similarily, the indices UnixFD values being substituted by the correct indices. Similarly, the indices
of incoming messages are automatically resolved. It shouldn't be necessary to use of incoming messages are automatically resolved. It shouldn't be necessary to use
UnixFDIndex. UnixFDIndex.

View File

@@ -60,7 +60,7 @@ func (enc *encoder) binwrite(v interface{}) {
} }
} }
// Encode encodes the given values to the underyling reader. All written values // Encode encodes the given values to the underlying reader. All written values
// are aligned properly as required by the D-Bus spec. // are aligned properly as required by the D-Bus spec.
func (enc *encoder) Encode(vs ...interface{}) (err error) { func (enc *encoder) Encode(vs ...interface{}) (err error) {
defer func() { defer func() {

View File

@@ -171,7 +171,7 @@ func (conn *Conn) handleCall(msg *Message) {
} }
reply.Headers[FieldSignature] = MakeVariant(SignatureOf(reply.Body...)) reply.Headers[FieldSignature] = MakeVariant(SignatureOf(reply.Body...))
conn.sendMessage(reply) conn.sendMessageAndIfClosed(reply, nil)
} }
} }

3
vendor/github.com/godbus/dbus/v5/go.mod generated vendored Normal file
View File

@@ -0,0 +1,3 @@
module github.com/godbus/dbus/v5
go 1.12

0
vendor/github.com/godbus/dbus/v5/go.sum generated vendored Normal file
View File

62
vendor/github.com/godbus/dbus/v5/match.go generated vendored Normal file
View File

@@ -0,0 +1,62 @@
package dbus
import (
"strings"
)
// MatchOption specifies option for dbus routing match rule. Options can be constructed with WithMatch* helpers.
// For full list of available options consult
// https://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-routing-match-rules
type MatchOption struct {
key string
value string
}
func formatMatchOptions(options []MatchOption) string {
items := make([]string, 0, len(options))
for _, option := range options {
items = append(items, option.key+"='"+option.value+"'")
}
return strings.Join(items, ",")
}
// WithMatchOption creates match option with given key and value
func WithMatchOption(key, value string) MatchOption {
return MatchOption{key, value}
}
// doesn't make sense to export this option because clients can only
// subscribe to messages with signal type.
func withMatchType(typ string) MatchOption {
return WithMatchOption("type", typ)
}
// WithMatchSender sets sender match option.
func WithMatchSender(sender string) MatchOption {
return WithMatchOption("sender", sender)
}
// WithMatchSender sets interface match option.
func WithMatchInterface(iface string) MatchOption {
return WithMatchOption("interface", iface)
}
// WithMatchMember sets member match option.
func WithMatchMember(member string) MatchOption {
return WithMatchOption("member", member)
}
// WithMatchObjectPath creates match option that filters events based on given path
func WithMatchObjectPath(path ObjectPath) MatchOption {
return WithMatchOption("path", string(path))
}
// WithMatchPathNamespace sets path_namespace match option.
func WithMatchPathNamespace(namespace ObjectPath) MatchOption {
return WithMatchOption("path_namespace", string(namespace))
}
// WithMatchDestination sets destination match option.
func WithMatchDestination(destination string) MatchOption {
return WithMatchOption("destination", destination)
}

View File

@@ -16,6 +16,7 @@ type BusObject interface {
AddMatchSignal(iface, member string, options ...MatchOption) *Call AddMatchSignal(iface, member string, options ...MatchOption) *Call
RemoveMatchSignal(iface, member string, options ...MatchOption) *Call RemoveMatchSignal(iface, member string, options ...MatchOption) *Call
GetProperty(p string) (Variant, error) GetProperty(p string) (Variant, error)
SetProperty(p string, v interface{}) error
Destination() string Destination() string
Path() ObjectPath Path() ObjectPath
} }
@@ -37,41 +38,16 @@ func (o *Object) CallWithContext(ctx context.Context, method string, flags Flags
return <-o.createCall(ctx, method, flags, make(chan *Call, 1), args...).Done return <-o.createCall(ctx, method, flags, make(chan *Call, 1), args...).Done
} }
// MatchOption specifies option for dbus routing match rule. Options can be constructed with WithMatch* helpers.
// For full list of available options consult
// https://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-routing-match-rules
type MatchOption struct {
key string
value string
}
// WithMatchOption creates match option with given key and value
func WithMatchOption(key, value string) MatchOption {
return MatchOption{key, value}
}
// WithMatchObjectPath creates match option that filters events based on given path
func WithMatchObjectPath(path ObjectPath) MatchOption {
return MatchOption{"path", string(path)}
}
func formatMatchOptions(options []MatchOption) string {
items := make([]string, 0, len(options))
for _, option := range options {
items = append(items, option.key+"='"+option.value+"'")
}
return strings.Join(items, ",")
}
// AddMatchSignal subscribes BusObject to signals from specified interface, // AddMatchSignal subscribes BusObject to signals from specified interface,
// method (member). Additional filter rules can be added via WithMatch* option constructors. // method (member). Additional filter rules can be added via WithMatch* option constructors.
// Note: To filter events by object path you have to specify this path via an option. // Note: To filter events by object path you have to specify this path via an option.
//
// Deprecated: use (*Conn) AddMatchSignal instead.
func (o *Object) AddMatchSignal(iface, member string, options ...MatchOption) *Call { func (o *Object) AddMatchSignal(iface, member string, options ...MatchOption) *Call {
base := []MatchOption{ base := []MatchOption{
{"type", "signal"}, withMatchType("signal"),
{"interface", iface}, WithMatchInterface(iface),
{"member", member}, WithMatchMember(member),
} }
options = append(base, options...) options = append(base, options...)
@@ -84,11 +60,13 @@ func (o *Object) AddMatchSignal(iface, member string, options ...MatchOption) *C
// RemoveMatchSignal unsubscribes BusObject from signals from specified interface, // RemoveMatchSignal unsubscribes BusObject from signals from specified interface,
// method (member). Additional filter rules can be added via WithMatch* option constructors // method (member). Additional filter rules can be added via WithMatch* option constructors
//
// Deprecated: use (*Conn) RemoveMatchSignal instead.
func (o *Object) RemoveMatchSignal(iface, member string, options ...MatchOption) *Call { func (o *Object) RemoveMatchSignal(iface, member string, options ...MatchOption) *Call {
base := []MatchOption{ base := []MatchOption{
{"type", "signal"}, withMatchType("signal"),
{"interface", iface}, WithMatchInterface(iface),
{"member", member}, WithMatchMember(member),
} }
options = append(base, options...) options = append(base, options...)
@@ -146,7 +124,7 @@ func (o *Object) createCall(ctx context.Context, method string, flags Flags, ch
} }
if msg.Flags&FlagNoReplyExpected == 0 { if msg.Flags&FlagNoReplyExpected == 0 {
if ch == nil { if ch == nil {
ch = make(chan *Call, 10) ch = make(chan *Call, 1)
} else if cap(ch) == 0 { } else if cap(ch) == 0 {
panic("dbus: unbuffered channel passed to (*Object).Go") panic("dbus: unbuffered channel passed to (*Object).Go")
} }
@@ -187,7 +165,7 @@ func (o *Object) createCall(ctx context.Context, method string, flags Flags, ch
return call return call
} }
// GetProperty calls org.freedesktop.DBus.Properties.GetProperty on the given // GetProperty calls org.freedesktop.DBus.Properties.Get on the given
// object. The property name must be given in interface.member notation. // object. The property name must be given in interface.member notation.
func (o *Object) GetProperty(p string) (Variant, error) { func (o *Object) GetProperty(p string) (Variant, error) {
idx := strings.LastIndex(p, ".") idx := strings.LastIndex(p, ".")
@@ -208,6 +186,20 @@ func (o *Object) GetProperty(p string) (Variant, error) {
return result, nil return result, nil
} }
// SetProperty calls org.freedesktop.DBus.Properties.Set on the given
// object. The property name must be given in interface.member notation.
func (o *Object) SetProperty(p string, v interface{}) error {
idx := strings.LastIndex(p, ".")
if idx == -1 || idx+1 == len(p) {
return errors.New("dbus: invalid property " + p)
}
iface := p[:idx]
prop := p[idx+1:]
return o.Call("org.freedesktop.DBus.Properties.Set", 0, iface, prop, v).Err
}
// Destination returns the destination that calls on (o *Object) are sent to. // Destination returns the destination that calls on (o *Object) are sent to.
func (o *Object) Destination() string { func (o *Object) Destination() string {
return o.dest return o.dest

View File

@@ -77,6 +77,14 @@ type SignalHandler interface {
DeliverSignal(iface, name string, signal *Signal) DeliverSignal(iface, name string, signal *Signal)
} }
// SignalRegistrar manages signal delivery channels.
//
// This is an optional set of methods for `SignalHandler`.
type SignalRegistrar interface {
AddSignal(ch chan<- *Signal)
RemoveSignal(ch chan<- *Signal)
}
// A DBusError is used to convert a generic object to a D-Bus error. // A DBusError is used to convert a generic object to a D-Bus error.
// //
// Any custom error mechanism may implement this interface to provide // Any custom error mechanism may implement this interface to provide

View File

@@ -1,5 +1,3 @@
//+build !windows
package dbus package dbus
import ( import (

View File

@@ -203,7 +203,7 @@ func (t *unixTransport) SendMessage(msg *Message) error {
} }
} else { } else {
if err := msg.EncodeTo(t, nativeEndian); err != nil { if err := msg.EncodeTo(t, nativeEndian); err != nil {
return nil return err
} }
} }
return nil return nil

View File

@@ -26,7 +26,7 @@ func MakeVariantWithSignature(v interface{}, s Signature) Variant {
} }
// ParseVariant parses the given string as a variant as described at // ParseVariant parses the given string as a variant as described at
// https://developer.gnome.org/glib/unstable/gvariant-text.html. If sig is not // https://developer.gnome.org/glib/stable/gvariant-text.html. If sig is not
// empty, it is taken to be the expected signature for the variant. // empty, it is taken to be the expected signature for the variant.
func ParseVariant(s string, sig Signature) (Variant, error) { func ParseVariant(s string, sig Signature) (Variant, error) {
tokens := varLex(s) tokens := varLex(s)
@@ -129,7 +129,7 @@ func (v Variant) Signature() Signature {
} }
// String returns the string representation of the underlying value of v as // String returns the string representation of the underlying value of v as
// described at https://developer.gnome.org/glib/unstable/gvariant-text.html. // described at https://developer.gnome.org/glib/stable/gvariant-text.html.
func (v Variant) String() string { func (v Variant) String() string {
s, unamb := v.format() s, unamb := v.format()
if !unamb { if !unamb {

View File

@@ -51,7 +51,7 @@ func varLex(s string) []varToken {
} }
func (l *varLexer) accept(valid string) bool { func (l *varLexer) accept(valid string) bool {
if strings.IndexRune(valid, l.next()) >= 0 { if strings.ContainsRune(valid, l.next()) {
return true return true
} }
l.backup() l.backup()
@@ -214,17 +214,17 @@ func varLexNumber(l *varLexer) lexState {
digits = "01234567" digits = "01234567"
} }
} }
for strings.IndexRune(digits, l.next()) >= 0 { for strings.ContainsRune(digits, l.next()) {
} }
l.backup() l.backup()
if l.accept(".") { if l.accept(".") {
for strings.IndexRune(digits, l.next()) >= 0 { for strings.ContainsRune(digits, l.next()) {
} }
l.backup() l.backup()
} }
if l.accept("eE") { if l.accept("eE") {
l.accept("+-") l.accept("+-")
for strings.IndexRune("0123456789", l.next()) >= 0 { for strings.ContainsRune("0123456789", l.next()) {
} }
l.backup() l.backup()
} }

10
vendor/modules.txt vendored
View File

@@ -10,19 +10,19 @@ github.com/cilium/ebpf/internal/unix
# github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50 # github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50
## explicit ## explicit
github.com/containerd/console github.com/containerd/console
# github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e # github.com/coreos/go-systemd/v22 v22.0.0
## explicit ## explicit
github.com/coreos/go-systemd/activation github.com/coreos/go-systemd/v22/activation
github.com/coreos/go-systemd/dbus github.com/coreos/go-systemd/v22/dbus
# github.com/cyphar/filepath-securejoin v0.2.2 # github.com/cyphar/filepath-securejoin v0.2.2
## explicit ## explicit
github.com/cyphar/filepath-securejoin github.com/cyphar/filepath-securejoin
# github.com/docker/go-units v0.3.3 # github.com/docker/go-units v0.3.3
## explicit ## explicit
github.com/docker/go-units github.com/docker/go-units
# github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f # github.com/godbus/dbus/v5 v5.0.3
## explicit ## explicit
github.com/godbus/dbus github.com/godbus/dbus/v5
# github.com/golang/protobuf v1.0.0 # github.com/golang/protobuf v1.0.0
## explicit ## explicit
github.com/golang/protobuf/proto github.com/golang/protobuf/proto