summaryrefslogtreecommitdiff
path: root/vendor/github.com/godbus/dbus
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/godbus/dbus')
-rw-r--r--vendor/github.com/godbus/dbus/v5/CONTRIBUTING.md50
-rw-r--r--vendor/github.com/godbus/dbus/v5/LICENSE25
-rw-r--r--vendor/github.com/godbus/dbus/v5/MAINTAINERS3
-rw-r--r--vendor/github.com/godbus/dbus/v5/README.markdown46
-rw-r--r--vendor/github.com/godbus/dbus/v5/auth.go252
-rw-r--r--vendor/github.com/godbus/dbus/v5/auth_anonymous.go16
-rw-r--r--vendor/github.com/godbus/dbus/v5/auth_external.go26
-rw-r--r--vendor/github.com/godbus/dbus/v5/auth_sha1.go102
-rw-r--r--vendor/github.com/godbus/dbus/v5/call.go69
-rw-r--r--vendor/github.com/godbus/dbus/v5/conn.go959
-rw-r--r--vendor/github.com/godbus/dbus/v5/conn_darwin.go37
-rw-r--r--vendor/github.com/godbus/dbus/v5/conn_other.go93
-rw-r--r--vendor/github.com/godbus/dbus/v5/conn_unix.go17
-rw-r--r--vendor/github.com/godbus/dbus/v5/conn_windows.go15
-rw-r--r--vendor/github.com/godbus/dbus/v5/dbus.go432
-rw-r--r--vendor/github.com/godbus/dbus/v5/decoder.go286
-rw-r--r--vendor/github.com/godbus/dbus/v5/default_handler.go342
-rw-r--r--vendor/github.com/godbus/dbus/v5/doc.go69
-rw-r--r--vendor/github.com/godbus/dbus/v5/encoder.go210
-rw-r--r--vendor/github.com/godbus/dbus/v5/export.go441
-rw-r--r--vendor/github.com/godbus/dbus/v5/homedir.go28
-rw-r--r--vendor/github.com/godbus/dbus/v5/homedir_dynamic.go15
-rw-r--r--vendor/github.com/godbus/dbus/v5/homedir_static.go45
-rw-r--r--vendor/github.com/godbus/dbus/v5/match.go89
-rw-r--r--vendor/github.com/godbus/dbus/v5/message.go353
-rw-r--r--vendor/github.com/godbus/dbus/v5/object.go174
-rw-r--r--vendor/github.com/godbus/dbus/v5/sequence.go24
-rw-r--r--vendor/github.com/godbus/dbus/v5/sequential_handler.go125
-rw-r--r--vendor/github.com/godbus/dbus/v5/server_interfaces.go107
-rw-r--r--vendor/github.com/godbus/dbus/v5/sig.go259
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_darwin.go6
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_generic.go50
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_nonce_tcp.go39
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_tcp.go41
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_unix.go214
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_unixcred_dragonfly.go95
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go92
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_unixcred_linux.go25
-rw-r--r--vendor/github.com/godbus/dbus/v5/transport_unixcred_openbsd.go14
-rw-r--r--vendor/github.com/godbus/dbus/v5/variant.go150
-rw-r--r--vendor/github.com/godbus/dbus/v5/variant_lexer.go284
-rw-r--r--vendor/github.com/godbus/dbus/v5/variant_parser.go817
42 files changed, 0 insertions, 6536 deletions
diff --git a/vendor/github.com/godbus/dbus/v5/CONTRIBUTING.md b/vendor/github.com/godbus/dbus/v5/CONTRIBUTING.md
deleted file mode 100644
index c88f9b2bd..000000000
--- a/vendor/github.com/godbus/dbus/v5/CONTRIBUTING.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# How to Contribute
-
-## Getting Started
-
-- Fork the repository on GitHub
-- Read the [README](README.markdown) for build and test instructions
-- Play with the project, submit bugs, submit patches!
-
-## Contribution Flow
-
-This is a rough outline of what a contributor's workflow looks like:
-
-- Create a topic branch from where you want to base your work (usually master).
-- Make commits of logical units.
-- Make sure your commit messages are in the proper format (see below).
-- Push your changes to a topic branch in your fork of the repository.
-- Make sure the tests pass, and add any new tests as appropriate.
-- Submit a pull request to the original repository.
-
-Thanks for your contributions!
-
-### Format of the Commit Message
-
-We follow a rough convention for commit messages that is designed to answer two
-questions: what changed and why. The subject line should feature the what and
-the body of the commit should describe the why.
-
-```
-scripts: add the test-cluster command
-
-this uses tmux to setup a test cluster that you can easily kill and
-start for debugging.
-
-Fixes #38
-```
-
-The format can be described more formally as follows:
-
-```
-<subsystem>: <what changed>
-<BLANK LINE>
-<why this change was made>
-<BLANK LINE>
-<footer>
-```
-
-The first line is the subject and should be no longer than 70 characters, the
-second line is always blank, and other lines should be wrapped at 80 characters.
-This allows the message to be easier to read on GitHub as well as in various
-git tools.
diff --git a/vendor/github.com/godbus/dbus/v5/LICENSE b/vendor/github.com/godbus/dbus/v5/LICENSE
deleted file mode 100644
index 670d88fca..000000000
--- a/vendor/github.com/godbus/dbus/v5/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/godbus/dbus/v5/MAINTAINERS b/vendor/github.com/godbus/dbus/v5/MAINTAINERS
deleted file mode 100644
index 27618c9cd..000000000
--- a/vendor/github.com/godbus/dbus/v5/MAINTAINERS
+++ /dev/null
@@ -1,3 +0,0 @@
-Brandon Philips <brandon@ifup.org> (@philips)
-Brian Waldon <brian@waldon.cc> (@bcwaldon)
-John Southworth <jsouthwo@brocade.com> (@jsouthworth)
diff --git a/vendor/github.com/godbus/dbus/v5/README.markdown b/vendor/github.com/godbus/dbus/v5/README.markdown
deleted file mode 100644
index 1fb2eacaa..000000000
--- a/vendor/github.com/godbus/dbus/v5/README.markdown
+++ /dev/null
@@ -1,46 +0,0 @@
-![Build Status](https://github.com/godbus/dbus/workflows/Go/badge.svg)
-
-dbus
-----
-
-dbus is a simple library that implements native Go client bindings for the
-D-Bus message bus system.
-
-### Features
-
-* Complete native implementation of the D-Bus message protocol
-* Go-like API (channels for signals / asynchronous method calls, Goroutine-safe connections)
-* Subpackages that help with the introspection / property interfaces
-
-### Installation
-
-This packages requires Go 1.7. If you installed it and set up your GOPATH, just run:
-
-```
-go get github.com/godbus/dbus
-```
-
-If you want to use the subpackages, you can install them the same way.
-
-### Usage
-
-The complete package documentation and some simple examples are available at
-[godoc.org](http://godoc.org/github.com/godbus/dbus). Also, the
-[_examples](https://github.com/godbus/dbus/tree/master/_examples) directory
-gives a short overview over the basic usage.
-
-#### Projects using godbus
-- [notify](https://github.com/esiqveland/notify) provides desktop notifications over dbus into a library.
-- [go-bluetooth](https://github.com/muka/go-bluetooth) provides a bluetooth client over bluez dbus API.
-- [playerbm](https://github.com/altdesktop/playerbm) a bookmark utility for media players.
-- [iwd](https://github.com/shibumi/iwd) go bindings for the internet wireless daemon "iwd".
-
-Please note that the API is considered unstable for now and may change without
-further notice.
-
-### License
-
-go.dbus is available under the Simplified BSD License; see LICENSE for the full
-text.
-
-Nearly all of the credit for this library goes to github.com/guelfey/go.dbus.
diff --git a/vendor/github.com/godbus/dbus/v5/auth.go b/vendor/github.com/godbus/dbus/v5/auth.go
deleted file mode 100644
index 283487a0e..000000000
--- a/vendor/github.com/godbus/dbus/v5/auth.go
+++ /dev/null
@@ -1,252 +0,0 @@
-package dbus
-
-import (
- "bufio"
- "bytes"
- "errors"
- "io"
- "os"
- "strconv"
-)
-
-// AuthStatus represents the Status of an authentication mechanism.
-type AuthStatus byte
-
-const (
- // AuthOk signals that authentication is finished; the next command
- // from the server should be an OK.
- AuthOk AuthStatus = iota
-
- // AuthContinue signals that additional data is needed; the next command
- // from the server should be a DATA.
- AuthContinue
-
- // AuthError signals an error; the server sent invalid data or some
- // other unexpected thing happened and the current authentication
- // process should be aborted.
- AuthError
-)
-
-type authState byte
-
-const (
- waitingForData authState = iota
- waitingForOk
- waitingForReject
-)
-
-// Auth defines the behaviour of an authentication mechanism.
-type Auth interface {
- // Return the name of the mechanism, the argument to the first AUTH command
- // and the next status.
- FirstData() (name, resp []byte, status AuthStatus)
-
- // Process the given DATA command, and return the argument to the DATA
- // command and the next status. If len(resp) == 0, no DATA command is sent.
- HandleData(data []byte) (resp []byte, status AuthStatus)
-}
-
-// Auth authenticates the connection, trying the given list of authentication
-// mechanisms (in that order). If nil is passed, the EXTERNAL and
-// DBUS_COOKIE_SHA1 mechanisms are tried for the current user. For private
-// connections, this method must be called before sending any messages to the
-// bus. Auth must not be called on shared connections.
-func (conn *Conn) Auth(methods []Auth) error {
- if methods == nil {
- uid := strconv.Itoa(os.Getuid())
- methods = []Auth{AuthExternal(uid), AuthCookieSha1(uid, getHomeDir())}
- }
- in := bufio.NewReader(conn.transport)
- err := conn.transport.SendNullByte()
- if err != nil {
- return err
- }
- err = authWriteLine(conn.transport, []byte("AUTH"))
- if err != nil {
- return err
- }
- s, err := authReadLine(in)
- if err != nil {
- return err
- }
- if len(s) < 2 || !bytes.Equal(s[0], []byte("REJECTED")) {
- return errors.New("dbus: authentication protocol error")
- }
- s = s[1:]
- for _, v := range s {
- for _, m := range methods {
- if name, data, status := m.FirstData(); bytes.Equal(v, name) {
- var ok bool
- err = authWriteLine(conn.transport, []byte("AUTH"), v, data)
- if err != nil {
- return err
- }
- switch status {
- case AuthOk:
- err, ok = conn.tryAuth(m, waitingForOk, in)
- case AuthContinue:
- err, ok = conn.tryAuth(m, waitingForData, in)
- default:
- panic("dbus: invalid authentication status")
- }
- if err != nil {
- return err
- }
- if ok {
- if conn.transport.SupportsUnixFDs() {
- err = authWriteLine(conn, []byte("NEGOTIATE_UNIX_FD"))
- if err != nil {
- return err
- }
- line, err := authReadLine(in)
- if err != nil {
- return err
- }
- switch {
- case bytes.Equal(line[0], []byte("AGREE_UNIX_FD")):
- conn.EnableUnixFDs()
- conn.unixFD = true
- case bytes.Equal(line[0], []byte("ERROR")):
- default:
- return errors.New("dbus: authentication protocol error")
- }
- }
- err = authWriteLine(conn.transport, []byte("BEGIN"))
- if err != nil {
- return err
- }
- go conn.inWorker()
- return nil
- }
- }
- }
- }
- return errors.New("dbus: authentication failed")
-}
-
-// 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
-// success, (nil, false) on a REJECTED and (someErr, false) if some other
-// error occurred.
-func (conn *Conn) tryAuth(m Auth, state authState, in *bufio.Reader) (error, bool) {
- for {
- s, err := authReadLine(in)
- if err != nil {
- return err, false
- }
- switch {
- case state == waitingForData && string(s[0]) == "DATA":
- if len(s) != 2 {
- err = authWriteLine(conn.transport, []byte("ERROR"))
- if err != nil {
- return err, false
- }
- continue
- }
- data, status := m.HandleData(s[1])
- switch status {
- case AuthOk, AuthContinue:
- if len(data) != 0 {
- err = authWriteLine(conn.transport, []byte("DATA"), data)
- if err != nil {
- return err, false
- }
- }
- if status == AuthOk {
- state = waitingForOk
- }
- case AuthError:
- err = authWriteLine(conn.transport, []byte("ERROR"))
- if err != nil {
- return err, false
- }
- }
- case state == waitingForData && string(s[0]) == "REJECTED":
- return nil, false
- case state == waitingForData && string(s[0]) == "ERROR":
- err = authWriteLine(conn.transport, []byte("CANCEL"))
- if err != nil {
- return err, false
- }
- state = waitingForReject
- case state == waitingForData && string(s[0]) == "OK":
- if len(s) != 2 {
- err = authWriteLine(conn.transport, []byte("CANCEL"))
- if err != nil {
- return err, false
- }
- state = waitingForReject
- }
- conn.uuid = string(s[1])
- return nil, true
- case state == waitingForData:
- err = authWriteLine(conn.transport, []byte("ERROR"))
- if err != nil {
- return err, false
- }
- case state == waitingForOk && string(s[0]) == "OK":
- if len(s) != 2 {
- err = authWriteLine(conn.transport, []byte("CANCEL"))
- if err != nil {
- return err, false
- }
- state = waitingForReject
- }
- conn.uuid = string(s[1])
- return nil, true
- case state == waitingForOk && string(s[0]) == "REJECTED":
- return nil, false
- case state == waitingForOk && (string(s[0]) == "DATA" ||
- string(s[0]) == "ERROR"):
-
- err = authWriteLine(conn.transport, []byte("CANCEL"))
- if err != nil {
- return err, false
- }
- state = waitingForReject
- case state == waitingForOk:
- err = authWriteLine(conn.transport, []byte("ERROR"))
- if err != nil {
- return err, false
- }
- case state == waitingForReject && string(s[0]) == "REJECTED":
- return nil, false
- case state == waitingForReject:
- return errors.New("dbus: authentication protocol error"), false
- default:
- panic("dbus: invalid auth state")
- }
- }
-}
-
-// authReadLine reads a line and separates it into its fields.
-func authReadLine(in *bufio.Reader) ([][]byte, error) {
- data, err := in.ReadBytes('\n')
- if err != nil {
- return nil, err
- }
- data = bytes.TrimSuffix(data, []byte("\r\n"))
- return bytes.Split(data, []byte{' '}), nil
-}
-
-// authWriteLine writes the given line in the authentication protocol format
-// (elements of data separated by a " " and terminated by "\r\n").
-func authWriteLine(out io.Writer, data ...[]byte) error {
- buf := make([]byte, 0)
- for i, v := range data {
- buf = append(buf, v...)
- if i != len(data)-1 {
- buf = append(buf, ' ')
- }
- }
- buf = append(buf, '\r')
- buf = append(buf, '\n')
- n, err := out.Write(buf)
- if err != nil {
- return err
- }
- if n != len(buf) {
- return io.ErrUnexpectedEOF
- }
- return nil
-}
diff --git a/vendor/github.com/godbus/dbus/v5/auth_anonymous.go b/vendor/github.com/godbus/dbus/v5/auth_anonymous.go
deleted file mode 100644
index 75f3ad34d..000000000
--- a/vendor/github.com/godbus/dbus/v5/auth_anonymous.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package dbus
-
-// AuthAnonymous returns an Auth that uses the ANONYMOUS mechanism.
-func AuthAnonymous() Auth {
- return &authAnonymous{}
-}
-
-type authAnonymous struct{}
-
-func (a *authAnonymous) FirstData() (name, resp []byte, status AuthStatus) {
- return []byte("ANONYMOUS"), nil, AuthOk
-}
-
-func (a *authAnonymous) HandleData(data []byte) (resp []byte, status AuthStatus) {
- return nil, AuthError
-}
diff --git a/vendor/github.com/godbus/dbus/v5/auth_external.go b/vendor/github.com/godbus/dbus/v5/auth_external.go
deleted file mode 100644
index 7e376d3ef..000000000
--- a/vendor/github.com/godbus/dbus/v5/auth_external.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package dbus
-
-import (
- "encoding/hex"
-)
-
-// AuthExternal returns an Auth that authenticates as the given user with the
-// EXTERNAL mechanism.
-func AuthExternal(user string) Auth {
- return authExternal{user}
-}
-
-// AuthExternal implements the EXTERNAL authentication mechanism.
-type authExternal struct {
- user string
-}
-
-func (a authExternal) FirstData() ([]byte, []byte, AuthStatus) {
- b := make([]byte, 2*len(a.user))
- hex.Encode(b, []byte(a.user))
- return []byte("EXTERNAL"), b, AuthOk
-}
-
-func (a authExternal) HandleData(b []byte) ([]byte, AuthStatus) {
- return nil, AuthError
-}
diff --git a/vendor/github.com/godbus/dbus/v5/auth_sha1.go b/vendor/github.com/godbus/dbus/v5/auth_sha1.go
deleted file mode 100644
index 80286700b..000000000
--- a/vendor/github.com/godbus/dbus/v5/auth_sha1.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package dbus
-
-import (
- "bufio"
- "bytes"
- "crypto/rand"
- "crypto/sha1"
- "encoding/hex"
- "os"
-)
-
-// AuthCookieSha1 returns an Auth that authenticates as the given user with the
-// DBUS_COOKIE_SHA1 mechanism. The home parameter should specify the home
-// directory of the user.
-func AuthCookieSha1(user, home string) Auth {
- return authCookieSha1{user, home}
-}
-
-type authCookieSha1 struct {
- user, home string
-}
-
-func (a authCookieSha1) FirstData() ([]byte, []byte, AuthStatus) {
- b := make([]byte, 2*len(a.user))
- hex.Encode(b, []byte(a.user))
- return []byte("DBUS_COOKIE_SHA1"), b, AuthContinue
-}
-
-func (a authCookieSha1) HandleData(data []byte) ([]byte, AuthStatus) {
- challenge := make([]byte, len(data)/2)
- _, err := hex.Decode(challenge, data)
- if err != nil {
- return nil, AuthError
- }
- b := bytes.Split(challenge, []byte{' '})
- if len(b) != 3 {
- return nil, AuthError
- }
- context := b[0]
- id := b[1]
- svchallenge := b[2]
- cookie := a.getCookie(context, id)
- if cookie == nil {
- return nil, AuthError
- }
- clchallenge := a.generateChallenge()
- if clchallenge == nil {
- return nil, AuthError
- }
- hash := sha1.New()
- hash.Write(bytes.Join([][]byte{svchallenge, clchallenge, cookie}, []byte{':'}))
- hexhash := make([]byte, 2*hash.Size())
- hex.Encode(hexhash, hash.Sum(nil))
- data = append(clchallenge, ' ')
- data = append(data, hexhash...)
- resp := make([]byte, 2*len(data))
- hex.Encode(resp, data)
- return resp, AuthOk
-}
-
-// 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,
-// but only whether an error occurred, this function also doesn't bother to
-// return an error.)
-func (a authCookieSha1) getCookie(context, id []byte) []byte {
- file, err := os.Open(a.home + "/.dbus-keyrings/" + string(context))
- if err != nil {
- return nil
- }
- defer file.Close()
- rd := bufio.NewReader(file)
- for {
- line, err := rd.ReadBytes('\n')
- if err != nil {
- return nil
- }
- line = line[:len(line)-1]
- b := bytes.Split(line, []byte{' '})
- if len(b) != 3 {
- return nil
- }
- if bytes.Equal(b[0], id) {
- return b[2]
- }
- }
-}
-
-// generateChallenge returns a random, hex-encoded challenge, or nil on error
-// (see above).
-func (a authCookieSha1) generateChallenge() []byte {
- b := make([]byte, 16)
- n, err := rand.Read(b)
- if err != nil {
- return nil
- }
- if n != 16 {
- return nil
- }
- enc := make([]byte, 32)
- hex.Encode(enc, b)
- return enc
-}
diff --git a/vendor/github.com/godbus/dbus/v5/call.go b/vendor/github.com/godbus/dbus/v5/call.go
deleted file mode 100644
index b06b06358..000000000
--- a/vendor/github.com/godbus/dbus/v5/call.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package dbus
-
-import (
- "context"
- "errors"
-)
-
-var errSignature = errors.New("dbus: mismatched signature")
-
-// Call represents a pending or completed method call.
-type Call struct {
- Destination string
- Path ObjectPath
- Method string
- Args []interface{}
-
- // Strobes when the call is complete.
- Done chan *Call
-
- // After completion, the error status. If this is non-nil, it may be an
- // error message from the peer (with Error as its type) or some other error.
- Err error
-
- // Holds the response once the call is done.
- Body []interface{}
-
- // ResponseSequence stores the sequence number of the DBus message containing
- // the call response (or error). This can be compared to the sequence number
- // of other call responses and signals on this connection to determine their
- // relative ordering on the underlying DBus connection.
- // For errors, ResponseSequence is populated only if the error came from a
- // DBusMessage that was received or if there was an error receiving. In case of
- // failure to make the call, ResponseSequence will be NoSequence.
- ResponseSequence Sequence
-
- // tracks context and canceler
- ctx context.Context
- ctxCanceler context.CancelFunc
-}
-
-func (c *Call) Context() context.Context {
- if c.ctx == nil {
- return context.Background()
- }
-
- return c.ctx
-}
-
-func (c *Call) ContextCancel() {
- if c.ctxCanceler != nil {
- c.ctxCanceler()
- }
-}
-
-// Store stores the body of the reply into the provided pointers. It returns
-// an error if the signatures of the body and retvalues don't match, or if
-// the error status is not nil.
-func (c *Call) Store(retvalues ...interface{}) error {
- if c.Err != nil {
- return c.Err
- }
-
- return Store(c.Body, retvalues...)
-}
-
-func (c *Call) done() {
- c.Done <- c
- c.ContextCancel()
-}
diff --git a/vendor/github.com/godbus/dbus/v5/conn.go b/vendor/github.com/godbus/dbus/v5/conn.go
deleted file mode 100644
index 29fe018ad..000000000
--- a/vendor/github.com/godbus/dbus/v5/conn.go
+++ /dev/null
@@ -1,959 +0,0 @@
-package dbus
-
-import (
- "context"
- "errors"
- "io"
- "os"
- "strings"
- "sync"
-)
-
-var (
- systemBus *Conn
- systemBusLck sync.Mutex
- sessionBus *Conn
- sessionBusLck sync.Mutex
-)
-
-// ErrClosed is the error returned by calls on a closed connection.
-var ErrClosed = errors.New("dbus: connection closed by user")
-
-// Conn represents a connection to a message bus (usually, the system or
-// session bus).
-//
-// Connections are either shared or private. Shared connections
-// are shared between calls to the functions that return them. As a result,
-// the methods Close, Auth and Hello must not be called on them.
-//
-// Multiple goroutines may invoke methods on a connection simultaneously.
-type Conn struct {
- transport
-
- ctx context.Context
- cancelCtx context.CancelFunc
-
- closeOnce sync.Once
- closeErr error
-
- busObj BusObject
- unixFD bool
- uuid string
-
- handler Handler
- signalHandler SignalHandler
- serialGen SerialGenerator
- inInt Interceptor
- outInt Interceptor
- auth []Auth
-
- names *nameTracker
- calls *callTracker
- outHandler *outputHandler
-
- eavesdropped chan<- *Message
- eavesdroppedLck sync.Mutex
-}
-
-// SessionBus returns a shared connection to the session bus, connecting to it
-// if not already done.
-func SessionBus() (conn *Conn, err error) {
- sessionBusLck.Lock()
- defer sessionBusLck.Unlock()
- if sessionBus != nil &&
- sessionBus.Connected() {
- return sessionBus, nil
- }
- defer func() {
- if conn != nil {
- sessionBus = conn
- }
- }()
- conn, err = ConnectSessionBus()
- return
-}
-
-func getSessionBusAddress() (string, error) {
- if address := os.Getenv("DBUS_SESSION_BUS_ADDRESS"); address != "" && address != "autolaunch:" {
- return address, nil
-
- } else if address := tryDiscoverDbusSessionBusAddress(); address != "" {
- os.Setenv("DBUS_SESSION_BUS_ADDRESS", address)
- return address, nil
- }
- return getSessionBusPlatformAddress()
-}
-
-// SessionBusPrivate returns a new private connection to the session bus.
-func SessionBusPrivate(opts ...ConnOption) (*Conn, error) {
- address, err := getSessionBusAddress()
- if err != nil {
- return nil, err
- }
-
- return Dial(address, opts...)
-}
-
-// SessionBusPrivate returns a new private connection to the session bus.
-//
-// Deprecated: use SessionBusPrivate with options instead.
-func SessionBusPrivateHandler(handler Handler, signalHandler SignalHandler) (*Conn, error) {
- return SessionBusPrivate(WithHandler(handler), WithSignalHandler(signalHandler))
-}
-
-// SystemBus returns a shared connection to the system bus, connecting to it if
-// not already done.
-func SystemBus() (conn *Conn, err error) {
- systemBusLck.Lock()
- defer systemBusLck.Unlock()
- if systemBus != nil &&
- systemBus.Connected() {
- return systemBus, nil
- }
- defer func() {
- if conn != nil {
- systemBus = conn
- }
- }()
- conn, err = ConnectSystemBus()
- return
-}
-
-// ConnectSessionBus connects to the session bus.
-func ConnectSessionBus(opts ...ConnOption) (*Conn, error) {
- address, err := getSessionBusAddress()
- if err != nil {
- return nil, err
- }
- return Connect(address, opts...)
-}
-
-// ConnectSystemBus connects to the system bus.
-func ConnectSystemBus(opts ...ConnOption) (*Conn, error) {
- return Connect(getSystemBusPlatformAddress(), opts...)
-}
-
-// Connect connects to the given address.
-//
-// Returned connection is ready to use and doesn't require calling
-// Auth and Hello methods to make it usable.
-func Connect(address string, opts ...ConnOption) (*Conn, error) {
- conn, err := Dial(address, opts...)
- if err != nil {
- return nil, err
- }
- if err = conn.Auth(conn.auth); err != nil {
- _ = conn.Close()
- return nil, err
- }
- if err = conn.Hello(); err != nil {
- _ = conn.Close()
- return nil, err
- }
- return conn, nil
-}
-
-// 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) {
- return Dial(getSystemBusPlatformAddress(), opts...)
-}
-
-// SystemBusPrivateHandler returns a new private connection to the system bus, using the provided handlers.
-//
-// Deprecated: use SystemBusPrivate with options instead.
-func SystemBusPrivateHandler(handler Handler, signalHandler SignalHandler) (*Conn, error) {
- return SystemBusPrivate(WithHandler(handler), WithSignalHandler(signalHandler))
-}
-
-// Dial establishes a new private connection to the message bus specified by address.
-func Dial(address string, opts ...ConnOption) (*Conn, error) {
- tr, err := getTransport(address)
- if err != nil {
- return nil, err
- }
- return newConn(tr, opts...)
-}
-
-// DialHandler establishes a new private connection to the message bus specified by address, using the supplied handlers.
-//
-// Deprecated: use Dial with options instead.
-func DialHandler(address string, handler Handler, signalHandler SignalHandler) (*Conn, error) {
- return Dial(address, WithSignalHandler(signalHandler))
-}
-
-// ConnOption is a connection option.
-type ConnOption func(conn *Conn) error
-
-// WithHandler overrides the default handler.
-func WithHandler(handler Handler) ConnOption {
- return func(conn *Conn) error {
- conn.handler = handler
- return nil
- }
-}
-
-// WithSignalHandler overrides the default signal handler.
-func WithSignalHandler(handler SignalHandler) ConnOption {
- return func(conn *Conn) error {
- conn.signalHandler = handler
- return nil
- }
-}
-
-// WithSerialGenerator overrides the default signals generator.
-func WithSerialGenerator(gen SerialGenerator) ConnOption {
- return func(conn *Conn) error {
- conn.serialGen = gen
- return nil
- }
-}
-
-// WithAuth sets authentication methods for the auth conversation.
-func WithAuth(methods ...Auth) ConnOption {
- return func(conn *Conn) error {
- conn.auth = methods
- return nil
- }
-}
-
-// 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.
-func NewConn(conn io.ReadWriteCloser, opts ...ConnOption) (*Conn, error) {
- return newConn(genericTransport{conn}, opts...)
-}
-
-// NewConnHandler creates a new private *Conn from an already established connection, using the supplied handlers.
-//
-// Deprecated: use NewConn with options instead.
-func NewConnHandler(conn io.ReadWriteCloser, handler Handler, signalHandler SignalHandler) (*Conn, error) {
- return NewConn(genericTransport{conn}, WithHandler(handler), WithSignalHandler(signalHandler))
-}
-
-// newConn creates a new *Conn from a transport.
-func newConn(tr transport, opts ...ConnOption) (*Conn, error) {
- conn := new(Conn)
- conn.transport = tr
- for _, opt := range opts {
- if err := opt(conn); err != nil {
- 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()
- if conn.handler == nil {
- conn.handler = NewDefaultHandler()
- }
- if conn.signalHandler == nil {
- conn.signalHandler = NewDefaultSignalHandler()
- }
- if conn.serialGen == nil {
- conn.serialGen = newSerialGenerator()
- }
- conn.outHandler = &outputHandler{conn: conn}
- conn.names = newNameTracker()
- conn.busObj = conn.Object("org.freedesktop.DBus", "/org/freedesktop/DBus")
- return conn, nil
-}
-
-// BusObject returns the object owned by the bus daemon which handles
-// administrative requests.
-func (conn *Conn) BusObject() BusObject {
- return conn.busObj
-}
-
-// Close closes the connection. Any blocked operations will return with errors
-// and the channels passed to Eavesdrop and Signal are closed. This method must
-// not be called on shared connections.
-func (conn *Conn) Close() error {
- conn.closeOnce.Do(func() {
- conn.outHandler.close()
- if term, ok := conn.signalHandler.(Terminator); ok {
- term.Terminate()
- }
-
- if term, ok := conn.handler.(Terminator); ok {
- term.Terminate()
- }
-
- conn.eavesdroppedLck.Lock()
- if conn.eavesdropped != nil {
- close(conn.eavesdropped)
- }
- conn.eavesdroppedLck.Unlock()
-
- 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
-}
-
-// Connected returns whether conn is connected
-func (conn *Conn) Connected() bool {
- return conn.ctx.Err() == nil
-}
-
-// Eavesdrop causes conn to send all incoming messages to the given channel
-// without further processing. Method replies, errors and signals will not be
-// sent to the appropriate channels and method calls will not be handled. If nil
-// is passed, the normal behaviour is restored.
-//
-// The caller has to make sure that ch is sufficiently buffered;
-// if a message arrives when a write to ch is not possible, the message is
-// discarded.
-func (conn *Conn) Eavesdrop(ch chan<- *Message) {
- conn.eavesdroppedLck.Lock()
- conn.eavesdropped = ch
- conn.eavesdroppedLck.Unlock()
-}
-
-// getSerial returns an unused serial.
-func (conn *Conn) getSerial() uint32 {
- return conn.serialGen.GetSerial()
-}
-
-// Hello sends the initial org.freedesktop.DBus.Hello call. This method must be
-// called after authentication, but before sending any other messages to the
-// bus. Hello must not be called for shared connections.
-func (conn *Conn) Hello() error {
- var s string
- err := conn.busObj.Call("org.freedesktop.DBus.Hello", 0).Store(&s)
- if err != nil {
- return err
- }
- conn.names.acquireUniqueConnectionName(s)
- return nil
-}
-
-// inWorker runs in an own goroutine, reading incoming messages from the
-// transport and dispatching them appropriately.
-func (conn *Conn) inWorker() {
- sequenceGen := newSequenceGenerator()
- for {
- msg, err := conn.ReadMessage()
- if err != nil {
- if _, ok := err.(InvalidMessageError); !ok {
- // Some read error occurred (usually EOF); we can't really do
- // anything but to shut down all stuff and returns errors to all
- // pending replies.
- conn.Close()
- conn.calls.finalizeAllWithError(sequenceGen, err)
- return
- }
- // invalid messages are ignored
- continue
- }
- conn.eavesdroppedLck.Lock()
- if conn.eavesdropped != nil {
- select {
- case conn.eavesdropped <- msg:
- default:
- }
- conn.eavesdroppedLck.Unlock()
- continue
- }
- conn.eavesdroppedLck.Unlock()
- dest, _ := msg.Headers[FieldDestination].value.(string)
- found := dest == "" ||
- !conn.names.uniqueNameIsKnown() ||
- conn.names.isKnownName(dest)
- if !found {
- // Eavesdropped a message, but no channel for it is registered.
- // Ignore it.
- continue
- }
-
- if conn.inInt != nil {
- conn.inInt(msg)
- }
- sequence := sequenceGen.next()
- switch msg.Type {
- case TypeError:
- conn.serialGen.RetireSerial(conn.calls.handleDBusError(sequence, msg))
- case TypeMethodReply:
- conn.serialGen.RetireSerial(conn.calls.handleReply(sequence, msg))
- case TypeSignal:
- conn.handleSignal(sequence, msg)
- case TypeMethodCall:
- go conn.handleCall(msg)
- }
-
- }
-}
-
-func (conn *Conn) handleSignal(sequence Sequence, msg *Message) {
- iface := msg.Headers[FieldInterface].value.(string)
- member := msg.Headers[FieldMember].value.(string)
- // as per http://dbus.freedesktop.org/doc/dbus-specification.html ,
- // sender is optional for signals.
- sender, _ := msg.Headers[FieldSender].value.(string)
- if iface == "org.freedesktop.DBus" && sender == "org.freedesktop.DBus" {
- if member == "NameLost" {
- // If we lost the name on the bus, remove it from our
- // tracking list.
- name, ok := msg.Body[0].(string)
- if !ok {
- panic("Unable to read the lost name")
- }
- conn.names.loseName(name)
- } else if member == "NameAcquired" {
- // If we acquired the name on the bus, add it to our
- // tracking list.
- name, ok := msg.Body[0].(string)
- if !ok {
- panic("Unable to read the acquired name")
- }
- conn.names.acquireName(name)
- }
- }
- signal := &Signal{
- Sender: sender,
- Path: msg.Headers[FieldPath].value.(ObjectPath),
- Name: iface + "." + member,
- Body: msg.Body,
- Sequence: sequence,
- }
- conn.signalHandler.DeliverSignal(iface, member, signal)
-}
-
-// Names returns the list of all names that are currently owned by this
-// connection. The slice is always at least one element long, the first element
-// being the unique name of the connection.
-func (conn *Conn) Names() []string {
- return conn.names.listKnownNames()
-}
-
-// Object returns the object identified by the given destination name and path.
-func (conn *Conn) Object(dest string, path ObjectPath) BusObject {
- return &Object{conn, dest, path}
-}
-
-func (conn *Conn) sendMessageAndIfClosed(msg *Message, ifClosed func()) {
- if msg.serial == 0 {
- msg.serial = conn.getSerial()
- }
- if conn.outInt != nil {
- conn.outInt(msg)
- }
- err := conn.outHandler.sendAndIfClosed(msg, ifClosed)
- conn.calls.handleSendError(msg, err)
- if err != nil {
- conn.serialGen.RetireSerial(msg.serial)
- } else if msg.Type != TypeMethodCall {
- conn.serialGen.RetireSerial(msg.serial)
- }
-}
-
-// Send sends the given message to the message bus. You usually don't need to
-// use this; use the higher-level equivalents (Call / Go, Emit and Export)
-// instead. If msg is a method call and NoReplyExpected is not set, a non-nil
-// call is returned and the same value is sent to ch (which must be buffered)
-// once the call is complete. Otherwise, ch is ignored and a Call structure is
-// returned of which only the Err member is valid.
-func (conn *Conn) Send(msg *Message, ch chan *Call) *Call {
- return conn.send(context.Background(), msg, ch)
-}
-
-// SendWithContext acts like Send but takes a context
-func (conn *Conn) SendWithContext(ctx context.Context, msg *Message, ch chan *Call) *Call {
- return conn.send(ctx, msg, ch)
-}
-
-func (conn *Conn) send(ctx context.Context, msg *Message, ch chan *Call) *Call {
- if ctx == nil {
- panic("nil context")
- }
- if ch == nil {
- ch = make(chan *Call, 1)
- } else if cap(ch) == 0 {
- panic("dbus: unbuffered channel passed to (*Conn).Send")
- }
-
- var call *Call
- ctx, canceler := context.WithCancel(ctx)
- msg.serial = conn.getSerial()
- if msg.Type == TypeMethodCall && msg.Flags&FlagNoReplyExpected == 0 {
- call = new(Call)
- call.Destination, _ = msg.Headers[FieldDestination].value.(string)
- call.Path, _ = msg.Headers[FieldPath].value.(ObjectPath)
- iface, _ := msg.Headers[FieldInterface].value.(string)
- member, _ := msg.Headers[FieldMember].value.(string)
- call.Method = iface + "." + member
- call.Args = msg.Body
- call.Done = ch
- call.ctx = ctx
- call.ctxCanceler = canceler
- conn.calls.track(msg.serial, call)
- go func() {
- <-ctx.Done()
- conn.calls.handleSendError(msg, ctx.Err())
- }()
- conn.sendMessageAndIfClosed(msg, func() {
- conn.calls.handleSendError(msg, ErrClosed)
- canceler()
- })
- } else {
- canceler()
- call = &Call{Err: nil, Done: ch}
- ch <- call
- conn.sendMessageAndIfClosed(msg, func() {
- call = &Call{Err: ErrClosed}
- })
- }
- return call
-}
-
-// sendError creates an error message corresponding to the parameters and sends
-// it to conn.out.
-func (conn *Conn) sendError(err error, dest string, serial uint32) {
- var e *Error
- switch em := err.(type) {
- case Error:
- e = &em
- case *Error:
- e = em
- case DBusError:
- name, body := em.DBusError()
- e = NewError(name, body)
- default:
- e = MakeFailedError(err)
- }
- msg := new(Message)
- msg.Type = TypeError
- msg.Headers = make(map[HeaderField]Variant)
- if dest != "" {
- msg.Headers[FieldDestination] = MakeVariant(dest)
- }
- msg.Headers[FieldErrorName] = MakeVariant(e.Name)
- msg.Headers[FieldReplySerial] = MakeVariant(serial)
- msg.Body = e.Body
- if len(e.Body) > 0 {
- msg.Headers[FieldSignature] = MakeVariant(SignatureOf(e.Body...))
- }
- conn.sendMessageAndIfClosed(msg, nil)
-}
-
-// sendReply creates a method reply message corresponding to the parameters and
-// sends it to conn.out.
-func (conn *Conn) sendReply(dest string, serial uint32, values ...interface{}) {
- msg := new(Message)
- msg.Type = TypeMethodReply
- msg.Headers = make(map[HeaderField]Variant)
- if dest != "" {
- msg.Headers[FieldDestination] = MakeVariant(dest)
- }
- msg.Headers[FieldReplySerial] = MakeVariant(serial)
- msg.Body = values
- if len(values) > 0 {
- msg.Headers[FieldSignature] = MakeVariant(SignatureOf(values...))
- }
- conn.sendMessageAndIfClosed(msg, nil)
-}
-
-// AddMatchSignal registers the given match rule to receive broadcast
-// signals based on their contents.
-func (conn *Conn) AddMatchSignal(options ...MatchOption) error {
- return conn.AddMatchSignalContext(context.Background(), options...)
-}
-
-// AddMatchSignalContext acts like AddMatchSignal but takes a context.
-func (conn *Conn) AddMatchSignalContext(ctx context.Context, options ...MatchOption) error {
- options = append([]MatchOption{withMatchType("signal")}, options...)
- return conn.busObj.CallWithContext(
- ctx,
- "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 {
- return conn.RemoveMatchSignalContext(context.Background(), options...)
-}
-
-// RemoveMatchSignalContext acts like RemoveMatchSignal but takes a context.
-func (conn *Conn) RemoveMatchSignalContext(ctx context.Context, options ...MatchOption) error {
- options = append([]MatchOption{withMatchType("signal")}, options...)
- return conn.busObj.CallWithContext(
- ctx,
- "org.freedesktop.DBus.RemoveMatch", 0,
- formatMatchOptions(options),
- ).Store()
-}
-
-// Signal registers the given channel to be passed all received signal messages.
-//
-// Multiple of these channels can be registered at the same time.
-//
-// These channels are "overwritten" by Eavesdrop; i.e., if there currently is a
-// channel for eavesdropped messages, this channel receives all signals, and
-// 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) {
- 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.
-//
-// Panics if the signal handler is not a `SignalRegistrar`.
-func (conn *Conn) RemoveSignal(ch chan<- *Signal) {
- 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
-// unix file descriptors. If this is false, method calls containing unix file
-// descriptors will return an error and emitted signals containing them will
-// not be sent.
-func (conn *Conn) SupportsUnixFDs() bool {
- return conn.unixFD
-}
-
-// Error represents a D-Bus message of type Error.
-type Error struct {
- Name string
- Body []interface{}
-}
-
-func NewError(name string, body []interface{}) *Error {
- return &Error{name, body}
-}
-
-func (e Error) Error() string {
- if len(e.Body) >= 1 {
- s, ok := e.Body[0].(string)
- if ok {
- return s
- }
- }
- return e.Name
-}
-
-// Signal represents a D-Bus message of type Signal. The name member is given in
-// "interface.member" notation, e.g. org.freedesktop.D-Bus.NameLost.
-type Signal struct {
- Sender string
- Path ObjectPath
- Name string
- Body []interface{}
- Sequence Sequence
-}
-
-// transport is a D-Bus transport.
-type transport interface {
- // Read and Write raw data (for example, for the authentication protocol).
- io.ReadWriteCloser
-
- // Send the initial null byte used for the EXTERNAL mechanism.
- SendNullByte() error
-
- // Returns whether this transport supports passing Unix FDs.
- SupportsUnixFDs() bool
-
- // Signal the transport that Unix FD passing is enabled for this connection.
- EnableUnixFDs()
-
- // Read / send a message, handling things like Unix FDs.
- ReadMessage() (*Message, error)
- SendMessage(*Message) error
-}
-
-var (
- transports = make(map[string]func(string) (transport, error))
-)
-
-func getTransport(address string) (transport, error) {
- var err error
- var t transport
-
- addresses := strings.Split(address, ";")
- for _, v := range addresses {
- i := strings.IndexRune(v, ':')
- if i == -1 {
- err = errors.New("dbus: invalid bus address (no transport)")
- continue
- }
- f := transports[v[:i]]
- if f == nil {
- err = errors.New("dbus: invalid bus address (invalid or unsupported transport)")
- continue
- }
- t, err = f(v[i+1:])
- if err == nil {
- return t, nil
- }
- }
- return nil, err
-}
-
-// getKey gets a key from a the list of keys. Returns "" on error / not found...
-func getKey(s, key string) string {
- for _, keyEqualsValue := range strings.Split(s, ",") {
- keyValue := strings.SplitN(keyEqualsValue, "=", 2)
- if len(keyValue) == 2 && keyValue[0] == key {
- return keyValue[1]
- }
- }
- return ""
-}
-
-type outputHandler struct {
- conn *Conn
- sendLck sync.Mutex
- closed struct {
- isClosed bool
- lck sync.RWMutex
- }
-}
-
-func (h *outputHandler) sendAndIfClosed(msg *Message, ifClosed func()) error {
- h.closed.lck.RLock()
- defer h.closed.lck.RUnlock()
- if h.closed.isClosed {
- if ifClosed != nil {
- ifClosed()
- }
- return nil
- }
- h.sendLck.Lock()
- defer h.sendLck.Unlock()
- return h.conn.SendMessage(msg)
-}
-
-func (h *outputHandler) close() {
- h.closed.lck.Lock()
- defer h.closed.lck.Unlock()
- h.closed.isClosed = true
-}
-
-type serialGenerator struct {
- lck sync.Mutex
- nextSerial uint32
- serialUsed map[uint32]bool
-}
-
-func newSerialGenerator() *serialGenerator {
- return &serialGenerator{
- serialUsed: map[uint32]bool{0: true},
- nextSerial: 1,
- }
-}
-
-func (gen *serialGenerator) GetSerial() uint32 {
- gen.lck.Lock()
- defer gen.lck.Unlock()
- n := gen.nextSerial
- for gen.serialUsed[n] {
- n++
- }
- gen.serialUsed[n] = true
- gen.nextSerial = n + 1
- return n
-}
-
-func (gen *serialGenerator) RetireSerial(serial uint32) {
- gen.lck.Lock()
- defer gen.lck.Unlock()
- delete(gen.serialUsed, serial)
-}
-
-type nameTracker struct {
- lck sync.RWMutex
- unique string
- names map[string]struct{}
-}
-
-func newNameTracker() *nameTracker {
- return &nameTracker{names: map[string]struct{}{}}
-}
-func (tracker *nameTracker) acquireUniqueConnectionName(name string) {
- tracker.lck.Lock()
- defer tracker.lck.Unlock()
- tracker.unique = name
-}
-func (tracker *nameTracker) acquireName(name string) {
- tracker.lck.Lock()
- defer tracker.lck.Unlock()
- tracker.names[name] = struct{}{}
-}
-func (tracker *nameTracker) loseName(name string) {
- tracker.lck.Lock()
- defer tracker.lck.Unlock()
- delete(tracker.names, name)
-}
-
-func (tracker *nameTracker) uniqueNameIsKnown() bool {
- tracker.lck.RLock()
- defer tracker.lck.RUnlock()
- return tracker.unique != ""
-}
-func (tracker *nameTracker) isKnownName(name string) bool {
- tracker.lck.RLock()
- defer tracker.lck.RUnlock()
- _, ok := tracker.names[name]
- return ok || name == tracker.unique
-}
-func (tracker *nameTracker) listKnownNames() []string {
- tracker.lck.RLock()
- defer tracker.lck.RUnlock()
- out := make([]string, 0, len(tracker.names)+1)
- out = append(out, tracker.unique)
- for k := range tracker.names {
- out = append(out, k)
- }
- return out
-}
-
-type callTracker struct {
- calls map[uint32]*Call
- lck sync.RWMutex
-}
-
-func newCallTracker() *callTracker {
- return &callTracker{calls: map[uint32]*Call{}}
-}
-
-func (tracker *callTracker) track(sn uint32, call *Call) {
- tracker.lck.Lock()
- tracker.calls[sn] = call
- tracker.lck.Unlock()
-}
-
-func (tracker *callTracker) handleReply(sequence Sequence, msg *Message) uint32 {
- serial := msg.Headers[FieldReplySerial].value.(uint32)
- tracker.lck.RLock()
- _, ok := tracker.calls[serial]
- tracker.lck.RUnlock()
- if ok {
- tracker.finalizeWithBody(serial, sequence, msg.Body)
- }
- return serial
-}
-
-func (tracker *callTracker) handleDBusError(sequence Sequence, msg *Message) uint32 {
- serial := msg.Headers[FieldReplySerial].value.(uint32)
- tracker.lck.RLock()
- _, ok := tracker.calls[serial]
- tracker.lck.RUnlock()
- if ok {
- name, _ := msg.Headers[FieldErrorName].value.(string)
- tracker.finalizeWithError(serial, sequence, Error{name, msg.Body})
- }
- return serial
-}
-
-func (tracker *callTracker) handleSendError(msg *Message, err error) {
- if err == nil {
- return
- }
- tracker.lck.RLock()
- _, ok := tracker.calls[msg.serial]
- tracker.lck.RUnlock()
- if ok {
- tracker.finalizeWithError(msg.serial, NoSequence, err)
- }
-}
-
-// finalize was the only func that did not strobe Done
-func (tracker *callTracker) finalize(sn uint32) {
- tracker.lck.Lock()
- defer tracker.lck.Unlock()
- c, ok := tracker.calls[sn]
- if ok {
- delete(tracker.calls, sn)
- c.ContextCancel()
- }
-}
-
-func (tracker *callTracker) finalizeWithBody(sn uint32, sequence Sequence, body []interface{}) {
- tracker.lck.Lock()
- c, ok := tracker.calls[sn]
- if ok {
- delete(tracker.calls, sn)
- }
- tracker.lck.Unlock()
- if ok {
- c.Body = body
- c.ResponseSequence = sequence
- c.done()
- }
-}
-
-func (tracker *callTracker) finalizeWithError(sn uint32, sequence Sequence, err error) {
- tracker.lck.Lock()
- c, ok := tracker.calls[sn]
- if ok {
- delete(tracker.calls, sn)
- }
- tracker.lck.Unlock()
- if ok {
- c.Err = err
- c.ResponseSequence = sequence
- c.done()
- }
-}
-
-func (tracker *callTracker) finalizeAllWithError(sequenceGen *sequenceGenerator, err error) {
- tracker.lck.Lock()
- closedCalls := make([]*Call, 0, len(tracker.calls))
- for sn := range tracker.calls {
- closedCalls = append(closedCalls, tracker.calls[sn])
- }
- tracker.calls = map[uint32]*Call{}
- tracker.lck.Unlock()
- for _, call := range closedCalls {
- call.Err = err
- call.ResponseSequence = sequenceGen.next()
- call.done()
- }
-}
diff --git a/vendor/github.com/godbus/dbus/v5/conn_darwin.go b/vendor/github.com/godbus/dbus/v5/conn_darwin.go
deleted file mode 100644
index 6e2e40202..000000000
--- a/vendor/github.com/godbus/dbus/v5/conn_darwin.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package dbus
-
-import (
- "errors"
- "fmt"
- "os"
- "os/exec"
-)
-
-const defaultSystemBusAddress = "unix:path=/opt/local/var/run/dbus/system_bus_socket"
-
-func getSessionBusPlatformAddress() (string, error) {
- cmd := exec.Command("launchctl", "getenv", "DBUS_LAUNCHD_SESSION_BUS_SOCKET")
- b, err := cmd.CombinedOutput()
-
- if err != nil {
- return "", err
- }
-
- if len(b) == 0 {
- return "", errors.New("dbus: couldn't determine address of session bus")
- }
-
- return "unix:path=" + string(b[:len(b)-1]), nil
-}
-
-func getSystemBusPlatformAddress() string {
- address := os.Getenv("DBUS_LAUNCHD_SESSION_BUS_SOCKET")
- if address != "" {
- return fmt.Sprintf("unix:path=%s", address)
- }
- return defaultSystemBusAddress
-}
-
-func tryDiscoverDbusSessionBusAddress() string {
- return ""
-}
diff --git a/vendor/github.com/godbus/dbus/v5/conn_other.go b/vendor/github.com/godbus/dbus/v5/conn_other.go
deleted file mode 100644
index 616dcf664..000000000
--- a/vendor/github.com/godbus/dbus/v5/conn_other.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// +build !darwin
-
-package dbus
-
-import (
- "bytes"
- "errors"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "os/user"
- "path"
- "strings"
-)
-
-var execCommand = exec.Command
-
-func getSessionBusPlatformAddress() (string, error) {
- cmd := execCommand("dbus-launch")
- b, err := cmd.CombinedOutput()
-
- if err != nil {
- return "", err
- }
-
- i := bytes.IndexByte(b, '=')
- j := bytes.IndexByte(b, '\n')
-
- if i == -1 || j == -1 || i > j {
- return "", errors.New("dbus: couldn't determine address of session bus")
- }
-
- env, addr := string(b[0:i]), string(b[i+1:j])
- os.Setenv(env, addr)
-
- return addr, nil
-}
-
-// tryDiscoverDbusSessionBusAddress tries to discover an existing dbus session
-// and return the value of its DBUS_SESSION_BUS_ADDRESS.
-// It tries different techniques employed by different operating systems,
-// returning the first valid address it finds, or an empty string.
-//
-// * /run/user/<uid>/bus if this exists, it *is* the bus socket. present on
-// Ubuntu 18.04
-// * /run/user/<uid>/dbus-session: if this exists, it can be parsed for the bus
-// address. present on Ubuntu 16.04
-//
-// See https://dbus.freedesktop.org/doc/dbus-launch.1.html
-func tryDiscoverDbusSessionBusAddress() string {
- if runtimeDirectory, err := getRuntimeDirectory(); err == nil {
-
- if runUserBusFile := path.Join(runtimeDirectory, "bus"); fileExists(runUserBusFile) {
- // if /run/user/<uid>/bus exists, that file itself
- // *is* the unix socket, so return its path
- return fmt.Sprintf("unix:path=%s", runUserBusFile)
- }
- if runUserSessionDbusFile := path.Join(runtimeDirectory, "dbus-session"); fileExists(runUserSessionDbusFile) {
- // if /run/user/<uid>/dbus-session exists, it's a
- // text file // containing the address of the socket, e.g.:
- // DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-E1c73yNqrG
-
- if f, err := ioutil.ReadFile(runUserSessionDbusFile); err == nil {
- fileContent := string(f)
-
- prefix := "DBUS_SESSION_BUS_ADDRESS="
-
- if strings.HasPrefix(fileContent, prefix) {
- address := strings.TrimRight(strings.TrimPrefix(fileContent, prefix), "\n\r")
- return address
- }
- }
- }
- }
- return ""
-}
-
-func getRuntimeDirectory() (string, error) {
- if currentUser, err := user.Current(); err != nil {
- return "", err
- } else {
- return fmt.Sprintf("/run/user/%s", currentUser.Uid), nil
- }
-}
-
-func fileExists(filename string) bool {
- if _, err := os.Stat(filename); !os.IsNotExist(err) {
- return true
- } else {
- return false
- }
-}
diff --git a/vendor/github.com/godbus/dbus/v5/conn_unix.go b/vendor/github.com/godbus/dbus/v5/conn_unix.go
deleted file mode 100644
index 58aee7d2a..000000000
--- a/vendor/github.com/godbus/dbus/v5/conn_unix.go
+++ /dev/null
@@ -1,17 +0,0 @@
-//+build !windows,!solaris,!darwin
-
-package dbus
-
-import (
- "os"
-)
-
-const defaultSystemBusAddress = "unix:path=/var/run/dbus/system_bus_socket"
-
-func getSystemBusPlatformAddress() string {
- address := os.Getenv("DBUS_SYSTEM_BUS_ADDRESS")
- if address != "" {
- return address
- }
- return defaultSystemBusAddress
-}
diff --git a/vendor/github.com/godbus/dbus/v5/conn_windows.go b/vendor/github.com/godbus/dbus/v5/conn_windows.go
deleted file mode 100644
index 4291e4519..000000000
--- a/vendor/github.com/godbus/dbus/v5/conn_windows.go
+++ /dev/null
@@ -1,15 +0,0 @@
-//+build windows
-
-package dbus
-
-import "os"
-
-const defaultSystemBusAddress = "tcp:host=127.0.0.1,port=12434"
-
-func getSystemBusPlatformAddress() string {
- address := os.Getenv("DBUS_SYSTEM_BUS_ADDRESS")
- if address != "" {
- return address
- }
- return defaultSystemBusAddress
-}
diff --git a/vendor/github.com/godbus/dbus/v5/dbus.go b/vendor/github.com/godbus/dbus/v5/dbus.go
deleted file mode 100644
index ddf3b7afd..000000000
--- a/vendor/github.com/godbus/dbus/v5/dbus.go
+++ /dev/null
@@ -1,432 +0,0 @@
-package dbus
-
-import (
- "errors"
- "fmt"
- "reflect"
- "strings"
-)
-
-var (
- byteType = reflect.TypeOf(byte(0))
- boolType = reflect.TypeOf(false)
- uint8Type = reflect.TypeOf(uint8(0))
- int16Type = reflect.TypeOf(int16(0))
- uint16Type = reflect.TypeOf(uint16(0))
- intType = reflect.TypeOf(int(0))
- uintType = reflect.TypeOf(uint(0))
- int32Type = reflect.TypeOf(int32(0))
- uint32Type = reflect.TypeOf(uint32(0))
- int64Type = reflect.TypeOf(int64(0))
- uint64Type = reflect.TypeOf(uint64(0))
- float64Type = reflect.TypeOf(float64(0))
- stringType = reflect.TypeOf("")
- signatureType = reflect.TypeOf(Signature{""})
- objectPathType = reflect.TypeOf(ObjectPath(""))
- variantType = reflect.TypeOf(Variant{Signature{""}, nil})
- interfacesType = reflect.TypeOf([]interface{}{})
- interfaceType = reflect.TypeOf((*interface{})(nil)).Elem()
- unixFDType = reflect.TypeOf(UnixFD(0))
- unixFDIndexType = reflect.TypeOf(UnixFDIndex(0))
- errType = reflect.TypeOf((*error)(nil)).Elem()
-)
-
-// An InvalidTypeError signals that a value which cannot be represented in the
-// D-Bus wire format was passed to a function.
-type InvalidTypeError struct {
- Type reflect.Type
-}
-
-func (e InvalidTypeError) Error() string {
- return "dbus: invalid type " + e.Type.String()
-}
-
-// Store copies the values contained in src to dest, which must be a slice of
-// pointers. It converts slices of interfaces from src to corresponding structs
-// in dest. An error is returned if the lengths of src and dest or the types of
-// their elements don't match.
-func Store(src []interface{}, dest ...interface{}) error {
- if len(src) != len(dest) {
- return errors.New("dbus.Store: length mismatch")
- }
-
- for i := range src {
- if err := storeInterfaces(src[i], dest[i]); err != nil {
- return err
- }
- }
- return nil
-}
-
-func storeInterfaces(src, dest interface{}) error {
- return store(reflect.ValueOf(dest), reflect.ValueOf(src))
-}
-
-func store(dest, src reflect.Value) error {
- if dest.Kind() == reflect.Ptr {
- if dest.IsNil() {
- dest.Set(reflect.New(dest.Type().Elem()))
- }
- return store(dest.Elem(), src)
- }
- switch src.Kind() {
- case reflect.Slice:
- return storeSlice(dest, src)
- case reflect.Map:
- return storeMap(dest, src)
- default:
- return storeBase(dest, src)
- }
-}
-
-func storeBase(dest, src reflect.Value) error {
- return setDest(dest, src)
-}
-
-func setDest(dest, src reflect.Value) error {
- if !isVariant(src.Type()) && isVariant(dest.Type()) {
- //special conversion for dbus.Variant
- dest.Set(reflect.ValueOf(MakeVariant(src.Interface())))
- return nil
- }
- if isVariant(src.Type()) && !isVariant(dest.Type()) {
- src = getVariantValue(src)
- return store(dest, src)
- }
- if !src.Type().ConvertibleTo(dest.Type()) {
- return fmt.Errorf(
- "dbus.Store: type mismatch: cannot convert %s to %s",
- src.Type(), dest.Type())
- }
- dest.Set(src.Convert(dest.Type()))
- return nil
-}
-
-func kindsAreCompatible(dest, src reflect.Type) bool {
- switch {
- case isVariant(dest):
- return true
- case dest.Kind() == reflect.Interface:
- return true
- default:
- return dest.Kind() == src.Kind()
- }
-}
-
-func isConvertibleTo(dest, src reflect.Type) bool {
- switch {
- case isVariant(dest):
- return true
- case dest.Kind() == reflect.Interface:
- return true
- case dest.Kind() == reflect.Slice:
- return src.Kind() == reflect.Slice &&
- isConvertibleTo(dest.Elem(), src.Elem())
- case dest.Kind() == reflect.Struct:
- return src == interfacesType
- default:
- return src.ConvertibleTo(dest)
- }
-}
-
-func storeMap(dest, src reflect.Value) error {
- switch {
- case !kindsAreCompatible(dest.Type(), src.Type()):
- return fmt.Errorf(
- "dbus.Store: type mismatch: "+
- "map: cannot store a value of %s into %s",
- src.Type(), dest.Type())
- case isVariant(dest.Type()):
- return storeMapIntoVariant(dest, src)
- case dest.Kind() == reflect.Interface:
- return storeMapIntoInterface(dest, src)
- case isConvertibleTo(dest.Type().Key(), src.Type().Key()) &&
- isConvertibleTo(dest.Type().Elem(), src.Type().Elem()):
- return storeMapIntoMap(dest, src)
- default:
- return fmt.Errorf(
- "dbus.Store: type mismatch: "+
- "map: cannot convert a value of %s into %s",
- src.Type(), dest.Type())
- }
-}
-
-func storeMapIntoVariant(dest, src reflect.Value) error {
- dv := reflect.MakeMap(src.Type())
- err := store(dv, src)
- if err != nil {
- return err
- }
- return storeBase(dest, dv)
-}
-
-func storeMapIntoInterface(dest, src reflect.Value) error {
- var dv reflect.Value
- if isVariant(src.Type().Elem()) {
- //Convert variants to interface{} recursively when converting
- //to interface{}
- dv = reflect.MakeMap(
- reflect.MapOf(src.Type().Key(), interfaceType))
- } else {
- dv = reflect.MakeMap(src.Type())
- }
- err := store(dv, src)
- if err != nil {
- return err
- }
- return storeBase(dest, dv)
-}
-
-func storeMapIntoMap(dest, src reflect.Value) error {
- if dest.IsNil() {
- dest.Set(reflect.MakeMap(dest.Type()))
- }
- keys := src.MapKeys()
- for _, key := range keys {
- dkey := key.Convert(dest.Type().Key())
- dval := reflect.New(dest.Type().Elem()).Elem()
- err := store(dval, getVariantValue(src.MapIndex(key)))
- if err != nil {
- return err
- }
- dest.SetMapIndex(dkey, dval)
- }
- return nil
-}
-
-func storeSlice(dest, src reflect.Value) error {
- switch {
- case src.Type() == interfacesType && dest.Kind() == reflect.Struct:
- //The decoder always decodes structs as slices of interface{}
- return storeStruct(dest, src)
- case !kindsAreCompatible(dest.Type(), src.Type()):
- return fmt.Errorf(
- "dbus.Store: type mismatch: "+
- "slice: cannot store a value of %s into %s",
- src.Type(), dest.Type())
- case isVariant(dest.Type()):
- return storeSliceIntoVariant(dest, src)
- case dest.Kind() == reflect.Interface:
- return storeSliceIntoInterface(dest, src)
- case isConvertibleTo(dest.Type().Elem(), src.Type().Elem()):
- return storeSliceIntoSlice(dest, src)
- default:
- return fmt.Errorf(
- "dbus.Store: type mismatch: "+
- "slice: cannot convert a value of %s into %s",
- src.Type(), dest.Type())
- }
-}
-
-func storeStruct(dest, src reflect.Value) error {
- if isVariant(dest.Type()) {
- return storeBase(dest, src)
- }
- dval := make([]interface{}, 0, dest.NumField())
- dtype := dest.Type()
- for i := 0; i < dest.NumField(); i++ {
- field := dest.Field(i)
- ftype := dtype.Field(i)
- if ftype.PkgPath != "" {
- continue
- }
- if ftype.Tag.Get("dbus") == "-" {
- continue
- }
- dval = append(dval, field.Addr().Interface())
- }
- if src.Len() != len(dval) {
- return fmt.Errorf(
- "dbus.Store: type mismatch: "+
- "destination struct does not have "+
- "enough fields need: %d have: %d",
- src.Len(), len(dval))
- }
- return Store(src.Interface().([]interface{}), dval...)
-}
-
-func storeSliceIntoVariant(dest, src reflect.Value) error {
- dv := reflect.MakeSlice(src.Type(), src.Len(), src.Cap())
- err := store(dv, src)
- if err != nil {
- return err
- }
- return storeBase(dest, dv)
-}
-
-func storeSliceIntoInterface(dest, src reflect.Value) error {
- var dv reflect.Value
- if isVariant(src.Type().Elem()) {
- //Convert variants to interface{} recursively when converting
- //to interface{}
- dv = reflect.MakeSlice(reflect.SliceOf(interfaceType),
- src.Len(), src.Cap())
- } else {
- dv = reflect.MakeSlice(src.Type(), src.Len(), src.Cap())
- }
- err := store(dv, src)
- if err != nil {
- return err
- }
- return storeBase(dest, dv)
-}
-
-func storeSliceIntoSlice(dest, src reflect.Value) error {
- if dest.IsNil() || dest.Len() < src.Len() {
- dest.Set(reflect.MakeSlice(dest.Type(), src.Len(), src.Cap()))
- }
- if dest.Len() != src.Len() {
- return fmt.Errorf(
- "dbus.Store: type mismatch: "+
- "slices are different lengths "+
- "need: %d have: %d",
- src.Len(), dest.Len())
- }
- for i := 0; i < src.Len(); i++ {
- err := store(dest.Index(i), getVariantValue(src.Index(i)))
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-func getVariantValue(in reflect.Value) reflect.Value {
- if isVariant(in.Type()) {
- return reflect.ValueOf(in.Interface().(Variant).Value())
- }
- return in
-}
-
-func isVariant(t reflect.Type) bool {
- return t == variantType
-}
-
-// An ObjectPath is an object path as defined by the D-Bus spec.
-type ObjectPath string
-
-// IsValid returns whether the object path is valid.
-func (o ObjectPath) IsValid() bool {
- s := string(o)
- if len(s) == 0 {
- return false
- }
- if s[0] != '/' {
- return false
- }
- if s[len(s)-1] == '/' && len(s) != 1 {
- return false
- }
- // probably not used, but technically possible
- if s == "/" {
- return true
- }
- split := strings.Split(s[1:], "/")
- for _, v := range split {
- if len(v) == 0 {
- return false
- }
- for _, c := range v {
- if !isMemberChar(c) {
- return false
- }
- }
- }
- return true
-}
-
-// A UnixFD is a Unix file descriptor sent over the wire. See the package-level
-// documentation for more information about Unix file descriptor passsing.
-type UnixFD int32
-
-// A UnixFDIndex is the representation of a Unix file descriptor in a message.
-type UnixFDIndex uint32
-
-// alignment returns the alignment of values of type t.
-func alignment(t reflect.Type) int {
- switch t {
- case variantType:
- return 1
- case objectPathType:
- return 4
- case signatureType:
- return 1
- case interfacesType:
- return 4
- }
- switch t.Kind() {
- case reflect.Uint8:
- return 1
- case reflect.Uint16, reflect.Int16:
- return 2
- case reflect.Uint, reflect.Int, reflect.Uint32, reflect.Int32, reflect.String, reflect.Array, reflect.Slice, reflect.Map:
- return 4
- case reflect.Uint64, reflect.Int64, reflect.Float64, reflect.Struct:
- return 8
- case reflect.Ptr:
- return alignment(t.Elem())
- }
- return 1
-}
-
-// isKeyType returns whether t is a valid type for a D-Bus dict.
-func isKeyType(t reflect.Type) bool {
- switch t.Kind() {
- case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
- reflect.Int16, reflect.Int32, reflect.Int64, reflect.Float64,
- reflect.String, reflect.Uint, reflect.Int:
-
- return true
- }
- return false
-}
-
-// isValidInterface returns whether s is a valid name for an interface.
-func isValidInterface(s string) bool {
- if len(s) == 0 || len(s) > 255 || s[0] == '.' {
- return false
- }
- elem := strings.Split(s, ".")
- if len(elem) < 2 {
- return false
- }
- for _, v := range elem {
- if len(v) == 0 {
- return false
- }
- if v[0] >= '0' && v[0] <= '9' {
- return false
- }
- for _, c := range v {
- if !isMemberChar(c) {
- return false
- }
- }
- }
- return true
-}
-
-// isValidMember returns whether s is a valid name for a member.
-func isValidMember(s string) bool {
- if len(s) == 0 || len(s) > 255 {
- return false
- }
- i := strings.Index(s, ".")
- if i != -1 {
- return false
- }
- if s[0] >= '0' && s[0] <= '9' {
- return false
- }
- for _, c := range s {
- if !isMemberChar(c) {
- return false
- }
- }
- return true
-}
-
-func isMemberChar(c rune) bool {
- return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') ||
- (c >= 'a' && c <= 'z') || c == '_'
-}
diff --git a/vendor/github.com/godbus/dbus/v5/decoder.go b/vendor/github.com/godbus/dbus/v5/decoder.go
deleted file mode 100644
index ede91575b..000000000
--- a/vendor/github.com/godbus/dbus/v5/decoder.go
+++ /dev/null
@@ -1,286 +0,0 @@
-package dbus
-
-import (
- "encoding/binary"
- "io"
- "reflect"
-)
-
-type decoder struct {
- in io.Reader
- order binary.ByteOrder
- pos int
-}
-
-// newDecoder returns a new decoder that reads values from in. The input is
-// expected to be in the given byte order.
-func newDecoder(in io.Reader, order binary.ByteOrder) *decoder {
- dec := new(decoder)
- dec.in = in
- dec.order = order
- return dec
-}
-
-// align aligns the input to the given boundary and panics on error.
-func (dec *decoder) align(n int) {
- if dec.pos%n != 0 {
- newpos := (dec.pos + n - 1) & ^(n - 1)
- empty := make([]byte, newpos-dec.pos)
- if _, err := io.ReadFull(dec.in, empty); err != nil {
- panic(err)
- }
- dec.pos = newpos
- }
-}
-
-// Calls binary.Read(dec.in, dec.order, v) and panics on read errors.
-func (dec *decoder) binread(v interface{}) {
- if err := binary.Read(dec.in, dec.order, v); err != nil {
- panic(err)
- }
-}
-
-func (dec *decoder) Decode(sig Signature) (vs []interface{}, err error) {
- defer func() {
- var ok bool
- v := recover()
- if err, ok = v.(error); ok {
- if err == io.EOF || err == io.ErrUnexpectedEOF {
- err = FormatError("unexpected EOF")
- }
- }
- }()
- vs = make([]interface{}, 0)
- s := sig.str
- for s != "" {
- err, rem := validSingle(s, 0)
- if err != nil {
- return nil, err
- }
- v := dec.decode(s[:len(s)-len(rem)], 0)
- vs = append(vs, v)
- s = rem
- }
- return vs, nil
-}
-
-func (dec *decoder) decode(s string, depth int) interface{} {
- dec.align(alignment(typeFor(s)))
- switch s[0] {
- case 'y':
- var b [1]byte
- if _, err := dec.in.Read(b[:]); err != nil {
- panic(err)
- }
- dec.pos++
- return b[0]
- case 'b':
- i := dec.decode("u", depth).(uint32)
- switch {
- case i == 0:
- return false
- case i == 1:
- return true
- default:
- panic(FormatError("invalid value for boolean"))
- }
- case 'n':
- var i int16
- dec.binread(&i)
- dec.pos += 2
- return i
- case 'i':
- var i int32
- dec.binread(&i)
- dec.pos += 4
- return i
- case 'x':
- var i int64
- dec.binread(&i)
- dec.pos += 8
- return i
- case 'q':
- var i uint16
- dec.binread(&i)
- dec.pos += 2
- return i
- case 'u':
- var i uint32
- dec.binread(&i)
- dec.pos += 4
- return i
- case 't':
- var i uint64
- dec.binread(&i)
- dec.pos += 8
- return i
- case 'd':
- var f float64
- dec.binread(&f)
- dec.pos += 8
- return f
- case 's':
- length := dec.decode("u", depth).(uint32)
- b := make([]byte, int(length)+1)
- if _, err := io.ReadFull(dec.in, b); err != nil {
- panic(err)
- }
- dec.pos += int(length) + 1
- return string(b[:len(b)-1])
- case 'o':
- return ObjectPath(dec.decode("s", depth).(string))
- case 'g':
- length := dec.decode("y", depth).(byte)
- b := make([]byte, int(length)+1)
- if _, err := io.ReadFull(dec.in, b); err != nil {
- panic(err)
- }
- dec.pos += int(length) + 1
- sig, err := ParseSignature(string(b[:len(b)-1]))
- if err != nil {
- panic(err)
- }
- return sig
- case 'v':
- if depth >= 64 {
- panic(FormatError("input exceeds container depth limit"))
- }
- var variant Variant
- sig := dec.decode("g", depth).(Signature)
- if len(sig.str) == 0 {
- panic(FormatError("variant signature is empty"))
- }
- err, rem := validSingle(sig.str, 0)
- if err != nil {
- panic(err)
- }
- if rem != "" {
- panic(FormatError("variant signature has multiple types"))
- }
- variant.sig = sig
- variant.value = dec.decode(sig.str, depth+1)
- return variant
- case 'h':
- return UnixFDIndex(dec.decode("u", depth).(uint32))
- case 'a':
- if len(s) > 1 && s[1] == '{' {
- ksig := s[2:3]
- vsig := s[3 : len(s)-1]
- v := reflect.MakeMap(reflect.MapOf(typeFor(ksig), typeFor(vsig)))
- if depth >= 63 {
- panic(FormatError("input exceeds container depth limit"))
- }
- length := dec.decode("u", depth).(uint32)
- // Even for empty maps, the correct padding must be included
- dec.align(8)
- spos := dec.pos
- for dec.pos < spos+int(length) {
- dec.align(8)
- if !isKeyType(v.Type().Key()) {
- panic(InvalidTypeError{v.Type()})
- }
- kv := dec.decode(ksig, depth+2)
- vv := dec.decode(vsig, depth+2)
- v.SetMapIndex(reflect.ValueOf(kv), reflect.ValueOf(vv))
- }
- return v.Interface()
- }
- if depth >= 64 {
- panic(FormatError("input exceeds container depth limit"))
- }
- sig := s[1:]
- length := dec.decode("u", depth).(uint32)
- // 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
- align := alignment(typeFor(s[1:]))
- if len(s) > 1 && s[1] == '(' {
- //Special case for arrays of structs
- //structs decode as a slice of interface{} values
- //but the dbus alignment does not match this
- align = 8
- }
- dec.align(align)
- spos := dec.pos
- for dec.pos < spos+int(length) {
- ev := dec.decode(s[1:], depth+1)
- v = reflect.Append(v, reflect.ValueOf(ev))
- }
- return v.Interface()
- case '(':
- if depth >= 64 {
- panic(FormatError("input exceeds container depth limit"))
- }
- dec.align(8)
- v := make([]interface{}, 0)
- s = s[1 : len(s)-1]
- for s != "" {
- err, rem := validSingle(s, 0)
- if err != nil {
- panic(err)
- }
- ev := dec.decode(s[:len(s)-len(rem)], depth+1)
- v = append(v, ev)
- s = rem
- }
- return v
- default:
- panic(SignatureError{Sig: s})
- }
-}
-
-// 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.
-type FormatError string
-
-func (e FormatError) Error() string {
- return "dbus: wire format error: " + string(e)
-}
diff --git a/vendor/github.com/godbus/dbus/v5/default_handler.go b/vendor/github.com/godbus/dbus/v5/default_handler.go
deleted file mode 100644
index 13132c6b4..000000000
--- a/vendor/github.com/godbus/dbus/v5/default_handler.go
+++ /dev/null
@@ -1,342 +0,0 @@
-package dbus
-
-import (
- "bytes"
- "reflect"
- "strings"
- "sync"
-)
-
-func newIntrospectIntf(h *defaultHandler) *exportedIntf {
- methods := make(map[string]Method)
- methods["Introspect"] = exportedMethod{
- reflect.ValueOf(func(msg Message) (string, *Error) {
- path := msg.Headers[FieldPath].value.(ObjectPath)
- return h.introspectPath(path), nil
- }),
- }
- return newExportedIntf(methods, true)
-}
-
-//NewDefaultHandler returns an instance of the default
-//call handler. This is useful if you want to implement only
-//one of the two handlers but not both.
-//
-// Deprecated: this is the default value, don't use it, it will be unexported.
-func NewDefaultHandler() *defaultHandler {
- h := &defaultHandler{
- objects: make(map[ObjectPath]*exportedObj),
- defaultIntf: make(map[string]*exportedIntf),
- }
- h.defaultIntf["org.freedesktop.DBus.Introspectable"] = newIntrospectIntf(h)
- return h
-}
-
-type defaultHandler struct {
- sync.RWMutex
- objects map[ObjectPath]*exportedObj
- defaultIntf map[string]*exportedIntf
-}
-
-func (h *defaultHandler) PathExists(path ObjectPath) bool {
- _, ok := h.objects[path]
- return ok
-}
-
-func (h *defaultHandler) introspectPath(path ObjectPath) string {
- subpath := make(map[string]struct{})
- var xml bytes.Buffer
- xml.WriteString("<node>")
- for obj := range h.objects {
- p := string(path)
- if p != "/" {
- p += "/"
- }
- if strings.HasPrefix(string(obj), p) {
- node_name := strings.Split(string(obj[len(p):]), "/")[0]
- subpath[node_name] = struct{}{}
- }
- }
- for s := range subpath {
- xml.WriteString("\n\t<node name=\"" + s + "\"/>")
- }
- xml.WriteString("\n</node>")
- return xml.String()
-}
-
-func (h *defaultHandler) LookupObject(path ObjectPath) (ServerObject, bool) {
- h.RLock()
- defer h.RUnlock()
- object, ok := h.objects[path]
- if ok {
- return object, ok
- }
-
- // If an object wasn't found for this exact path,
- // look for a matching subtree registration
- subtreeObject := newExportedObject()
- path = path[:strings.LastIndex(string(path), "/")]
- for len(path) > 0 {
- object, ok = h.objects[path]
- if ok {
- for name, iface := range object.interfaces {
- // Only include this handler if it registered for the subtree
- if iface.isFallbackInterface() {
- subtreeObject.interfaces[name] = iface
- }
- }
- break
- }
-
- path = path[:strings.LastIndex(string(path), "/")]
- }
-
- for name, intf := range h.defaultIntf {
- if _, exists := subtreeObject.interfaces[name]; exists {
- continue
- }
- subtreeObject.interfaces[name] = intf
- }
-
- return subtreeObject, true
-}
-
-func (h *defaultHandler) AddObject(path ObjectPath, object *exportedObj) {
- h.Lock()
- h.objects[path] = object
- h.Unlock()
-}
-
-func (h *defaultHandler) DeleteObject(path ObjectPath) {
- h.Lock()
- delete(h.objects, path)
- h.Unlock()
-}
-
-type exportedMethod struct {
- reflect.Value
-}
-
-func (m exportedMethod) Call(args ...interface{}) ([]interface{}, error) {
- t := m.Type()
-
- params := make([]reflect.Value, len(args))
- for i := 0; i < len(args); i++ {
- params[i] = reflect.ValueOf(args[i]).Elem()
- }
-
- ret := m.Value.Call(params)
- var err error
- nilErr := false // The reflection will find almost-nils, let's only pass back clean ones!
- if t.NumOut() > 0 {
- if e, ok := ret[t.NumOut()-1].Interface().(*Error); ok { // godbus *Error
- nilErr = ret[t.NumOut()-1].IsNil()
- ret = ret[:t.NumOut()-1]
- err = e
- } else if ret[t.NumOut()-1].Type().Implements(errType) { // Go error
- i := ret[t.NumOut()-1].Interface()
- if i == nil {
- nilErr = ret[t.NumOut()-1].IsNil()
- } else {
- err = i.(error)
- }
- ret = ret[:t.NumOut()-1]
- }
- }
- out := make([]interface{}, len(ret))
- for i, val := range ret {
- out[i] = val.Interface()
- }
- if nilErr || err == nil {
- //concrete type to interface nil is a special case
- return out, nil
- }
- return out, err
-}
-
-func (m exportedMethod) NumArguments() int {
- return m.Value.Type().NumIn()
-}
-
-func (m exportedMethod) ArgumentValue(i int) interface{} {
- return reflect.Zero(m.Type().In(i)).Interface()
-}
-
-func (m exportedMethod) NumReturns() int {
- return m.Value.Type().NumOut()
-}
-
-func (m exportedMethod) ReturnValue(i int) interface{} {
- return reflect.Zero(m.Type().Out(i)).Interface()
-}
-
-func newExportedObject() *exportedObj {
- return &exportedObj{
- interfaces: make(map[string]*exportedIntf),
- }
-}
-
-type exportedObj struct {
- mu sync.RWMutex
- interfaces map[string]*exportedIntf
-}
-
-func (obj *exportedObj) LookupInterface(name string) (Interface, bool) {
- if name == "" {
- return obj, true
- }
- obj.mu.RLock()
- defer obj.mu.RUnlock()
- intf, exists := obj.interfaces[name]
- return intf, exists
-}
-
-func (obj *exportedObj) AddInterface(name string, iface *exportedIntf) {
- obj.mu.Lock()
- defer obj.mu.Unlock()
- obj.interfaces[name] = iface
-}
-
-func (obj *exportedObj) DeleteInterface(name string) {
- obj.mu.Lock()
- defer obj.mu.Unlock()
- delete(obj.interfaces, name)
-}
-
-func (obj *exportedObj) LookupMethod(name string) (Method, bool) {
- obj.mu.RLock()
- defer obj.mu.RUnlock()
- for _, intf := range obj.interfaces {
- method, exists := intf.LookupMethod(name)
- if exists {
- return method, exists
- }
- }
- return nil, false
-}
-
-func (obj *exportedObj) isFallbackInterface() bool {
- return false
-}
-
-func newExportedIntf(methods map[string]Method, includeSubtree bool) *exportedIntf {
- return &exportedIntf{
- methods: methods,
- includeSubtree: includeSubtree,
- }
-}
-
-type exportedIntf struct {
- methods map[string]Method
-
- // Whether or not this export is for the entire subtree
- includeSubtree bool
-}
-
-func (obj *exportedIntf) LookupMethod(name string) (Method, bool) {
- out, exists := obj.methods[name]
- return out, exists
-}
-
-func (obj *exportedIntf) isFallbackInterface() bool {
- return obj.includeSubtree
-}
-
-//NewDefaultSignalHandler returns an instance of the default
-//signal handler. This is useful if you want to implement only
-//one of the two handlers but not both.
-//
-// Deprecated: this is the default value, don't use it, it will be unexported.
-func NewDefaultSignalHandler() *defaultSignalHandler {
- return &defaultSignalHandler{}
-}
-
-type defaultSignalHandler struct {
- mu sync.RWMutex
- closed bool
- signals []*signalChannelData
-}
-
-func (sh *defaultSignalHandler) DeliverSignal(intf, name string, signal *Signal) {
- sh.mu.RLock()
- defer sh.mu.RUnlock()
- if sh.closed {
- return
- }
- for _, scd := range sh.signals {
- scd.deliver(signal)
- }
-}
-
-func (sh *defaultSignalHandler) Terminate() {
- sh.mu.Lock()
- defer sh.mu.Unlock()
- if sh.closed {
- return
- }
-
- for _, scd := range sh.signals {
- scd.close()
- close(scd.ch)
- }
- sh.closed = true
- sh.signals = nil
-}
-
-func (sh *defaultSignalHandler) AddSignal(ch chan<- *Signal) {
- sh.mu.Lock()
- 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 {
- return
- }
- for i := len(sh.signals) - 1; i >= 0; i-- {
- if ch == sh.signals[i].ch {
- sh.signals[i].close()
- copy(sh.signals[i:], sh.signals[i+1:])
- sh.signals[len(sh.signals)-1] = nil
- 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
-}
diff --git a/vendor/github.com/godbus/dbus/v5/doc.go b/vendor/github.com/godbus/dbus/v5/doc.go
deleted file mode 100644
index ade1df951..000000000
--- a/vendor/github.com/godbus/dbus/v5/doc.go
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-Package dbus implements bindings to the D-Bus message bus system.
-
-To use the message bus API, you first need to connect to a bus (usually the
-session or system bus). The acquired connection then can be used to call methods
-on remote objects and emit or receive signals. Using the Export method, you can
-arrange D-Bus methods calls to be directly translated to method calls on a Go
-value.
-
-Conversion Rules
-
-For outgoing messages, Go types are automatically converted to the
-corresponding D-Bus types. The following types are directly encoded as their
-respective D-Bus equivalents:
-
- Go type | D-Bus type
- ------------+-----------
- byte | BYTE
- bool | BOOLEAN
- int16 | INT16
- uint16 | UINT16
- int | INT32
- uint | UINT32
- int32 | INT32
- uint32 | UINT32
- int64 | INT64
- uint64 | UINT64
- float64 | DOUBLE
- string | STRING
- ObjectPath | OBJECT_PATH
- Signature | SIGNATURE
- Variant | VARIANT
- interface{} | VARIANT
- UnixFDIndex | UNIX_FD
-
-Slices and arrays encode as ARRAYs of their element type.
-
-Maps encode as DICTs, provided that their key type can be used as a key for
-a DICT.
-
-Structs other than Variant and Signature encode as a STRUCT containing their
-exported fields. Fields whose tags contain `dbus:"-"` and unexported fields will
-be skipped.
-
-Pointers encode as the value they're pointed to.
-
-Types convertible to one of the base types above will be mapped as the
-base type.
-
-Trying to encode any other type or a slice, map or struct containing an
-unsupported type will result in an InvalidTypeError.
-
-For incoming messages, the inverse of these rules are used, with the exception
-of STRUCTs. Incoming STRUCTS are represented as a slice of empty interfaces
-containing the struct fields in the correct order. The Store function can be
-used to convert such values to Go structs.
-
-Unix FD passing
-
-Handling Unix file descriptors deserves special mention. To use them, you should
-first check that they are supported on a connection by calling SupportsUnixFDs.
-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 values being substituted by the correct indices. Similarly, the indices
-of incoming messages are automatically resolved. It shouldn't be necessary to use
-UnixFDIndex.
-
-*/
-package dbus
diff --git a/vendor/github.com/godbus/dbus/v5/encoder.go b/vendor/github.com/godbus/dbus/v5/encoder.go
deleted file mode 100644
index adfbb75c5..000000000
--- a/vendor/github.com/godbus/dbus/v5/encoder.go
+++ /dev/null
@@ -1,210 +0,0 @@
-package dbus
-
-import (
- "bytes"
- "encoding/binary"
- "io"
- "reflect"
-)
-
-// An encoder encodes values to the D-Bus wire format.
-type encoder struct {
- out io.Writer
- order binary.ByteOrder
- pos int
-}
-
-// NewEncoder returns a new encoder that writes to out in the given byte order.
-func newEncoder(out io.Writer, order binary.ByteOrder) *encoder {
- return newEncoderAtOffset(out, 0, order)
-}
-
-// newEncoderAtOffset returns a new encoder that writes to out in the given
-// byte order. Specify the offset to initialize pos for proper alignment
-// computation.
-func newEncoderAtOffset(out io.Writer, offset int, order binary.ByteOrder) *encoder {
- enc := new(encoder)
- enc.out = out
- enc.order = order
- enc.pos = offset
- return enc
-}
-
-// Aligns the next output to be on a multiple of n. Panics on write errors.
-func (enc *encoder) align(n int) {
- pad := enc.padding(0, n)
- if pad > 0 {
- empty := make([]byte, pad)
- if _, err := enc.out.Write(empty); err != nil {
- panic(err)
- }
- enc.pos += pad
- }
-}
-
-// pad returns the number of bytes of padding, based on current position and additional offset.
-// and alignment.
-func (enc *encoder) padding(offset, algn int) int {
- abs := enc.pos + offset
- if abs%algn != 0 {
- newabs := (abs + algn - 1) & ^(algn - 1)
- return newabs - abs
- }
- return 0
-}
-
-// Calls binary.Write(enc.out, enc.order, v) and panics on write errors.
-func (enc *encoder) binwrite(v interface{}) {
- if err := binary.Write(enc.out, enc.order, v); err != nil {
- panic(err)
- }
-}
-
-// Encode encodes the given values to the underlying reader. All written values
-// are aligned properly as required by the D-Bus spec.
-func (enc *encoder) Encode(vs ...interface{}) (err error) {
- defer func() {
- err, _ = recover().(error)
- }()
- for _, v := range vs {
- enc.encode(reflect.ValueOf(v), 0)
- }
- return nil
-}
-
-// encode encodes the given value to the writer and panics on error. depth holds
-// the depth of the container nesting.
-func (enc *encoder) encode(v reflect.Value, depth int) {
- enc.align(alignment(v.Type()))
- switch v.Kind() {
- case reflect.Uint8:
- var b [1]byte
- b[0] = byte(v.Uint())
- if _, err := enc.out.Write(b[:]); err != nil {
- panic(err)
- }
- enc.pos++
- case reflect.Bool:
- if v.Bool() {
- enc.encode(reflect.ValueOf(uint32(1)), depth)
- } else {
- enc.encode(reflect.ValueOf(uint32(0)), depth)
- }
- case reflect.Int16:
- enc.binwrite(int16(v.Int()))
- enc.pos += 2
- case reflect.Uint16:
- enc.binwrite(uint16(v.Uint()))
- enc.pos += 2
- case reflect.Int, reflect.Int32:
- enc.binwrite(int32(v.Int()))
- enc.pos += 4
- case reflect.Uint, reflect.Uint32:
- enc.binwrite(uint32(v.Uint()))
- enc.pos += 4
- case reflect.Int64:
- enc.binwrite(v.Int())
- enc.pos += 8
- case reflect.Uint64:
- enc.binwrite(v.Uint())
- enc.pos += 8
- case reflect.Float64:
- enc.binwrite(v.Float())
- enc.pos += 8
- case reflect.String:
- enc.encode(reflect.ValueOf(uint32(len(v.String()))), depth)
- b := make([]byte, v.Len()+1)
- copy(b, v.String())
- b[len(b)-1] = 0
- n, err := enc.out.Write(b)
- if err != nil {
- panic(err)
- }
- enc.pos += n
- case reflect.Ptr:
- enc.encode(v.Elem(), depth)
- case reflect.Slice, reflect.Array:
- if depth >= 64 {
- panic(FormatError("input exceeds container depth limit"))
- }
- // Lookahead offset: 4 bytes for uint32 length (with alignment),
- // plus alignment for elements.
- n := enc.padding(0, 4) + 4
- offset := enc.pos + n + enc.padding(n, alignment(v.Type().Elem()))
-
- var buf bytes.Buffer
- bufenc := newEncoderAtOffset(&buf, offset, enc.order)
-
- for i := 0; i < v.Len(); i++ {
- bufenc.encode(v.Index(i), depth+1)
- }
- enc.encode(reflect.ValueOf(uint32(buf.Len())), depth)
- length := buf.Len()
- enc.align(alignment(v.Type().Elem()))
- if _, err := buf.WriteTo(enc.out); err != nil {
- panic(err)
- }
- enc.pos += length
- case reflect.Struct:
- if depth >= 64 && v.Type() != signatureType {
- panic(FormatError("input exceeds container depth limit"))
- }
- switch t := v.Type(); t {
- case signatureType:
- str := v.Field(0)
- enc.encode(reflect.ValueOf(byte(str.Len())), depth+1)
- b := make([]byte, str.Len()+1)
- copy(b, str.String())
- b[len(b)-1] = 0
- n, err := enc.out.Write(b)
- if err != nil {
- panic(err)
- }
- enc.pos += n
- case variantType:
- variant := v.Interface().(Variant)
- enc.encode(reflect.ValueOf(variant.sig), depth+1)
- enc.encode(reflect.ValueOf(variant.value), depth+1)
- default:
- for i := 0; i < v.Type().NumField(); i++ {
- field := t.Field(i)
- if field.PkgPath == "" && field.Tag.Get("dbus") != "-" {
- enc.encode(v.Field(i), depth+1)
- }
- }
- }
- case reflect.Map:
- // Maps are arrays of structures, so they actually increase the depth by
- // 2.
- if depth >= 63 {
- panic(FormatError("input exceeds container depth limit"))
- }
- if !isKeyType(v.Type().Key()) {
- panic(InvalidTypeError{v.Type()})
- }
- keys := v.MapKeys()
- // Lookahead offset: 4 bytes for uint32 length (with alignment),
- // plus 8-byte alignment
- n := enc.padding(0, 4) + 4
- offset := enc.pos + n + enc.padding(n, 8)
-
- var buf bytes.Buffer
- bufenc := newEncoderAtOffset(&buf, offset, enc.order)
- for _, k := range keys {
- bufenc.align(8)
- bufenc.encode(k, depth+2)
- bufenc.encode(v.MapIndex(k), depth+2)
- }
- enc.encode(reflect.ValueOf(uint32(buf.Len())), depth)
- length := buf.Len()
- enc.align(8)
- if _, err := buf.WriteTo(enc.out); err != nil {
- panic(err)
- }
- enc.pos += length
- case reflect.Interface:
- enc.encode(reflect.ValueOf(MakeVariant(v.Interface())), depth)
- default:
- panic(InvalidTypeError{v.Type()})
- }
-}
diff --git a/vendor/github.com/godbus/dbus/v5/export.go b/vendor/github.com/godbus/dbus/v5/export.go
deleted file mode 100644
index 2447b51d4..000000000
--- a/vendor/github.com/godbus/dbus/v5/export.go
+++ /dev/null
@@ -1,441 +0,0 @@
-package dbus
-
-import (
- "errors"
- "fmt"
- "reflect"
- "strings"
-)
-
-var (
- ErrMsgInvalidArg = Error{
- "org.freedesktop.DBus.Error.InvalidArgs",
- []interface{}{"Invalid type / number of args"},
- }
- ErrMsgNoObject = Error{
- "org.freedesktop.DBus.Error.NoSuchObject",
- []interface{}{"No such object"},
- }
- ErrMsgUnknownMethod = Error{
- "org.freedesktop.DBus.Error.UnknownMethod",
- []interface{}{"Unknown / invalid method"},
- }
- ErrMsgUnknownInterface = Error{
- "org.freedesktop.DBus.Error.UnknownInterface",
- []interface{}{"Object does not implement the interface"},
- }
-)
-
-func MakeFailedError(err error) *Error {
- return &Error{
- "org.freedesktop.DBus.Error.Failed",
- []interface{}{err.Error()},
- }
-}
-
-// Sender is a type which can be used in exported methods to receive the message
-// sender.
-type Sender string
-
-func computeMethodName(name string, mapping map[string]string) string {
- newname, ok := mapping[name]
- if ok {
- name = newname
- }
- return name
-}
-
-func getMethods(in interface{}, mapping map[string]string) map[string]reflect.Value {
- if in == nil {
- return nil
- }
- methods := make(map[string]reflect.Value)
- val := reflect.ValueOf(in)
- typ := val.Type()
- for i := 0; i < typ.NumMethod(); i++ {
- methtype := typ.Method(i)
- method := val.Method(i)
- t := method.Type()
- // only track valid methods must return *Error as last arg
- // and must be exported
- if t.NumOut() == 0 ||
- t.Out(t.NumOut()-1) != reflect.TypeOf(&ErrMsgInvalidArg) ||
- methtype.PkgPath != "" {
- continue
- }
- // map names while building table
- methods[computeMethodName(methtype.Name, mapping)] = method
- }
- return methods
-}
-
-func getAllMethods(in interface{}, mapping map[string]string) map[string]reflect.Value {
- if in == nil {
- return nil
- }
- methods := make(map[string]reflect.Value)
- val := reflect.ValueOf(in)
- typ := val.Type()
- for i := 0; i < typ.NumMethod(); i++ {
- methtype := typ.Method(i)
- method := val.Method(i)
- // map names while building table
- methods[computeMethodName(methtype.Name, mapping)] = method
- }
- return methods
-}
-
-func standardMethodArgumentDecode(m Method, sender string, msg *Message, body []interface{}) ([]interface{}, error) {
- pointers := make([]interface{}, m.NumArguments())
- decode := make([]interface{}, 0, len(body))
-
- for i := 0; i < m.NumArguments(); i++ {
- tp := reflect.TypeOf(m.ArgumentValue(i))
- val := reflect.New(tp)
- pointers[i] = val.Interface()
- if tp == reflect.TypeOf((*Sender)(nil)).Elem() {
- val.Elem().SetString(sender)
- } else if tp == reflect.TypeOf((*Message)(nil)).Elem() {
- val.Elem().Set(reflect.ValueOf(*msg))
- } else {
- decode = append(decode, pointers[i])
- }
- }
-
- if len(decode) != len(body) {
- return nil, ErrMsgInvalidArg
- }
-
- if err := Store(body, decode...); err != nil {
- return nil, ErrMsgInvalidArg
- }
-
- return pointers, nil
-}
-
-func (conn *Conn) decodeArguments(m Method, sender string, msg *Message) ([]interface{}, error) {
- if decoder, ok := m.(ArgumentDecoder); ok {
- return decoder.DecodeArguments(conn, sender, msg, msg.Body)
- }
- return standardMethodArgumentDecode(m, sender, msg, msg.Body)
-}
-
-// handleCall handles the given method call (i.e. looks if it's one of the
-// pre-implemented ones and searches for a corresponding handler if not).
-func (conn *Conn) handleCall(msg *Message) {
- name := msg.Headers[FieldMember].value.(string)
- path := msg.Headers[FieldPath].value.(ObjectPath)
- ifaceName, _ := msg.Headers[FieldInterface].value.(string)
- sender, hasSender := msg.Headers[FieldSender].value.(string)
- serial := msg.serial
- if ifaceName == "org.freedesktop.DBus.Peer" {
- switch name {
- case "Ping":
- conn.sendReply(sender, serial)
- case "GetMachineId":
- conn.sendReply(sender, serial, conn.uuid)
- default:
- conn.sendError(ErrMsgUnknownMethod, sender, serial)
- }
- return
- }
- if len(name) == 0 {
- conn.sendError(ErrMsgUnknownMethod, sender, serial)
- }
-
- object, ok := conn.handler.LookupObject(path)
- if !ok {
- conn.sendError(ErrMsgNoObject, sender, serial)
- return
- }
-
- iface, exists := object.LookupInterface(ifaceName)
- if !exists {
- conn.sendError(ErrMsgUnknownInterface, sender, serial)
- return
- }
-
- m, exists := iface.LookupMethod(name)
- if !exists {
- conn.sendError(ErrMsgUnknownMethod, sender, serial)
- return
- }
- args, err := conn.decodeArguments(m, sender, msg)
- if err != nil {
- conn.sendError(err, sender, serial)
- return
- }
-
- ret, err := m.Call(args...)
- if err != nil {
- conn.sendError(err, sender, serial)
- return
- }
-
- if msg.Flags&FlagNoReplyExpected == 0 {
- reply := new(Message)
- reply.Type = TypeMethodReply
- reply.Headers = make(map[HeaderField]Variant)
- if hasSender {
- reply.Headers[FieldDestination] = msg.Headers[FieldSender]
- }
- reply.Headers[FieldReplySerial] = MakeVariant(msg.serial)
- reply.Body = make([]interface{}, len(ret))
- for i := 0; i < len(ret); i++ {
- reply.Body[i] = ret[i]
- }
- reply.Headers[FieldSignature] = MakeVariant(SignatureOf(reply.Body...))
-
- conn.sendMessageAndIfClosed(reply, nil)
- }
-}
-
-// Emit emits the given signal on the message bus. The name parameter must be
-// formatted as "interface.member", e.g., "org.freedesktop.DBus.NameLost".
-func (conn *Conn) Emit(path ObjectPath, name string, values ...interface{}) error {
- if !path.IsValid() {
- return errors.New("dbus: invalid object path")
- }
- i := strings.LastIndex(name, ".")
- if i == -1 {
- return errors.New("dbus: invalid method name")
- }
- iface := name[:i]
- member := name[i+1:]
- if !isValidMember(member) {
- return errors.New("dbus: invalid method name")
- }
- if !isValidInterface(iface) {
- return errors.New("dbus: invalid interface name")
- }
- msg := new(Message)
- msg.Type = TypeSignal
- msg.Headers = make(map[HeaderField]Variant)
- msg.Headers[FieldInterface] = MakeVariant(iface)
- msg.Headers[FieldMember] = MakeVariant(member)
- msg.Headers[FieldPath] = MakeVariant(path)
- msg.Body = values
- if len(values) > 0 {
- msg.Headers[FieldSignature] = MakeVariant(SignatureOf(values...))
- }
-
- var closed bool
- conn.sendMessageAndIfClosed(msg, func() {
- closed = true
- })
- if closed {
- return ErrClosed
- }
- return nil
-}
-
-// Export registers the given value to be exported as an object on the
-// message bus.
-//
-// If a method call on the given path and interface is received, an exported
-// method with the same name is called with v as the receiver if the
-// parameters match and the last return value is of type *Error. If this
-// *Error is not nil, it is sent back to the caller as an error.
-// Otherwise, a method reply is sent with the other return values as its body.
-//
-// Any parameters with the special type Sender are set to the sender of the
-// dbus message when the method is called. Parameters of this type do not
-// contribute to the dbus signature of the method (i.e. the method is exposed
-// as if the parameters of type Sender were not there).
-//
-// Similarly, any parameters with the type Message are set to the raw message
-// received on the bus. Again, parameters of this type do not contribute to the
-// dbus signature of the method.
-//
-// Every method call is executed in a new goroutine, so the method may be called
-// in multiple goroutines at once.
-//
-// Method calls on the interface org.freedesktop.DBus.Peer will be automatically
-// handled for every object.
-//
-// Passing nil as the first parameter will cause conn to cease handling calls on
-// the given combination of path and interface.
-//
-// Export returns an error if path is not a valid path name.
-func (conn *Conn) Export(v interface{}, path ObjectPath, iface string) error {
- return conn.ExportWithMap(v, nil, path, iface)
-}
-
-// ExportAll registers all exported methods defined by the given object on
-// the message bus.
-//
-// Unlike Export there is no requirement to have the last parameter as type
-// *Error. If you want to be able to return error then you can append an error
-// type parameter to your method signature. If the error returned is not nil,
-// it is sent back to the caller as an error. Otherwise, a method reply is
-// sent with the other return values as its body.
-func (conn *Conn) ExportAll(v interface{}, path ObjectPath, iface string) error {
- return conn.export(getAllMethods(v, nil), path, iface, false)
-}
-
-// ExportWithMap works exactly like Export but provides the ability to remap
-// method names (e.g. export a lower-case method).
-//
-// The keys in the map are the real method names (exported on the struct), and
-// the values are the method names to be exported on DBus.
-func (conn *Conn) ExportWithMap(v interface{}, mapping map[string]string, path ObjectPath, iface string) error {
- return conn.export(getMethods(v, mapping), path, iface, false)
-}
-
-// ExportSubtree works exactly like Export but registers the given value for
-// an entire subtree rather under the root path provided.
-//
-// In order to make this useful, one parameter in each of the value's exported
-// methods should be a Message, in which case it will contain the raw message
-// (allowing one to get access to the path that caused the method to be called).
-//
-// Note that more specific export paths take precedence over less specific. For
-// example, a method call using the ObjectPath /foo/bar/baz will call a method
-// exported on /foo/bar before a method exported on /foo.
-func (conn *Conn) ExportSubtree(v interface{}, path ObjectPath, iface string) error {
- return conn.ExportSubtreeWithMap(v, nil, path, iface)
-}
-
-// ExportSubtreeWithMap works exactly like ExportSubtree but provides the
-// ability to remap method names (e.g. export a lower-case method).
-//
-// The keys in the map are the real method names (exported on the struct), and
-// the values are the method names to be exported on DBus.
-func (conn *Conn) ExportSubtreeWithMap(v interface{}, mapping map[string]string, path ObjectPath, iface string) error {
- return conn.export(getMethods(v, mapping), path, iface, true)
-}
-
-// ExportMethodTable like Export registers the given methods as an object
-// on the message bus. Unlike Export the it uses a method table to define
-// the object instead of a native go object.
-//
-// The method table is a map from method name to function closure
-// representing the method. This allows an object exported on the bus to not
-// necessarily be a native go object. It can be useful for generating exposed
-// methods on the fly.
-//
-// Any non-function objects in the method table are ignored.
-func (conn *Conn) ExportMethodTable(methods map[string]interface{}, path ObjectPath, iface string) error {
- return conn.exportMethodTable(methods, path, iface, false)
-}
-
-// Like ExportSubtree, but with the same caveats as ExportMethodTable.
-func (conn *Conn) ExportSubtreeMethodTable(methods map[string]interface{}, path ObjectPath, iface string) error {
- return conn.exportMethodTable(methods, path, iface, true)
-}
-
-func (conn *Conn) exportMethodTable(methods map[string]interface{}, path ObjectPath, iface string, includeSubtree bool) error {
- var out map[string]reflect.Value
- if methods != nil {
- out = make(map[string]reflect.Value)
- for name, method := range methods {
- rval := reflect.ValueOf(method)
- if rval.Kind() != reflect.Func {
- continue
- }
- t := rval.Type()
- // only track valid methods must return *Error as last arg
- if t.NumOut() == 0 ||
- t.Out(t.NumOut()-1) != reflect.TypeOf(&ErrMsgInvalidArg) {
- continue
- }
- out[name] = rval
- }
- }
- return conn.export(out, path, iface, includeSubtree)
-}
-
-func (conn *Conn) unexport(h *defaultHandler, path ObjectPath, iface string) error {
- if h.PathExists(path) {
- obj := h.objects[path]
- obj.DeleteInterface(iface)
- if len(obj.interfaces) == 0 {
- h.DeleteObject(path)
- }
- }
- return nil
-}
-
-// export is the worker function for all exports/registrations.
-func (conn *Conn) export(methods map[string]reflect.Value, path ObjectPath, iface string, includeSubtree bool) error {
- h, ok := conn.handler.(*defaultHandler)
- if !ok {
- return fmt.Errorf(
- `dbus: export only allowed on the default handler. Received: %T"`,
- conn.handler)
- }
-
- if !path.IsValid() {
- return fmt.Errorf(`dbus: Invalid path name: "%s"`, path)
- }
-
- // Remove a previous export if the interface is nil
- if methods == nil {
- return conn.unexport(h, path, iface)
- }
-
- // If this is the first handler for this path, make a new map to hold all
- // handlers for this path.
- if !h.PathExists(path) {
- h.AddObject(path, newExportedObject())
- }
-
- exportedMethods := make(map[string]Method)
- for name, method := range methods {
- exportedMethods[name] = exportedMethod{method}
- }
-
- // Finally, save this handler
- obj := h.objects[path]
- obj.AddInterface(iface, newExportedIntf(exportedMethods, includeSubtree))
-
- return nil
-}
-
-// ReleaseName calls org.freedesktop.DBus.ReleaseName and awaits a response.
-func (conn *Conn) ReleaseName(name string) (ReleaseNameReply, error) {
- var r uint32
- err := conn.busObj.Call("org.freedesktop.DBus.ReleaseName", 0, name).Store(&r)
- if err != nil {
- return 0, err
- }
- return ReleaseNameReply(r), nil
-}
-
-// RequestName calls org.freedesktop.DBus.RequestName and awaits a response.
-func (conn *Conn) RequestName(name string, flags RequestNameFlags) (RequestNameReply, error) {
- var r uint32
- err := conn.busObj.Call("org.freedesktop.DBus.RequestName", 0, name, flags).Store(&r)
- if err != nil {
- return 0, err
- }
- return RequestNameReply(r), nil
-}
-
-// ReleaseNameReply is the reply to a ReleaseName call.
-type ReleaseNameReply uint32
-
-const (
- ReleaseNameReplyReleased ReleaseNameReply = 1 + iota
- ReleaseNameReplyNonExistent
- ReleaseNameReplyNotOwner
-)
-
-// RequestNameFlags represents the possible flags for a RequestName call.
-type RequestNameFlags uint32
-
-const (
- NameFlagAllowReplacement RequestNameFlags = 1 << iota
- NameFlagReplaceExisting
- NameFlagDoNotQueue
-)
-
-// RequestNameReply is the reply to a RequestName call.
-type RequestNameReply uint32
-
-const (
- RequestNameReplyPrimaryOwner RequestNameReply = 1 + iota
- RequestNameReplyInQueue
- RequestNameReplyExists
- RequestNameReplyAlreadyOwner
-)
diff --git a/vendor/github.com/godbus/dbus/v5/homedir.go b/vendor/github.com/godbus/dbus/v5/homedir.go
deleted file mode 100644
index 0b745f931..000000000
--- a/vendor/github.com/godbus/dbus/v5/homedir.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package dbus
-
-import (
- "os"
- "sync"
-)
-
-var (
- homeDir string
- homeDirLock sync.Mutex
-)
-
-func getHomeDir() string {
- homeDirLock.Lock()
- defer homeDirLock.Unlock()
-
- if homeDir != "" {
- return homeDir
- }
-
- homeDir = os.Getenv("HOME")
- if homeDir != "" {
- return homeDir
- }
-
- homeDir = lookupHomeDir()
- return homeDir
-}
diff --git a/vendor/github.com/godbus/dbus/v5/homedir_dynamic.go b/vendor/github.com/godbus/dbus/v5/homedir_dynamic.go
deleted file mode 100644
index 2732081e7..000000000
--- a/vendor/github.com/godbus/dbus/v5/homedir_dynamic.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// +build !static_build
-
-package dbus
-
-import (
- "os/user"
-)
-
-func lookupHomeDir() string {
- u, err := user.Current()
- if err != nil {
- return "/"
- }
- return u.HomeDir
-}
diff --git a/vendor/github.com/godbus/dbus/v5/homedir_static.go b/vendor/github.com/godbus/dbus/v5/homedir_static.go
deleted file mode 100644
index b9d9cb552..000000000
--- a/vendor/github.com/godbus/dbus/v5/homedir_static.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build static_build
-
-package dbus
-
-import (
- "bufio"
- "os"
- "strconv"
- "strings"
-)
-
-func lookupHomeDir() string {
- myUid := os.Getuid()
-
- f, err := os.Open("/etc/passwd")
- if err != nil {
- return "/"
- }
- defer f.Close()
-
- s := bufio.NewScanner(f)
-
- for s.Scan() {
- if err := s.Err(); err != nil {
- break
- }
-
- line := strings.TrimSpace(s.Text())
- if line == "" {
- continue
- }
-
- parts := strings.Split(line, ":")
-
- if len(parts) >= 6 {
- uid, err := strconv.Atoi(parts[2])
- if err == nil && uid == myUid {
- return parts[5]
- }
- }
- }
-
- // Default to / if we can't get a better value
- return "/"
-}
diff --git a/vendor/github.com/godbus/dbus/v5/match.go b/vendor/github.com/godbus/dbus/v5/match.go
deleted file mode 100644
index 5a607e53e..000000000
--- a/vendor/github.com/godbus/dbus/v5/match.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package dbus
-
-import (
- "strconv"
- "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)
-}
-
-// WithMatchArg sets argN match option, range of N is 0 to 63.
-func WithMatchArg(argIdx int, value string) MatchOption {
- if argIdx < 0 || argIdx > 63 {
- panic("range of argument index is 0 to 63")
- }
- return WithMatchOption("arg"+strconv.Itoa(argIdx), value)
-}
-
-// WithMatchArgPath sets argN path match option, range of N is 0 to 63.
-func WithMatchArgPath(argIdx int, path string) MatchOption {
- if argIdx < 0 || argIdx > 63 {
- panic("range of argument index is 0 to 63")
- }
- return WithMatchOption("arg"+strconv.Itoa(argIdx)+"path", path)
-}
-
-// WithMatchArg0Namespace sets arg0namespace match option.
-func WithMatchArg0Namespace(arg0Namespace string) MatchOption {
- return WithMatchOption("arg0namespace", arg0Namespace)
-}
-
-// WithMatchEavesdrop sets eavesdrop match option.
-func WithMatchEavesdrop(eavesdrop bool) MatchOption {
- return WithMatchOption("eavesdrop", strconv.FormatBool(eavesdrop))
-}
diff --git a/vendor/github.com/godbus/dbus/v5/message.go b/vendor/github.com/godbus/dbus/v5/message.go
deleted file mode 100644
index 6a925367e..000000000
--- a/vendor/github.com/godbus/dbus/v5/message.go
+++ /dev/null
@@ -1,353 +0,0 @@
-package dbus
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "io"
- "reflect"
- "strconv"
-)
-
-const protoVersion byte = 1
-
-// Flags represents the possible flags of a D-Bus message.
-type Flags byte
-
-const (
- // FlagNoReplyExpected signals that the message is not expected to generate
- // a reply. If this flag is set on outgoing messages, any possible reply
- // will be discarded.
- FlagNoReplyExpected Flags = 1 << iota
- // FlagNoAutoStart signals that the message bus should not automatically
- // start an application when handling this message.
- FlagNoAutoStart
- // FlagAllowInteractiveAuthorization may be set on a method call
- // message to inform the receiving side that the caller is prepared
- // to wait for interactive authorization, which might take a
- // considerable time to complete. For instance, if this flag is set,
- // it would be appropriate to query the user for passwords or
- // confirmation via Polkit or a similar framework.
- FlagAllowInteractiveAuthorization
-)
-
-// Type represents the possible types of a D-Bus message.
-type Type byte
-
-const (
- TypeMethodCall Type = 1 + iota
- TypeMethodReply
- TypeError
- TypeSignal
- typeMax
-)
-
-func (t Type) String() string {
- switch t {
- case TypeMethodCall:
- return "method call"
- case TypeMethodReply:
- return "reply"
- case TypeError:
- return "error"
- case TypeSignal:
- return "signal"
- }
- return "invalid"
-}
-
-// HeaderField represents the possible byte codes for the headers
-// of a D-Bus message.
-type HeaderField byte
-
-const (
- FieldPath HeaderField = 1 + iota
- FieldInterface
- FieldMember
- FieldErrorName
- FieldReplySerial
- FieldDestination
- FieldSender
- FieldSignature
- FieldUnixFDs
- fieldMax
-)
-
-// An InvalidMessageError describes the reason why a D-Bus message is regarded as
-// invalid.
-type InvalidMessageError string
-
-func (e InvalidMessageError) Error() string {
- return "dbus: invalid message: " + string(e)
-}
-
-// fieldType are the types of the various header fields.
-var fieldTypes = [fieldMax]reflect.Type{
- FieldPath: objectPathType,
- FieldInterface: stringType,
- FieldMember: stringType,
- FieldErrorName: stringType,
- FieldReplySerial: uint32Type,
- FieldDestination: stringType,
- FieldSender: stringType,
- FieldSignature: signatureType,
- FieldUnixFDs: uint32Type,
-}
-
-// requiredFields lists the header fields that are required by the different
-// message types.
-var requiredFields = [typeMax][]HeaderField{
- TypeMethodCall: {FieldPath, FieldMember},
- TypeMethodReply: {FieldReplySerial},
- TypeError: {FieldErrorName, FieldReplySerial},
- TypeSignal: {FieldPath, FieldInterface, FieldMember},
-}
-
-// Message represents a single D-Bus message.
-type Message struct {
- Type
- Flags
- Headers map[HeaderField]Variant
- Body []interface{}
-
- serial uint32
-}
-
-type header struct {
- Field byte
- Variant
-}
-
-// DecodeMessage tries to decode a single message in the D-Bus wire format
-// from the given reader. The byte order is figured out from the first byte.
-// The possibly returned error can be an error of the underlying reader, an
-// InvalidMessageError or a FormatError.
-func DecodeMessage(rd io.Reader) (msg *Message, err error) {
- var order binary.ByteOrder
- var hlength, length uint32
- var typ, flags, proto byte
- var headers []header
-
- b := make([]byte, 1)
- _, err = rd.Read(b)
- if err != nil {
- return
- }
- switch b[0] {
- case 'l':
- order = binary.LittleEndian
- case 'B':
- order = binary.BigEndian
- default:
- return nil, InvalidMessageError("invalid byte order")
- }
-
- dec := newDecoder(rd, order)
- dec.pos = 1
-
- msg = new(Message)
- vs, err := dec.Decode(Signature{"yyyuu"})
- if err != nil {
- return nil, err
- }
- if err = Store(vs, &typ, &flags, &proto, &length, &msg.serial); err != nil {
- return nil, err
- }
- msg.Type = Type(typ)
- msg.Flags = Flags(flags)
-
- // get the header length separately because we need it later
- b = make([]byte, 4)
- _, err = io.ReadFull(rd, b)
- if err != nil {
- return nil, err
- }
- binary.Read(bytes.NewBuffer(b), order, &hlength)
- if hlength+length+16 > 1<<27 {
- return nil, InvalidMessageError("message is too long")
- }
- dec = newDecoder(io.MultiReader(bytes.NewBuffer(b), rd), order)
- dec.pos = 12
- vs, err = dec.Decode(Signature{"a(yv)"})
- if err != nil {
- return nil, err
- }
- if err = Store(vs, &headers); err != nil {
- return nil, err
- }
-
- msg.Headers = make(map[HeaderField]Variant)
- for _, v := range headers {
- msg.Headers[HeaderField(v.Field)] = v.Variant
- }
-
- dec.align(8)
- body := make([]byte, int(length))
- if length != 0 {
- _, err := io.ReadFull(rd, body)
- if err != nil {
- return nil, err
- }
- }
-
- if err = msg.IsValid(); err != nil {
- return nil, err
- }
- sig, _ := msg.Headers[FieldSignature].value.(Signature)
- if sig.str != "" {
- buf := bytes.NewBuffer(body)
- dec = newDecoder(buf, order)
- vs, err := dec.Decode(sig)
- if err != nil {
- return nil, err
- }
- msg.Body = vs
- }
-
- return
-}
-
-// EncodeTo encodes and sends a message to the given writer. The byte order must
-// be either binary.LittleEndian or binary.BigEndian. If the message is not
-// valid or an error occurs when writing, an error is returned.
-func (msg *Message) EncodeTo(out io.Writer, order binary.ByteOrder) error {
- if err := msg.IsValid(); err != nil {
- return err
- }
- var vs [7]interface{}
- switch order {
- case binary.LittleEndian:
- vs[0] = byte('l')
- case binary.BigEndian:
- vs[0] = byte('B')
- default:
- return errors.New("dbus: invalid byte order")
- }
- body := new(bytes.Buffer)
- enc := newEncoder(body, order)
- if len(msg.Body) != 0 {
- enc.Encode(msg.Body...)
- }
- vs[1] = msg.Type
- vs[2] = msg.Flags
- vs[3] = protoVersion
- vs[4] = uint32(len(body.Bytes()))
- vs[5] = msg.serial
- headers := make([]header, 0, len(msg.Headers))
- for k, v := range msg.Headers {
- headers = append(headers, header{byte(k), v})
- }
- vs[6] = headers
- var buf bytes.Buffer
- enc = newEncoder(&buf, order)
- enc.Encode(vs[:]...)
- enc.align(8)
- body.WriteTo(&buf)
- if buf.Len() > 1<<27 {
- return InvalidMessageError("message is too long")
- }
- if _, err := buf.WriteTo(out); err != nil {
- return err
- }
- return nil
-}
-
-// IsValid checks whether msg is a valid message and returns an
-// InvalidMessageError if it is not.
-func (msg *Message) IsValid() error {
- if msg.Flags & ^(FlagNoAutoStart|FlagNoReplyExpected|FlagAllowInteractiveAuthorization) != 0 {
- return InvalidMessageError("invalid flags")
- }
- if msg.Type == 0 || msg.Type >= typeMax {
- return InvalidMessageError("invalid message type")
- }
- for k, v := range msg.Headers {
- if k == 0 || k >= fieldMax {
- return InvalidMessageError("invalid header")
- }
- if reflect.TypeOf(v.value) != fieldTypes[k] {
- return InvalidMessageError("invalid type of header field")
- }
- }
- for _, v := range requiredFields[msg.Type] {
- if _, ok := msg.Headers[v]; !ok {
- return InvalidMessageError("missing required header")
- }
- }
- if path, ok := msg.Headers[FieldPath]; ok {
- if !path.value.(ObjectPath).IsValid() {
- return InvalidMessageError("invalid path name")
- }
- }
- if iface, ok := msg.Headers[FieldInterface]; ok {
- if !isValidInterface(iface.value.(string)) {
- return InvalidMessageError("invalid interface name")
- }
- }
- if member, ok := msg.Headers[FieldMember]; ok {
- if !isValidMember(member.value.(string)) {
- return InvalidMessageError("invalid member name")
- }
- }
- if errname, ok := msg.Headers[FieldErrorName]; ok {
- if !isValidInterface(errname.value.(string)) {
- return InvalidMessageError("invalid error name")
- }
- }
- if len(msg.Body) != 0 {
- if _, ok := msg.Headers[FieldSignature]; !ok {
- return InvalidMessageError("missing signature")
- }
- }
- return nil
-}
-
-// Serial returns the message's serial number. The returned value is only valid
-// for messages received by eavesdropping.
-func (msg *Message) Serial() uint32 {
- return msg.serial
-}
-
-// String returns a string representation of a message similar to the format of
-// dbus-monitor.
-func (msg *Message) String() string {
- if err := msg.IsValid(); err != nil {
- return "<invalid>"
- }
- s := msg.Type.String()
- if v, ok := msg.Headers[FieldSender]; ok {
- s += " from " + v.value.(string)
- }
- if v, ok := msg.Headers[FieldDestination]; ok {
- s += " to " + v.value.(string)
- }
- s += " serial " + strconv.FormatUint(uint64(msg.serial), 10)
- if v, ok := msg.Headers[FieldReplySerial]; ok {
- s += " reply_serial " + strconv.FormatUint(uint64(v.value.(uint32)), 10)
- }
- if v, ok := msg.Headers[FieldUnixFDs]; ok {
- s += " unixfds " + strconv.FormatUint(uint64(v.value.(uint32)), 10)
- }
- if v, ok := msg.Headers[FieldPath]; ok {
- s += " path " + string(v.value.(ObjectPath))
- }
- if v, ok := msg.Headers[FieldInterface]; ok {
- s += " interface " + v.value.(string)
- }
- if v, ok := msg.Headers[FieldErrorName]; ok {
- s += " error " + v.value.(string)
- }
- if v, ok := msg.Headers[FieldMember]; ok {
- s += " member " + v.value.(string)
- }
- if len(msg.Body) != 0 {
- s += "\n"
- }
- for i, v := range msg.Body {
- s += " " + MakeVariant(v).String()
- if i != len(msg.Body)-1 {
- s += "\n"
- }
- }
- return s
-}
diff --git a/vendor/github.com/godbus/dbus/v5/object.go b/vendor/github.com/godbus/dbus/v5/object.go
deleted file mode 100644
index 664abb7fb..000000000
--- a/vendor/github.com/godbus/dbus/v5/object.go
+++ /dev/null
@@ -1,174 +0,0 @@
-package dbus
-
-import (
- "context"
- "errors"
- "strings"
-)
-
-// BusObject is the interface of a remote object on which methods can be
-// invoked.
-type BusObject interface {
- Call(method string, flags Flags, args ...interface{}) *Call
- CallWithContext(ctx context.Context, method string, flags Flags, args ...interface{}) *Call
- Go(method string, flags Flags, ch chan *Call, args ...interface{}) *Call
- GoWithContext(ctx context.Context, method string, flags Flags, ch chan *Call, args ...interface{}) *Call
- AddMatchSignal(iface, member string, options ...MatchOption) *Call
- RemoveMatchSignal(iface, member string, options ...MatchOption) *Call
- GetProperty(p string) (Variant, error)
- StoreProperty(p string, value interface{}) error
- SetProperty(p string, v interface{}) error
- Destination() string
- Path() ObjectPath
-}
-
-// Object represents a remote object on which methods can be invoked.
-type Object struct {
- conn *Conn
- dest string
- path ObjectPath
-}
-
-// Call calls a method with (*Object).Go and waits for its reply.
-func (o *Object) Call(method string, flags Flags, args ...interface{}) *Call {
- return <-o.createCall(context.Background(), method, flags, make(chan *Call, 1), args...).Done
-}
-
-// CallWithContext acts like Call but takes a context
-func (o *Object) CallWithContext(ctx context.Context, method string, flags Flags, args ...interface{}) *Call {
- return <-o.createCall(ctx, method, flags, make(chan *Call, 1), args...).Done
-}
-
-// AddMatchSignal subscribes BusObject to signals from specified interface,
-// 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.
-//
-// Deprecated: use (*Conn) AddMatchSignal instead.
-func (o *Object) AddMatchSignal(iface, member string, options ...MatchOption) *Call {
- base := []MatchOption{
- withMatchType("signal"),
- WithMatchInterface(iface),
- WithMatchMember(member),
- }
-
- options = append(base, options...)
- return o.conn.BusObject().Call(
- "org.freedesktop.DBus.AddMatch",
- 0,
- formatMatchOptions(options),
- )
-}
-
-// RemoveMatchSignal unsubscribes BusObject from signals from specified interface,
-// 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 {
- base := []MatchOption{
- withMatchType("signal"),
- WithMatchInterface(iface),
- WithMatchMember(member),
- }
-
- options = append(base, options...)
- return o.conn.BusObject().Call(
- "org.freedesktop.DBus.RemoveMatch",
- 0,
- formatMatchOptions(options),
- )
-}
-
-// Go calls a method with the given arguments asynchronously. It returns a
-// Call structure representing this method call. The passed channel will
-// return the same value once the call is done. If ch is nil, a new channel
-// will be allocated. Otherwise, ch has to be buffered or Go will panic.
-//
-// If the flags include FlagNoReplyExpected, ch is ignored and a Call structure
-// is returned with any error in Err and a closed channel in Done containing
-// the returned Call as it's one entry.
-//
-// If the method parameter contains a dot ('.'), the part before the last dot
-// specifies the interface on which the method is called.
-func (o *Object) Go(method string, flags Flags, ch chan *Call, args ...interface{}) *Call {
- return o.createCall(context.Background(), method, flags, ch, args...)
-}
-
-// GoWithContext acts like Go but takes a context
-func (o *Object) GoWithContext(ctx context.Context, method string, flags Flags, ch chan *Call, args ...interface{}) *Call {
- return o.createCall(ctx, method, flags, ch, args...)
-}
-
-func (o *Object) createCall(ctx context.Context, method string, flags Flags, ch chan *Call, args ...interface{}) *Call {
- if ctx == nil {
- panic("nil context")
- }
- iface := ""
- i := strings.LastIndex(method, ".")
- if i != -1 {
- iface = method[:i]
- }
- method = method[i+1:]
- msg := new(Message)
- msg.Type = TypeMethodCall
- msg.Flags = flags & (FlagNoAutoStart | FlagNoReplyExpected)
- msg.Headers = make(map[HeaderField]Variant)
- msg.Headers[FieldPath] = MakeVariant(o.path)
- msg.Headers[FieldDestination] = MakeVariant(o.dest)
- msg.Headers[FieldMember] = MakeVariant(method)
- if iface != "" {
- msg.Headers[FieldInterface] = MakeVariant(iface)
- }
- msg.Body = args
- if len(args) > 0 {
- msg.Headers[FieldSignature] = MakeVariant(SignatureOf(args...))
- }
- return o.conn.SendWithContext(ctx, msg, ch)
-}
-
-// GetProperty calls org.freedesktop.DBus.Properties.Get on the given
-// object. The property name must be given in interface.member notation.
-func (o *Object) GetProperty(p string) (Variant, error) {
- var result Variant
- err := o.StoreProperty(p, &result)
- return result, err
-}
-
-// StoreProperty calls org.freedesktop.DBus.Properties.Get on the given
-// object. The property name must be given in interface.member notation.
-// It stores the returned property into the provided value.
-func (o *Object) StoreProperty(p string, value 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.Get", 0, iface, prop).
- Store(value)
-}
-
-// 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.
-func (o *Object) Destination() string {
- return o.dest
-}
-
-// Path returns the path that calls on (o *Object") are sent to.
-func (o *Object) Path() ObjectPath {
- return o.path
-}
diff --git a/vendor/github.com/godbus/dbus/v5/sequence.go b/vendor/github.com/godbus/dbus/v5/sequence.go
deleted file mode 100644
index 89435d393..000000000
--- a/vendor/github.com/godbus/dbus/v5/sequence.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package dbus
-
-// Sequence represents the value of a monotonically increasing counter.
-type Sequence uint64
-
-const (
- // NoSequence indicates the absence of a sequence value.
- NoSequence Sequence = 0
-)
-
-// sequenceGenerator represents a monotonically increasing counter.
-type sequenceGenerator struct {
- nextSequence Sequence
-}
-
-func (generator *sequenceGenerator) next() Sequence {
- result := generator.nextSequence
- generator.nextSequence++
- return result
-}
-
-func newSequenceGenerator() *sequenceGenerator {
- return &sequenceGenerator{nextSequence: 1}
-}
diff --git a/vendor/github.com/godbus/dbus/v5/sequential_handler.go b/vendor/github.com/godbus/dbus/v5/sequential_handler.go
deleted file mode 100644
index ef2fcdba1..000000000
--- a/vendor/github.com/godbus/dbus/v5/sequential_handler.go
+++ /dev/null
@@ -1,125 +0,0 @@
-package dbus
-
-import (
- "sync"
-)
-
-// NewSequentialSignalHandler returns an instance of a new
-// signal handler that guarantees sequential processing of signals. It is a
-// guarantee of this signal handler that signals will be written to
-// channels in the order they are received on the DBus connection.
-func NewSequentialSignalHandler() SignalHandler {
- return &sequentialSignalHandler{}
-}
-
-type sequentialSignalHandler struct {
- mu sync.RWMutex
- closed bool
- signals []*sequentialSignalChannelData
-}
-
-func (sh *sequentialSignalHandler) DeliverSignal(intf, name string, signal *Signal) {
- sh.mu.RLock()
- defer sh.mu.RUnlock()
- if sh.closed {
- return
- }
- for _, scd := range sh.signals {
- scd.deliver(signal)
- }
-}
-
-func (sh *sequentialSignalHandler) Terminate() {
- sh.mu.Lock()
- defer sh.mu.Unlock()
- if sh.closed {
- return
- }
-
- for _, scd := range sh.signals {
- scd.close()
- close(scd.ch)
- }
- sh.closed = true
- sh.signals = nil
-}
-
-func (sh *sequentialSignalHandler) AddSignal(ch chan<- *Signal) {
- sh.mu.Lock()
- defer sh.mu.Unlock()
- if sh.closed {
- return
- }
- sh.signals = append(sh.signals, newSequentialSignalChannelData(ch))
-}
-
-func (sh *sequentialSignalHandler) RemoveSignal(ch chan<- *Signal) {
- sh.mu.Lock()
- defer sh.mu.Unlock()
- if sh.closed {
- return
- }
- for i := len(sh.signals) - 1; i >= 0; i-- {
- if ch == sh.signals[i].ch {
- sh.signals[i].close()
- copy(sh.signals[i:], sh.signals[i+1:])
- sh.signals[len(sh.signals)-1] = nil
- sh.signals = sh.signals[:len(sh.signals)-1]
- }
- }
-}
-
-type sequentialSignalChannelData struct {
- ch chan<- *Signal
- in chan *Signal
- done chan struct{}
-}
-
-func newSequentialSignalChannelData(ch chan<- *Signal) *sequentialSignalChannelData {
- scd := &sequentialSignalChannelData{
- ch: ch,
- in: make(chan *Signal),
- done: make(chan struct{}),
- }
- go scd.bufferSignals()
- return scd
-}
-
-func (scd *sequentialSignalChannelData) bufferSignals() {
- defer close(scd.done)
-
- // Ensure that signals are delivered to scd.ch in the same
- // order they are received from scd.in.
- var queue []*Signal
- for {
- if len(queue) == 0 {
- signal, ok := <- scd.in
- if !ok {
- return
- }
- queue = append(queue, signal)
- }
- select {
- case scd.ch <- queue[0]:
- copy(queue, queue[1:])
- queue[len(queue)-1] = nil
- queue = queue[:len(queue)-1]
- case signal, ok := <-scd.in:
- if !ok {
- return
- }
- queue = append(queue, signal)
- }
- }
-}
-
-func (scd *sequentialSignalChannelData) deliver(signal *Signal) {
- scd.in <- signal
-}
-
-func (scd *sequentialSignalChannelData) close() {
- close(scd.in)
- // Ensure that bufferSignals() has exited and won't attempt
- // any future sends on scd.ch
- <-scd.done
-}
diff --git a/vendor/github.com/godbus/dbus/v5/server_interfaces.go b/vendor/github.com/godbus/dbus/v5/server_interfaces.go
deleted file mode 100644
index 79d97edf3..000000000
--- a/vendor/github.com/godbus/dbus/v5/server_interfaces.go
+++ /dev/null
@@ -1,107 +0,0 @@
-package dbus
-
-// Terminator allows a handler to implement a shutdown mechanism that
-// is called when the connection terminates.
-type Terminator interface {
- Terminate()
-}
-
-// Handler is the representation of a D-Bus Application.
-//
-// The Handler must have a way to lookup objects given
-// an ObjectPath. The returned object must implement the
-// ServerObject interface.
-type Handler interface {
- LookupObject(path ObjectPath) (ServerObject, bool)
-}
-
-// ServerObject is the representation of an D-Bus Object.
-//
-// Objects are registered at a path for a given Handler.
-// The Objects implement D-Bus interfaces. The semantics
-// of Interface lookup is up to the implementation of
-// the ServerObject. The ServerObject implementation may
-// choose to implement empty string as a valid interface
-// represeting all methods or not per the D-Bus specification.
-type ServerObject interface {
- LookupInterface(name string) (Interface, bool)
-}
-
-// An Interface is the representation of a D-Bus Interface.
-//
-// Interfaces are a grouping of methods implemented by the Objects.
-// Interfaces are responsible for routing method calls.
-type Interface interface {
- LookupMethod(name string) (Method, bool)
-}
-
-// A Method represents the exposed methods on D-Bus.
-type Method interface {
- // Call requires that all arguments are decoded before being passed to it.
- Call(args ...interface{}) ([]interface{}, error)
- NumArguments() int
- NumReturns() int
- // ArgumentValue returns a representative value for the argument at position
- // it should be of the proper type. reflect.Zero would be a good mechanism
- // to use for this Value.
- ArgumentValue(position int) interface{}
- // ReturnValue returns a representative value for the return at position
- // it should be of the proper type. reflect.Zero would be a good mechanism
- // to use for this Value.
- ReturnValue(position int) interface{}
-}
-
-// An Argument Decoder can decode arguments using the non-standard mechanism
-//
-// If a method implements this interface then the non-standard
-// decoder will be used.
-//
-// Method arguments must be decoded from the message.
-// The mechanism for doing this will vary based on the
-// implementation of the method. A normal approach is provided
-// as part of this library, but may be replaced with
-// any other decoding scheme.
-type ArgumentDecoder interface {
- // To decode the arguments of a method the sender and message are
- // provided incase the semantics of the implementer provides access
- // to these as part of the method invocation.
- DecodeArguments(conn *Conn, sender string, msg *Message, args []interface{}) ([]interface{}, error)
-}
-
-// A SignalHandler is responsible for delivering a signal.
-//
-// Signal delivery may be changed from the default channel
-// based approach by Handlers implementing the SignalHandler
-// interface.
-type SignalHandler interface {
- 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.
-//
-// Any custom error mechanism may implement this interface to provide
-// a custom encoding of the error on D-Bus. By default if a normal
-// error is returned, it will be encoded as the generic
-// "org.freedesktop.DBus.Error.Failed" error. By implementing this
-// interface as well a custom encoding may be provided.
-type DBusError interface {
- DBusError() (string, []interface{})
-}
-
-// SerialGenerator is responsible for serials generation.
-//
-// Different approaches for the serial generation can be used,
-// maintaining a map guarded with a mutex (the standard way) or
-// simply increment an atomic counter.
-type SerialGenerator interface {
- GetSerial() uint32
- RetireSerial(serial uint32)
-}
diff --git a/vendor/github.com/godbus/dbus/v5/sig.go b/vendor/github.com/godbus/dbus/v5/sig.go
deleted file mode 100644
index 2d326cebc..000000000
--- a/vendor/github.com/godbus/dbus/v5/sig.go
+++ /dev/null
@@ -1,259 +0,0 @@
-package dbus
-
-import (
- "fmt"
- "reflect"
- "strings"
-)
-
-var sigToType = map[byte]reflect.Type{
- 'y': byteType,
- 'b': boolType,
- 'n': int16Type,
- 'q': uint16Type,
- 'i': int32Type,
- 'u': uint32Type,
- 'x': int64Type,
- 't': uint64Type,
- 'd': float64Type,
- 's': stringType,
- 'g': signatureType,
- 'o': objectPathType,
- 'v': variantType,
- 'h': unixFDIndexType,
-}
-
-// Signature represents a correct type signature as specified by the D-Bus
-// specification. The zero value represents the empty signature, "".
-type Signature struct {
- str string
-}
-
-// SignatureOf returns the concatenation of all the signatures of the given
-// values. It panics if one of them is not representable in D-Bus.
-func SignatureOf(vs ...interface{}) Signature {
- var s string
- for _, v := range vs {
- s += getSignature(reflect.TypeOf(v))
- }
- return Signature{s}
-}
-
-// SignatureOfType returns the signature of the given type. It panics if the
-// type is not representable in D-Bus.
-func SignatureOfType(t reflect.Type) Signature {
- return Signature{getSignature(t)}
-}
-
-// getSignature returns the signature of the given type and panics on unknown types.
-func getSignature(t reflect.Type) string {
- // handle simple types first
- switch t.Kind() {
- case reflect.Uint8:
- return "y"
- case reflect.Bool:
- return "b"
- case reflect.Int16:
- return "n"
- case reflect.Uint16:
- return "q"
- case reflect.Int, reflect.Int32:
- if t == unixFDType {
- return "h"
- }
- return "i"
- case reflect.Uint, reflect.Uint32:
- if t == unixFDIndexType {
- return "h"
- }
- return "u"
- case reflect.Int64:
- return "x"
- case reflect.Uint64:
- return "t"
- case reflect.Float64:
- return "d"
- case reflect.Ptr:
- return getSignature(t.Elem())
- case reflect.String:
- if t == objectPathType {
- return "o"
- }
- return "s"
- case reflect.Struct:
- if t == variantType {
- return "v"
- } else if t == signatureType {
- return "g"
- }
- var s string
- for i := 0; i < t.NumField(); i++ {
- field := t.Field(i)
- if field.PkgPath == "" && field.Tag.Get("dbus") != "-" {
- s += getSignature(t.Field(i).Type)
- }
- }
- return "(" + s + ")"
- case reflect.Array, reflect.Slice:
- return "a" + getSignature(t.Elem())
- case reflect.Map:
- if !isKeyType(t.Key()) {
- panic(InvalidTypeError{t})
- }
- return "a{" + getSignature(t.Key()) + getSignature(t.Elem()) + "}"
- case reflect.Interface:
- return "v"
- }
- panic(InvalidTypeError{t})
-}
-
-// ParseSignature returns the signature represented by this string, or a
-// SignatureError if the string is not a valid signature.
-func ParseSignature(s string) (sig Signature, err error) {
- if len(s) == 0 {
- return
- }
- if len(s) > 255 {
- return Signature{""}, SignatureError{s, "too long"}
- }
- sig.str = s
- for err == nil && len(s) != 0 {
- err, s = validSingle(s, 0)
- }
- if err != nil {
- sig = Signature{""}
- }
-
- return
-}
-
-// ParseSignatureMust behaves like ParseSignature, except that it panics if s
-// is not valid.
-func ParseSignatureMust(s string) Signature {
- sig, err := ParseSignature(s)
- if err != nil {
- panic(err)
- }
- return sig
-}
-
-// Empty returns whether the signature is the empty signature.
-func (s Signature) Empty() bool {
- return s.str == ""
-}
-
-// Single returns whether the signature represents a single, complete type.
-func (s Signature) Single() bool {
- err, r := validSingle(s.str, 0)
- return err != nil && r == ""
-}
-
-// String returns the signature's string representation.
-func (s Signature) String() string {
- return s.str
-}
-
-// A SignatureError indicates that a signature passed to a function or received
-// on a connection is not a valid signature.
-type SignatureError struct {
- Sig string
- Reason string
-}
-
-func (e SignatureError) Error() string {
- return fmt.Sprintf("dbus: invalid signature: %q (%s)", e.Sig, e.Reason)
-}
-
-// Try to read a single type from this string. If it was successful, err is nil
-// and rem is the remaining unparsed part. Otherwise, err is a non-nil
-// SignatureError and rem is "". depth is the current recursion depth which may
-// not be greater than 64 and should be given as 0 on the first call.
-func validSingle(s string, depth int) (err error, rem string) {
- if s == "" {
- return SignatureError{Sig: s, Reason: "empty signature"}, ""
- }
- if depth > 64 {
- return SignatureError{Sig: s, Reason: "container nesting too deep"}, ""
- }
- switch s[0] {
- case 'y', 'b', 'n', 'q', 'i', 'u', 'x', 't', 'd', 's', 'g', 'o', 'v', 'h':
- return nil, s[1:]
- case 'a':
- if len(s) > 1 && s[1] == '{' {
- i := findMatching(s[1:], '{', '}')
- if i == -1 {
- return SignatureError{Sig: s, Reason: "unmatched '{'"}, ""
- }
- i++
- rem = s[i+1:]
- s = s[2:i]
- if err, _ = validSingle(s[:1], depth+1); err != nil {
- return err, ""
- }
- err, nr := validSingle(s[1:], depth+1)
- if err != nil {
- return err, ""
- }
- if nr != "" {
- return SignatureError{Sig: s, Reason: "too many types in dict"}, ""
- }
- return nil, rem
- }
- return validSingle(s[1:], depth+1)
- case '(':
- i := findMatching(s, '(', ')')
- if i == -1 {
- return SignatureError{Sig: s, Reason: "unmatched ')'"}, ""
- }
- rem = s[i+1:]
- s = s[1:i]
- for err == nil && s != "" {
- err, s = validSingle(s, depth+1)
- }
- if err != nil {
- rem = ""
- }
- return
- }
- return SignatureError{Sig: s, Reason: "invalid type character"}, ""
-}
-
-func findMatching(s string, left, right rune) int {
- n := 0
- for i, v := range s {
- if v == left {
- n++
- } else if v == right {
- n--
- }
- if n == 0 {
- return i
- }
- }
- return -1
-}
-
-// typeFor returns the type of the given signature. It ignores any left over
-// characters and panics if s doesn't start with a valid type signature.
-func typeFor(s string) (t reflect.Type) {
- err, _ := validSingle(s, 0)
- if err != nil {
- panic(err)
- }
-
- if t, ok := sigToType[s[0]]; ok {
- return t
- }
- switch s[0] {
- case 'a':
- if s[1] == '{' {
- i := strings.LastIndex(s, "}")
- t = reflect.MapOf(sigToType[s[2]], typeFor(s[3:i]))
- } else {
- t = reflect.SliceOf(typeFor(s[1:]))
- }
- case '(':
- t = interfacesType
- }
- return
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_darwin.go b/vendor/github.com/godbus/dbus/v5/transport_darwin.go
deleted file mode 100644
index 1bba0d6bf..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_darwin.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package dbus
-
-func (t *unixTransport) SendNullByte() error {
- _, err := t.Write([]byte{0})
- return err
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_generic.go b/vendor/github.com/godbus/dbus/v5/transport_generic.go
deleted file mode 100644
index 718a1ff02..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_generic.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package dbus
-
-import (
- "encoding/binary"
- "errors"
- "io"
- "unsafe"
-)
-
-var nativeEndian binary.ByteOrder
-
-func detectEndianness() binary.ByteOrder {
- var x uint32 = 0x01020304
- if *(*byte)(unsafe.Pointer(&x)) == 0x01 {
- return binary.BigEndian
- }
- return binary.LittleEndian
-}
-
-func init() {
- nativeEndian = detectEndianness()
-}
-
-type genericTransport struct {
- io.ReadWriteCloser
-}
-
-func (t genericTransport) SendNullByte() error {
- _, err := t.Write([]byte{0})
- return err
-}
-
-func (t genericTransport) SupportsUnixFDs() bool {
- return false
-}
-
-func (t genericTransport) EnableUnixFDs() {}
-
-func (t genericTransport) ReadMessage() (*Message, error) {
- return DecodeMessage(t)
-}
-
-func (t genericTransport) SendMessage(msg *Message) error {
- for _, v := range msg.Body {
- if _, ok := v.(UnixFD); ok {
- return errors.New("dbus: unix fd passing not enabled")
- }
- }
- return msg.EncodeTo(t, nativeEndian)
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_nonce_tcp.go b/vendor/github.com/godbus/dbus/v5/transport_nonce_tcp.go
deleted file mode 100644
index 697739efa..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_nonce_tcp.go
+++ /dev/null
@@ -1,39 +0,0 @@
-//+build !windows
-
-package dbus
-
-import (
- "errors"
- "io/ioutil"
- "net"
-)
-
-func init() {
- transports["nonce-tcp"] = newNonceTcpTransport
-}
-
-func newNonceTcpTransport(keys string) (transport, error) {
- host := getKey(keys, "host")
- port := getKey(keys, "port")
- noncefile := getKey(keys, "noncefile")
- if host == "" || port == "" || noncefile == "" {
- return nil, errors.New("dbus: unsupported address (must set host, port and noncefile)")
- }
- protocol, err := tcpFamily(keys)
- if err != nil {
- return nil, err
- }
- socket, err := net.Dial(protocol, net.JoinHostPort(host, port))
- if err != nil {
- return nil, err
- }
- b, err := ioutil.ReadFile(noncefile)
- if err != nil {
- return nil, err
- }
- _, err = socket.Write(b)
- if err != nil {
- return nil, err
- }
- return NewConn(socket)
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_tcp.go b/vendor/github.com/godbus/dbus/v5/transport_tcp.go
deleted file mode 100644
index f91c9b7d7..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_tcp.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package dbus
-
-import (
- "errors"
- "net"
-)
-
-func init() {
- transports["tcp"] = newTcpTransport
-}
-
-func tcpFamily(keys string) (string, error) {
- switch getKey(keys, "family") {
- case "":
- return "tcp", nil
- case "ipv4":
- return "tcp4", nil
- case "ipv6":
- return "tcp6", nil
- default:
- return "", errors.New("dbus: invalid tcp family (must be ipv4 or ipv6)")
- }
-}
-
-func newTcpTransport(keys string) (transport, error) {
- host := getKey(keys, "host")
- port := getKey(keys, "port")
- if host == "" || port == "" {
- return nil, errors.New("dbus: unsupported address (must set host and port)")
- }
-
- protocol, err := tcpFamily(keys)
- if err != nil {
- return nil, err
- }
- socket, err := net.Dial(protocol, net.JoinHostPort(host, port))
- if err != nil {
- return nil, err
- }
- return NewConn(socket)
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_unix.go b/vendor/github.com/godbus/dbus/v5/transport_unix.go
deleted file mode 100644
index c7cd02f97..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_unix.go
+++ /dev/null
@@ -1,214 +0,0 @@
-//+build !windows,!solaris
-
-package dbus
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "io"
- "net"
- "syscall"
-)
-
-type oobReader struct {
- conn *net.UnixConn
- oob []byte
- buf [4096]byte
-}
-
-func (o *oobReader) Read(b []byte) (n int, err error) {
- n, oobn, flags, _, err := o.conn.ReadMsgUnix(b, o.buf[:])
- if err != nil {
- return n, err
- }
- if flags&syscall.MSG_CTRUNC != 0 {
- return n, errors.New("dbus: control data truncated (too many fds received)")
- }
- o.oob = append(o.oob, o.buf[:oobn]...)
- return n, nil
-}
-
-type unixTransport struct {
- *net.UnixConn
- rdr *oobReader
- hasUnixFDs bool
-}
-
-func newUnixTransport(keys string) (transport, error) {
- var err error
-
- t := new(unixTransport)
- abstract := getKey(keys, "abstract")
- path := getKey(keys, "path")
- switch {
- case abstract == "" && path == "":
- return nil, errors.New("dbus: invalid address (neither path nor abstract set)")
- case abstract != "" && path == "":
- t.UnixConn, err = net.DialUnix("unix", nil, &net.UnixAddr{Name: "@" + abstract, Net: "unix"})
- if err != nil {
- return nil, err
- }
- return t, nil
- case abstract == "" && path != "":
- t.UnixConn, err = net.DialUnix("unix", nil, &net.UnixAddr{Name: path, Net: "unix"})
- if err != nil {
- return nil, err
- }
- return t, nil
- default:
- return nil, errors.New("dbus: invalid address (both path and abstract set)")
- }
-}
-
-func init() {
- transports["unix"] = newUnixTransport
-}
-
-func (t *unixTransport) EnableUnixFDs() {
- t.hasUnixFDs = true
-}
-
-func (t *unixTransport) ReadMessage() (*Message, error) {
- var (
- blen, hlen uint32
- csheader [16]byte
- headers []header
- order binary.ByteOrder
- unixfds uint32
- )
- // To be sure that all bytes of out-of-band data are read, we use a special
- // reader that uses ReadUnix on the underlying connection instead of Read
- // and gathers the out-of-band data in a buffer.
- if t.rdr == nil {
- t.rdr = &oobReader{conn: t.UnixConn}
- } else {
- t.rdr.oob = nil
- }
-
- // read the first 16 bytes (the part of the header that has a constant size),
- // from which we can figure out the length of the rest of the message
- if _, err := io.ReadFull(t.rdr, csheader[:]); err != nil {
- return nil, err
- }
- switch csheader[0] {
- case 'l':
- order = binary.LittleEndian
- case 'B':
- order = binary.BigEndian
- default:
- return nil, InvalidMessageError("invalid byte order")
- }
- // csheader[4:8] -> length of message body, csheader[12:16] -> length of
- // header fields (without alignment)
- binary.Read(bytes.NewBuffer(csheader[4:8]), order, &blen)
- binary.Read(bytes.NewBuffer(csheader[12:]), order, &hlen)
- if hlen%8 != 0 {
- hlen += 8 - (hlen % 8)
- }
-
- // decode headers and look for unix fds
- headerdata := make([]byte, hlen+4)
- copy(headerdata, csheader[12:])
- if _, err := io.ReadFull(t.rdr, headerdata[4:]); err != nil {
- return nil, err
- }
- dec := newDecoder(bytes.NewBuffer(headerdata), order)
- dec.pos = 12
- vs, err := dec.Decode(Signature{"a(yv)"})
- if err != nil {
- return nil, err
- }
- Store(vs, &headers)
- for _, v := range headers {
- if v.Field == byte(FieldUnixFDs) {
- unixfds, _ = v.Variant.value.(uint32)
- }
- }
- all := make([]byte, 16+hlen+blen)
- copy(all, csheader[:])
- copy(all[16:], headerdata[4:])
- if _, err := io.ReadFull(t.rdr, all[16+hlen:]); err != nil {
- return nil, err
- }
- if unixfds != 0 {
- if !t.hasUnixFDs {
- return nil, errors.New("dbus: got unix fds on unsupported transport")
- }
- // read the fds from the OOB data
- scms, err := syscall.ParseSocketControlMessage(t.rdr.oob)
- if err != nil {
- return nil, err
- }
- if len(scms) != 1 {
- return nil, errors.New("dbus: received more than one socket control message")
- }
- fds, err := syscall.ParseUnixRights(&scms[0])
- if err != nil {
- return nil, err
- }
- msg, err := DecodeMessage(bytes.NewBuffer(all))
- if err != nil {
- return nil, err
- }
- // substitute the values in the message body (which are indices for the
- // array receiver via OOB) with the actual values
- for i, v := range msg.Body {
- switch v.(type) {
- case UnixFDIndex:
- j := v.(UnixFDIndex)
- if uint32(j) >= unixfds {
- return nil, InvalidMessageError("invalid index for unix fd")
- }
- msg.Body[i] = UnixFD(fds[j])
- case []UnixFDIndex:
- idxArray := v.([]UnixFDIndex)
- fdArray := make([]UnixFD, len(idxArray))
- for k, j := range idxArray {
- if uint32(j) >= unixfds {
- return nil, InvalidMessageError("invalid index for unix fd")
- }
- fdArray[k] = UnixFD(fds[j])
- }
- msg.Body[i] = fdArray
- }
- }
- return msg, nil
- }
- return DecodeMessage(bytes.NewBuffer(all))
-}
-
-func (t *unixTransport) SendMessage(msg *Message) error {
- fds := make([]int, 0)
- for i, v := range msg.Body {
- if fd, ok := v.(UnixFD); ok {
- msg.Body[i] = UnixFDIndex(len(fds))
- fds = append(fds, int(fd))
- }
- }
- if len(fds) != 0 {
- if !t.hasUnixFDs {
- return errors.New("dbus: unix fd passing not enabled")
- }
- msg.Headers[FieldUnixFDs] = MakeVariant(uint32(len(fds)))
- oob := syscall.UnixRights(fds...)
- buf := new(bytes.Buffer)
- msg.EncodeTo(buf, nativeEndian)
- n, oobn, err := t.UnixConn.WriteMsgUnix(buf.Bytes(), oob, nil)
- if err != nil {
- return err
- }
- if n != buf.Len() || oobn != len(oob) {
- return io.ErrShortWrite
- }
- } else {
- if err := msg.EncodeTo(t, nativeEndian); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (t *unixTransport) SupportsUnixFDs() bool {
- return true
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_unixcred_dragonfly.go b/vendor/github.com/godbus/dbus/v5/transport_unixcred_dragonfly.go
deleted file mode 100644
index a8cd39395..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_unixcred_dragonfly.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// The UnixCredentials system call is currently only implemented on Linux
-// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
-// https://golang.org/s/go1.4-syscall
-// http://code.google.com/p/go/source/browse/unix/sockcmsg_linux.go?repo=sys
-
-// Local implementation of the UnixCredentials system call for DragonFly BSD
-
-package dbus
-
-/*
-#include <sys/ucred.h>
-*/
-import "C"
-
-import (
- "io"
- "os"
- "syscall"
- "unsafe"
-)
-
-// http://golang.org/src/pkg/syscall/ztypes_linux_amd64.go
-// http://golang.org/src/pkg/syscall/ztypes_dragonfly_amd64.go
-type Ucred struct {
- Pid int32
- Uid uint32
- Gid uint32
-}
-
-// http://golang.org/src/pkg/syscall/types_linux.go
-// http://golang.org/src/pkg/syscall/types_dragonfly.go
-// https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/ucred.h
-const (
- SizeofUcred = C.sizeof_struct_ucred
-)
-
-// http://golang.org/src/pkg/syscall/sockcmsg_unix.go
-func cmsgAlignOf(salen int) int {
- // From http://golang.org/src/pkg/syscall/sockcmsg_unix.go
- //salign := sizeofPtr
- // NOTE: It seems like 64-bit Darwin and DragonFly BSD kernels
- // still require 32-bit aligned access to network subsystem.
- //if darwin64Bit || dragonfly64Bit {
- // salign = 4
- //}
- salign := 4
- return (salen + salign - 1) & ^(salign - 1)
-}
-
-// http://golang.org/src/pkg/syscall/sockcmsg_unix.go
-func cmsgData(h *syscall.Cmsghdr) unsafe.Pointer {
- return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(syscall.SizeofCmsghdr)))
-}
-
-// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
-// UnixCredentials encodes credentials into a socket control message
-// for sending to another process. This can be used for
-// authentication.
-func UnixCredentials(ucred *Ucred) []byte {
- b := make([]byte, syscall.CmsgSpace(SizeofUcred))
- h := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
- h.Level = syscall.SOL_SOCKET
- h.Type = syscall.SCM_CREDS
- h.SetLen(syscall.CmsgLen(SizeofUcred))
- *((*Ucred)(cmsgData(h))) = *ucred
- return b
-}
-
-// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
-// ParseUnixCredentials decodes a socket control message that contains
-// credentials in a Ucred structure. To receive such a message, the
-// SO_PASSCRED option must be enabled on the socket.
-func ParseUnixCredentials(m *syscall.SocketControlMessage) (*Ucred, error) {
- if m.Header.Level != syscall.SOL_SOCKET {
- return nil, syscall.EINVAL
- }
- if m.Header.Type != syscall.SCM_CREDS {
- return nil, syscall.EINVAL
- }
- ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
- return &ucred, nil
-}
-
-func (t *unixTransport) SendNullByte() error {
- ucred := &Ucred{Pid: int32(os.Getpid()), Uid: uint32(os.Getuid()), Gid: uint32(os.Getgid())}
- b := UnixCredentials(ucred)
- _, oobn, err := t.UnixConn.WriteMsgUnix([]byte{0}, b, nil)
- if err != nil {
- return err
- }
- if oobn != len(b) {
- return io.ErrShortWrite
- }
- return nil
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go b/vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go
deleted file mode 100644
index 1b5ed2089..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_unixcred_freebsd.go
+++ /dev/null
@@ -1,92 +0,0 @@
-// The UnixCredentials system call is currently only implemented on Linux
-// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
-// https://golang.org/s/go1.4-syscall
-// http://code.google.com/p/go/source/browse/unix/sockcmsg_linux.go?repo=sys
-
-// Local implementation of the UnixCredentials system call for FreeBSD
-
-package dbus
-
-/*
-const int sizeofPtr = sizeof(void*);
-#define _WANT_UCRED
-#include <sys/types.h>
-#include <sys/ucred.h>
-*/
-import "C"
-
-import (
- "io"
- "os"
- "syscall"
- "unsafe"
-)
-
-// http://golang.org/src/pkg/syscall/ztypes_linux_amd64.go
-// https://golang.org/src/syscall/ztypes_freebsd_amd64.go
-type Ucred struct {
- Pid int32
- Uid uint32
- Gid uint32
-}
-
-// http://golang.org/src/pkg/syscall/types_linux.go
-// https://golang.org/src/syscall/types_freebsd.go
-// https://github.com/freebsd/freebsd/blob/master/sys/sys/ucred.h
-const (
- SizeofUcred = C.sizeof_struct_ucred
-)
-
-// http://golang.org/src/pkg/syscall/sockcmsg_unix.go
-func cmsgAlignOf(salen int) int {
- salign := C.sizeofPtr
-
- return (salen + salign - 1) & ^(salign - 1)
-}
-
-// http://golang.org/src/pkg/syscall/sockcmsg_unix.go
-func cmsgData(h *syscall.Cmsghdr) unsafe.Pointer {
- return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(syscall.SizeofCmsghdr)))
-}
-
-// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
-// UnixCredentials encodes credentials into a socket control message
-// for sending to another process. This can be used for
-// authentication.
-func UnixCredentials(ucred *Ucred) []byte {
- b := make([]byte, syscall.CmsgSpace(SizeofUcred))
- h := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
- h.Level = syscall.SOL_SOCKET
- h.Type = syscall.SCM_CREDS
- h.SetLen(syscall.CmsgLen(SizeofUcred))
- *((*Ucred)(cmsgData(h))) = *ucred
- return b
-}
-
-// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
-// ParseUnixCredentials decodes a socket control message that contains
-// credentials in a Ucred structure. To receive such a message, the
-// SO_PASSCRED option must be enabled on the socket.
-func ParseUnixCredentials(m *syscall.SocketControlMessage) (*Ucred, error) {
- if m.Header.Level != syscall.SOL_SOCKET {
- return nil, syscall.EINVAL
- }
- if m.Header.Type != syscall.SCM_CREDS {
- return nil, syscall.EINVAL
- }
- ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
- return &ucred, nil
-}
-
-func (t *unixTransport) SendNullByte() error {
- ucred := &Ucred{Pid: int32(os.Getpid()), Uid: uint32(os.Getuid()), Gid: uint32(os.Getgid())}
- b := UnixCredentials(ucred)
- _, oobn, err := t.UnixConn.WriteMsgUnix([]byte{0}, b, nil)
- if err != nil {
- return err
- }
- if oobn != len(b) {
- return io.ErrShortWrite
- }
- return nil
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_unixcred_linux.go b/vendor/github.com/godbus/dbus/v5/transport_unixcred_linux.go
deleted file mode 100644
index d9dfdf698..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_unixcred_linux.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// The UnixCredentials system call is currently only implemented on Linux
-// http://golang.org/src/pkg/syscall/sockcmsg_linux.go
-// https://golang.org/s/go1.4-syscall
-// http://code.google.com/p/go/source/browse/unix/sockcmsg_linux.go?repo=sys
-
-package dbus
-
-import (
- "io"
- "os"
- "syscall"
-)
-
-func (t *unixTransport) SendNullByte() error {
- ucred := &syscall.Ucred{Pid: int32(os.Getpid()), Uid: uint32(os.Getuid()), Gid: uint32(os.Getgid())}
- b := syscall.UnixCredentials(ucred)
- _, oobn, err := t.UnixConn.WriteMsgUnix([]byte{0}, b, nil)
- if err != nil {
- return err
- }
- if oobn != len(b) {
- return io.ErrShortWrite
- }
- return nil
-}
diff --git a/vendor/github.com/godbus/dbus/v5/transport_unixcred_openbsd.go b/vendor/github.com/godbus/dbus/v5/transport_unixcred_openbsd.go
deleted file mode 100644
index af7bafdf9..000000000
--- a/vendor/github.com/godbus/dbus/v5/transport_unixcred_openbsd.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package dbus
-
-import "io"
-
-func (t *unixTransport) SendNullByte() error {
- n, _, err := t.UnixConn.WriteMsgUnix([]byte{0}, nil, nil)
- if err != nil {
- return err
- }
- if n != 1 {
- return io.ErrShortWrite
- }
- return nil
-}
diff --git a/vendor/github.com/godbus/dbus/v5/variant.go b/vendor/github.com/godbus/dbus/v5/variant.go
deleted file mode 100644
index f1e81f3ed..000000000
--- a/vendor/github.com/godbus/dbus/v5/variant.go
+++ /dev/null
@@ -1,150 +0,0 @@
-package dbus
-
-import (
- "bytes"
- "fmt"
- "reflect"
- "sort"
- "strconv"
-)
-
-// Variant represents the D-Bus variant type.
-type Variant struct {
- sig Signature
- value interface{}
-}
-
-// MakeVariant converts the given value to a Variant. It panics if v cannot be
-// represented as a D-Bus type.
-func MakeVariant(v interface{}) Variant {
- return MakeVariantWithSignature(v, SignatureOf(v))
-}
-
-// MakeVariantWithSignature converts the given value to a Variant.
-func MakeVariantWithSignature(v interface{}, s Signature) Variant {
- return Variant{s, v}
-}
-
-// ParseVariant parses the given string as a variant as described at
-// 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.
-func ParseVariant(s string, sig Signature) (Variant, error) {
- tokens := varLex(s)
- p := &varParser{tokens: tokens}
- n, err := varMakeNode(p)
- if err != nil {
- return Variant{}, err
- }
- if sig.str == "" {
- sig, err = varInfer(n)
- if err != nil {
- return Variant{}, err
- }
- }
- v, err := n.Value(sig)
- if err != nil {
- return Variant{}, err
- }
- return MakeVariant(v), nil
-}
-
-// format returns a formatted version of v and whether this string can be parsed
-// unambigously.
-func (v Variant) format() (string, bool) {
- switch v.sig.str[0] {
- case 'b', 'i':
- return fmt.Sprint(v.value), true
- case 'n', 'q', 'u', 'x', 't', 'd', 'h':
- return fmt.Sprint(v.value), false
- case 's':
- return strconv.Quote(v.value.(string)), true
- case 'o':
- return strconv.Quote(string(v.value.(ObjectPath))), false
- case 'g':
- return strconv.Quote(v.value.(Signature).str), false
- case 'v':
- s, unamb := v.value.(Variant).format()
- if !unamb {
- return "<@" + v.value.(Variant).sig.str + " " + s + ">", true
- }
- return "<" + s + ">", true
- case 'y':
- return fmt.Sprintf("%#x", v.value.(byte)), false
- }
- rv := reflect.ValueOf(v.value)
- switch rv.Kind() {
- case reflect.Slice:
- if rv.Len() == 0 {
- return "[]", false
- }
- unamb := true
- buf := bytes.NewBuffer([]byte("["))
- for i := 0; i < rv.Len(); i++ {
- // TODO: slooow
- s, b := MakeVariant(rv.Index(i).Interface()).format()
- unamb = unamb && b
- buf.WriteString(s)
- if i != rv.Len()-1 {
- buf.WriteString(", ")
- }
- }
- buf.WriteByte(']')
- return buf.String(), unamb
- case reflect.Map:
- if rv.Len() == 0 {
- return "{}", false
- }
- unamb := true
- var buf bytes.Buffer
- kvs := make([]string, rv.Len())
- for i, k := range rv.MapKeys() {
- s, b := MakeVariant(k.Interface()).format()
- unamb = unamb && b
- buf.Reset()
- buf.WriteString(s)
- buf.WriteString(": ")
- s, b = MakeVariant(rv.MapIndex(k).Interface()).format()
- unamb = unamb && b
- buf.WriteString(s)
- kvs[i] = buf.String()
- }
- buf.Reset()
- buf.WriteByte('{')
- sort.Strings(kvs)
- for i, kv := range kvs {
- if i > 0 {
- buf.WriteString(", ")
- }
- buf.WriteString(kv)
- }
- buf.WriteByte('}')
- return buf.String(), unamb
- }
- return `"INVALID"`, true
-}
-
-// Signature returns the D-Bus signature of the underlying value of v.
-func (v Variant) Signature() Signature {
- return v.sig
-}
-
-// String returns the string representation of the underlying value of v as
-// described at https://developer.gnome.org/glib/stable/gvariant-text.html.
-func (v Variant) String() string {
- s, unamb := v.format()
- if !unamb {
- return "@" + v.sig.str + " " + s
- }
- return s
-}
-
-// Value returns the underlying value of v.
-func (v Variant) Value() interface{} {
- return v.value
-}
-
-// Store converts the variant into a native go type using the same
-// mechanism as the "Store" function.
-func (v Variant) Store(value interface{}) error {
- return storeInterfaces(v.value, value)
-}
diff --git a/vendor/github.com/godbus/dbus/v5/variant_lexer.go b/vendor/github.com/godbus/dbus/v5/variant_lexer.go
deleted file mode 100644
index bf1398c8f..000000000
--- a/vendor/github.com/godbus/dbus/v5/variant_lexer.go
+++ /dev/null
@@ -1,284 +0,0 @@
-package dbus
-
-import (
- "fmt"
- "strings"
- "unicode"
- "unicode/utf8"
-)
-
-// Heavily inspired by the lexer from text/template.
-
-type varToken struct {
- typ varTokenType
- val string
-}
-
-type varTokenType byte
-
-const (
- tokEOF varTokenType = iota
- tokError
- tokNumber
- tokString
- tokBool
- tokArrayStart
- tokArrayEnd
- tokDictStart
- tokDictEnd
- tokVariantStart
- tokVariantEnd
- tokComma
- tokColon
- tokType
- tokByteString
-)
-
-type varLexer struct {
- input string
- start int
- pos int
- width int
- tokens []varToken
-}
-
-type lexState func(*varLexer) lexState
-
-func varLex(s string) []varToken {
- l := &varLexer{input: s}
- l.run()
- return l.tokens
-}
-
-func (l *varLexer) accept(valid string) bool {
- if strings.ContainsRune(valid, l.next()) {
- return true
- }
- l.backup()
- return false
-}
-
-func (l *varLexer) backup() {
- l.pos -= l.width
-}
-
-func (l *varLexer) emit(t varTokenType) {
- l.tokens = append(l.tokens, varToken{t, l.input[l.start:l.pos]})
- l.start = l.pos
-}
-
-func (l *varLexer) errorf(format string, v ...interface{}) lexState {
- l.tokens = append(l.tokens, varToken{
- tokError,
- fmt.Sprintf(format, v...),
- })
- return nil
-}
-
-func (l *varLexer) ignore() {
- l.start = l.pos
-}
-
-func (l *varLexer) next() rune {
- var r rune
-
- if l.pos >= len(l.input) {
- l.width = 0
- return -1
- }
- r, l.width = utf8.DecodeRuneInString(l.input[l.pos:])
- l.pos += l.width
- return r
-}
-
-func (l *varLexer) run() {
- for state := varLexNormal; state != nil; {
- state = state(l)
- }
-}
-
-func (l *varLexer) peek() rune {
- r := l.next()
- l.backup()
- return r
-}
-
-func varLexNormal(l *varLexer) lexState {
- for {
- r := l.next()
- switch {
- case r == -1:
- l.emit(tokEOF)
- return nil
- case r == '[':
- l.emit(tokArrayStart)
- case r == ']':
- l.emit(tokArrayEnd)
- case r == '{':
- l.emit(tokDictStart)
- case r == '}':
- l.emit(tokDictEnd)
- case r == '<':
- l.emit(tokVariantStart)
- case r == '>':
- l.emit(tokVariantEnd)
- case r == ':':
- l.emit(tokColon)
- case r == ',':
- l.emit(tokComma)
- case r == '\'' || r == '"':
- l.backup()
- return varLexString
- case r == '@':
- l.backup()
- return varLexType
- case unicode.IsSpace(r):
- l.ignore()
- case unicode.IsNumber(r) || r == '+' || r == '-':
- l.backup()
- return varLexNumber
- case r == 'b':
- pos := l.start
- if n := l.peek(); n == '"' || n == '\'' {
- return varLexByteString
- }
- // not a byte string; try to parse it as a type or bool below
- l.pos = pos + 1
- l.width = 1
- fallthrough
- default:
- // either a bool or a type. Try bools first.
- l.backup()
- if l.pos+4 <= len(l.input) {
- if l.input[l.pos:l.pos+4] == "true" {
- l.pos += 4
- l.emit(tokBool)
- continue
- }
- }
- if l.pos+5 <= len(l.input) {
- if l.input[l.pos:l.pos+5] == "false" {
- l.pos += 5
- l.emit(tokBool)
- continue
- }
- }
- // must be a type.
- return varLexType
- }
- }
-}
-
-var varTypeMap = map[string]string{
- "boolean": "b",
- "byte": "y",
- "int16": "n",
- "uint16": "q",
- "int32": "i",
- "uint32": "u",
- "int64": "x",
- "uint64": "t",
- "double": "f",
- "string": "s",
- "objectpath": "o",
- "signature": "g",
-}
-
-func varLexByteString(l *varLexer) lexState {
- q := l.next()
-Loop:
- for {
- switch l.next() {
- case '\\':
- if r := l.next(); r != -1 {
- break
- }
- fallthrough
- case -1:
- return l.errorf("unterminated bytestring")
- case q:
- break Loop
- }
- }
- l.emit(tokByteString)
- return varLexNormal
-}
-
-func varLexNumber(l *varLexer) lexState {
- l.accept("+-")
- digits := "0123456789"
- if l.accept("0") {
- if l.accept("x") {
- digits = "0123456789abcdefABCDEF"
- } else {
- digits = "01234567"
- }
- }
- for strings.ContainsRune(digits, l.next()) {
- }
- l.backup()
- if l.accept(".") {
- for strings.ContainsRune(digits, l.next()) {
- }
- l.backup()
- }
- if l.accept("eE") {
- l.accept("+-")
- for strings.ContainsRune("0123456789", l.next()) {
- }
- l.backup()
- }
- if r := l.peek(); unicode.IsLetter(r) {
- l.next()
- return l.errorf("bad number syntax: %q", l.input[l.start:l.pos])
- }
- l.emit(tokNumber)
- return varLexNormal
-}
-
-func varLexString(l *varLexer) lexState {
- q := l.next()
-Loop:
- for {
- switch l.next() {
- case '\\':
- if r := l.next(); r != -1 {
- break
- }
- fallthrough
- case -1:
- return l.errorf("unterminated string")
- case q:
- break Loop
- }
- }
- l.emit(tokString)
- return varLexNormal
-}
-
-func varLexType(l *varLexer) lexState {
- at := l.accept("@")
- for {
- r := l.next()
- if r == -1 {
- break
- }
- if unicode.IsSpace(r) {
- l.backup()
- break
- }
- }
- if at {
- if _, err := ParseSignature(l.input[l.start+1 : l.pos]); err != nil {
- return l.errorf("%s", err)
- }
- } else {
- if _, ok := varTypeMap[l.input[l.start:l.pos]]; ok {
- l.emit(tokType)
- return varLexNormal
- }
- return l.errorf("unrecognized type %q", l.input[l.start:l.pos])
- }
- l.emit(tokType)
- return varLexNormal
-}
diff --git a/vendor/github.com/godbus/dbus/v5/variant_parser.go b/vendor/github.com/godbus/dbus/v5/variant_parser.go
deleted file mode 100644
index d20f5da6d..000000000
--- a/vendor/github.com/godbus/dbus/v5/variant_parser.go
+++ /dev/null
@@ -1,817 +0,0 @@
-package dbus
-
-import (
- "bytes"
- "errors"
- "fmt"
- "io"
- "reflect"
- "strconv"
- "strings"
- "unicode/utf8"
-)
-
-type varParser struct {
- tokens []varToken
- i int
-}
-
-func (p *varParser) backup() {
- p.i--
-}
-
-func (p *varParser) next() varToken {
- if p.i < len(p.tokens) {
- t := p.tokens[p.i]
- p.i++
- return t
- }
- return varToken{typ: tokEOF}
-}
-
-type varNode interface {
- Infer() (Signature, error)
- String() string
- Sigs() sigSet
- Value(Signature) (interface{}, error)
-}
-
-func varMakeNode(p *varParser) (varNode, error) {
- var sig Signature
-
- for {
- t := p.next()
- switch t.typ {
- case tokEOF:
- return nil, io.ErrUnexpectedEOF
- case tokError:
- return nil, errors.New(t.val)
- case tokNumber:
- return varMakeNumNode(t, sig)
- case tokString:
- return varMakeStringNode(t, sig)
- case tokBool:
- if sig.str != "" && sig.str != "b" {
- return nil, varTypeError{t.val, sig}
- }
- b, err := strconv.ParseBool(t.val)
- if err != nil {
- return nil, err
- }
- return boolNode(b), nil
- case tokArrayStart:
- return varMakeArrayNode(p, sig)
- case tokVariantStart:
- return varMakeVariantNode(p, sig)
- case tokDictStart:
- return varMakeDictNode(p, sig)
- case tokType:
- if sig.str != "" {
- return nil, errors.New("unexpected type annotation")
- }
- if t.val[0] == '@' {
- sig.str = t.val[1:]
- } else {
- sig.str = varTypeMap[t.val]
- }
- case tokByteString:
- if sig.str != "" && sig.str != "ay" {
- return nil, varTypeError{t.val, sig}
- }
- b, err := varParseByteString(t.val)
- if err != nil {
- return nil, err
- }
- return byteStringNode(b), nil
- default:
- return nil, fmt.Errorf("unexpected %q", t.val)
- }
- }
-}
-
-type varTypeError struct {
- val string
- sig Signature
-}
-
-func (e varTypeError) Error() string {
- return fmt.Sprintf("dbus: can't parse %q as type %q", e.val, e.sig.str)
-}
-
-type sigSet map[Signature]bool
-
-func (s sigSet) Empty() bool {
- return len(s) == 0
-}
-
-func (s sigSet) Intersect(s2 sigSet) sigSet {
- r := make(sigSet)
- for k := range s {
- if s2[k] {
- r[k] = true
- }
- }
- return r
-}
-
-func (s sigSet) Single() (Signature, bool) {
- if len(s) == 1 {
- for k := range s {
- return k, true
- }
- }
- return Signature{}, false
-}
-
-func (s sigSet) ToArray() sigSet {
- r := make(sigSet, len(s))
- for k := range s {
- r[Signature{"a" + k.str}] = true
- }
- return r
-}
-
-type numNode struct {
- sig Signature
- str string
- val interface{}
-}
-
-var numSigSet = sigSet{
- Signature{"y"}: true,
- Signature{"n"}: true,
- Signature{"q"}: true,
- Signature{"i"}: true,
- Signature{"u"}: true,
- Signature{"x"}: true,
- Signature{"t"}: true,
- Signature{"d"}: true,
-}
-
-func (n numNode) Infer() (Signature, error) {
- if strings.ContainsAny(n.str, ".e") {
- return Signature{"d"}, nil
- }
- return Signature{"i"}, nil
-}
-
-func (n numNode) String() string {
- return n.str
-}
-
-func (n numNode) Sigs() sigSet {
- if n.sig.str != "" {
- return sigSet{n.sig: true}
- }
- if strings.ContainsAny(n.str, ".e") {
- return sigSet{Signature{"d"}: true}
- }
- return numSigSet
-}
-
-func (n numNode) Value(sig Signature) (interface{}, error) {
- if n.sig.str != "" && n.sig != sig {
- return nil, varTypeError{n.str, sig}
- }
- if n.val != nil {
- return n.val, nil
- }
- return varNumAs(n.str, sig)
-}
-
-func varMakeNumNode(tok varToken, sig Signature) (varNode, error) {
- if sig.str == "" {
- return numNode{str: tok.val}, nil
- }
- num, err := varNumAs(tok.val, sig)
- if err != nil {
- return nil, err
- }
- return numNode{sig: sig, val: num}, nil
-}
-
-func varNumAs(s string, sig Signature) (interface{}, error) {
- isUnsigned := false
- size := 32
- switch sig.str {
- case "n":
- size = 16
- case "i":
- case "x":
- size = 64
- case "y":
- size = 8
- isUnsigned = true
- case "q":
- size = 16
- isUnsigned = true
- case "u":
- isUnsigned = true
- case "t":
- size = 64
- isUnsigned = true
- case "d":
- d, err := strconv.ParseFloat(s, 64)
- if err != nil {
- return nil, err
- }
- return d, nil
- default:
- return nil, varTypeError{s, sig}
- }
- base := 10
- if strings.HasPrefix(s, "0x") {
- base = 16
- s = s[2:]
- }
- if strings.HasPrefix(s, "0") && len(s) != 1 {
- base = 8
- s = s[1:]
- }
- if isUnsigned {
- i, err := strconv.ParseUint(s, base, size)
- if err != nil {
- return nil, err
- }
- var v interface{} = i
- switch sig.str {
- case "y":
- v = byte(i)
- case "q":
- v = uint16(i)
- case "u":
- v = uint32(i)
- }
- return v, nil
- }
- i, err := strconv.ParseInt(s, base, size)
- if err != nil {
- return nil, err
- }
- var v interface{} = i
- switch sig.str {
- case "n":
- v = int16(i)
- case "i":
- v = int32(i)
- }
- return v, nil
-}
-
-type stringNode struct {
- sig Signature
- str string // parsed
- val interface{} // has correct type
-}
-
-var stringSigSet = sigSet{
- Signature{"s"}: true,
- Signature{"g"}: true,
- Signature{"o"}: true,
-}
-
-func (n stringNode) Infer() (Signature, error) {
- return Signature{"s"}, nil
-}
-
-func (n stringNode) String() string {
- return n.str
-}
-
-func (n stringNode) Sigs() sigSet {
- if n.sig.str != "" {
- return sigSet{n.sig: true}
- }
- return stringSigSet
-}
-
-func (n stringNode) Value(sig Signature) (interface{}, error) {
- if n.sig.str != "" && n.sig != sig {
- return nil, varTypeError{n.str, sig}
- }
- if n.val != nil {
- return n.val, nil
- }
- switch {
- case sig.str == "g":
- return Signature{n.str}, nil
- case sig.str == "o":
- return ObjectPath(n.str), nil
- case sig.str == "s":
- return n.str, nil
- default:
- return nil, varTypeError{n.str, sig}
- }
-}
-
-func varMakeStringNode(tok varToken, sig Signature) (varNode, error) {
- if sig.str != "" && sig.str != "s" && sig.str != "g" && sig.str != "o" {
- return nil, fmt.Errorf("invalid type %q for string", sig.str)
- }
- s, err := varParseString(tok.val)
- if err != nil {
- return nil, err
- }
- n := stringNode{str: s}
- if sig.str == "" {
- return stringNode{str: s}, nil
- }
- n.sig = sig
- switch sig.str {
- case "o":
- n.val = ObjectPath(s)
- case "g":
- n.val = Signature{s}
- case "s":
- n.val = s
- }
- return n, nil
-}
-
-func varParseString(s string) (string, error) {
- // quotes are guaranteed to be there
- s = s[1 : len(s)-1]
- buf := new(bytes.Buffer)
- for len(s) != 0 {
- r, size := utf8.DecodeRuneInString(s)
- if r == utf8.RuneError && size == 1 {
- return "", errors.New("invalid UTF-8")
- }
- s = s[size:]
- if r != '\\' {
- buf.WriteRune(r)
- continue
- }
- r, size = utf8.DecodeRuneInString(s)
- if r == utf8.RuneError && size == 1 {
- return "", errors.New("invalid UTF-8")
- }
- s = s[size:]
- switch r {
- case 'a':
- buf.WriteRune(0x7)
- case 'b':
- buf.WriteRune(0x8)
- case 'f':
- buf.WriteRune(0xc)
- case 'n':
- buf.WriteRune('\n')
- case 'r':
- buf.WriteRune('\r')
- case 't':
- buf.WriteRune('\t')
- case '\n':
- case 'u':
- if len(s) < 4 {
- return "", errors.New("short unicode escape")
- }
- r, err := strconv.ParseUint(s[:4], 16, 32)
- if err != nil {
- return "", err
- }
- buf.WriteRune(rune(r))
- s = s[4:]
- case 'U':
- if len(s) < 8 {
- return "", errors.New("short unicode escape")
- }
- r, err := strconv.ParseUint(s[:8], 16, 32)
- if err != nil {
- return "", err
- }
- buf.WriteRune(rune(r))
- s = s[8:]
- default:
- buf.WriteRune(r)
- }
- }
- return buf.String(), nil
-}
-
-var boolSigSet = sigSet{Signature{"b"}: true}
-
-type boolNode bool
-
-func (boolNode) Infer() (Signature, error) {
- return Signature{"b"}, nil
-}
-
-func (b boolNode) String() string {
- if b {
- return "true"
- }
- return "false"
-}
-
-func (boolNode) Sigs() sigSet {
- return boolSigSet
-}
-
-func (b boolNode) Value(sig Signature) (interface{}, error) {
- if sig.str != "b" {
- return nil, varTypeError{b.String(), sig}
- }
- return bool(b), nil
-}
-
-type arrayNode struct {
- set sigSet
- children []varNode
- val interface{}
-}
-
-func (n arrayNode) Infer() (Signature, error) {
- for _, v := range n.children {
- csig, err := varInfer(v)
- if err != nil {
- continue
- }
- return Signature{"a" + csig.str}, nil
- }
- return Signature{}, fmt.Errorf("can't infer type for %q", n.String())
-}
-
-func (n arrayNode) String() string {
- s := "["
- for i, v := range n.children {
- s += v.String()
- if i != len(n.children)-1 {
- s += ", "
- }
- }
- return s + "]"
-}
-
-func (n arrayNode) Sigs() sigSet {
- return n.set
-}
-
-func (n arrayNode) Value(sig Signature) (interface{}, error) {
- if n.set.Empty() {
- // no type information whatsoever, so this must be an empty slice
- return reflect.MakeSlice(typeFor(sig.str), 0, 0).Interface(), nil
- }
- if !n.set[sig] {
- return nil, varTypeError{n.String(), sig}
- }
- s := reflect.MakeSlice(typeFor(sig.str), len(n.children), len(n.children))
- for i, v := range n.children {
- rv, err := v.Value(Signature{sig.str[1:]})
- if err != nil {
- return nil, err
- }
- s.Index(i).Set(reflect.ValueOf(rv))
- }
- return s.Interface(), nil
-}
-
-func varMakeArrayNode(p *varParser, sig Signature) (varNode, error) {
- var n arrayNode
- if sig.str != "" {
- n.set = sigSet{sig: true}
- }
- if t := p.next(); t.typ == tokArrayEnd {
- return n, nil
- } else {
- p.backup()
- }
-Loop:
- for {
- t := p.next()
- switch t.typ {
- case tokEOF:
- return nil, io.ErrUnexpectedEOF
- case tokError:
- return nil, errors.New(t.val)
- }
- p.backup()
- cn, err := varMakeNode(p)
- if err != nil {
- return nil, err
- }
- if cset := cn.Sigs(); !cset.Empty() {
- if n.set.Empty() {
- n.set = cset.ToArray()
- } else {
- nset := cset.ToArray().Intersect(n.set)
- if nset.Empty() {
- return nil, fmt.Errorf("can't parse %q with given type information", cn.String())
- }
- n.set = nset
- }
- }
- n.children = append(n.children, cn)
- switch t := p.next(); t.typ {
- case tokEOF:
- return nil, io.ErrUnexpectedEOF
- case tokError:
- return nil, errors.New(t.val)
- case tokArrayEnd:
- break Loop
- case tokComma:
- continue
- default:
- return nil, fmt.Errorf("unexpected %q", t.val)
- }
- }
- return n, nil
-}
-
-type variantNode struct {
- n varNode
-}
-
-var variantSet = sigSet{
- Signature{"v"}: true,
-}
-
-func (variantNode) Infer() (Signature, error) {
- return Signature{"v"}, nil
-}
-
-func (n variantNode) String() string {
- return "<" + n.n.String() + ">"
-}
-
-func (variantNode) Sigs() sigSet {
- return variantSet
-}
-
-func (n variantNode) Value(sig Signature) (interface{}, error) {
- if sig.str != "v" {
- return nil, varTypeError{n.String(), sig}
- }
- sig, err := varInfer(n.n)
- if err != nil {
- return nil, err
- }
- v, err := n.n.Value(sig)
- if err != nil {
- return nil, err
- }
- return MakeVariant(v), nil
-}
-
-func varMakeVariantNode(p *varParser, sig Signature) (varNode, error) {
- n, err := varMakeNode(p)
- if err != nil {
- return nil, err
- }
- if t := p.next(); t.typ != tokVariantEnd {
- return nil, fmt.Errorf("unexpected %q", t.val)
- }
- vn := variantNode{n}
- if sig.str != "" && sig.str != "v" {
- return nil, varTypeError{vn.String(), sig}
- }
- return variantNode{n}, nil
-}
-
-type dictEntry struct {
- key, val varNode
-}
-
-type dictNode struct {
- kset, vset sigSet
- children []dictEntry
- val interface{}
-}
-
-func (n dictNode) Infer() (Signature, error) {
- for _, v := range n.children {
- ksig, err := varInfer(v.key)
- if err != nil {
- continue
- }
- vsig, err := varInfer(v.val)
- if err != nil {
- continue
- }
- return Signature{"a{" + ksig.str + vsig.str + "}"}, nil
- }
- return Signature{}, fmt.Errorf("can't infer type for %q", n.String())
-}
-
-func (n dictNode) String() string {
- s := "{"
- for i, v := range n.children {
- s += v.key.String() + ": " + v.val.String()
- if i != len(n.children)-1 {
- s += ", "
- }
- }
- return s + "}"
-}
-
-func (n dictNode) Sigs() sigSet {
- r := sigSet{}
- for k := range n.kset {
- for v := range n.vset {
- sig := "a{" + k.str + v.str + "}"
- r[Signature{sig}] = true
- }
- }
- return r
-}
-
-func (n dictNode) Value(sig Signature) (interface{}, error) {
- set := n.Sigs()
- if set.Empty() {
- // no type information -> empty dict
- return reflect.MakeMap(typeFor(sig.str)).Interface(), nil
- }
- if !set[sig] {
- return nil, varTypeError{n.String(), sig}
- }
- m := reflect.MakeMap(typeFor(sig.str))
- ksig := Signature{sig.str[2:3]}
- vsig := Signature{sig.str[3 : len(sig.str)-1]}
- for _, v := range n.children {
- kv, err := v.key.Value(ksig)
- if err != nil {
- return nil, err
- }
- vv, err := v.val.Value(vsig)
- if err != nil {
- return nil, err
- }
- m.SetMapIndex(reflect.ValueOf(kv), reflect.ValueOf(vv))
- }
- return m.Interface(), nil
-}
-
-func varMakeDictNode(p *varParser, sig Signature) (varNode, error) {
- var n dictNode
-
- if sig.str != "" {
- if len(sig.str) < 5 {
- return nil, fmt.Errorf("invalid signature %q for dict type", sig)
- }
- ksig := Signature{string(sig.str[2])}
- vsig := Signature{sig.str[3 : len(sig.str)-1]}
- n.kset = sigSet{ksig: true}
- n.vset = sigSet{vsig: true}
- }
- if t := p.next(); t.typ == tokDictEnd {
- return n, nil
- } else {
- p.backup()
- }
-Loop:
- for {
- t := p.next()
- switch t.typ {
- case tokEOF:
- return nil, io.ErrUnexpectedEOF
- case tokError:
- return nil, errors.New(t.val)
- }
- p.backup()
- kn, err := varMakeNode(p)
- if err != nil {
- return nil, err
- }
- if kset := kn.Sigs(); !kset.Empty() {
- if n.kset.Empty() {
- n.kset = kset
- } else {
- n.kset = kset.Intersect(n.kset)
- if n.kset.Empty() {
- return nil, fmt.Errorf("can't parse %q with given type information", kn.String())
- }
- }
- }
- t = p.next()
- switch t.typ {
- case tokEOF:
- return nil, io.ErrUnexpectedEOF
- case tokError:
- return nil, errors.New(t.val)
- case tokColon:
- default:
- return nil, fmt.Errorf("unexpected %q", t.val)
- }
- t = p.next()
- switch t.typ {
- case tokEOF:
- return nil, io.ErrUnexpectedEOF
- case tokError:
- return nil, errors.New(t.val)
- }
- p.backup()
- vn, err := varMakeNode(p)
- if err != nil {
- return nil, err
- }
- if vset := vn.Sigs(); !vset.Empty() {
- if n.vset.Empty() {
- n.vset = vset
- } else {
- n.vset = n.vset.Intersect(vset)
- if n.vset.Empty() {
- return nil, fmt.Errorf("can't parse %q with given type information", vn.String())
- }
- }
- }
- n.children = append(n.children, dictEntry{kn, vn})
- t = p.next()
- switch t.typ {
- case tokEOF:
- return nil, io.ErrUnexpectedEOF
- case tokError:
- return nil, errors.New(t.val)
- case tokDictEnd:
- break Loop
- case tokComma:
- continue
- default:
- return nil, fmt.Errorf("unexpected %q", t.val)
- }
- }
- return n, nil
-}
-
-type byteStringNode []byte
-
-var byteStringSet = sigSet{
- Signature{"ay"}: true,
-}
-
-func (byteStringNode) Infer() (Signature, error) {
- return Signature{"ay"}, nil
-}
-
-func (b byteStringNode) String() string {
- return string(b)
-}
-
-func (b byteStringNode) Sigs() sigSet {
- return byteStringSet
-}
-
-func (b byteStringNode) Value(sig Signature) (interface{}, error) {
- if sig.str != "ay" {
- return nil, varTypeError{b.String(), sig}
- }
- return []byte(b), nil
-}
-
-func varParseByteString(s string) ([]byte, error) {
- // quotes and b at start are guaranteed to be there
- b := make([]byte, 0, 1)
- s = s[2 : len(s)-1]
- for len(s) != 0 {
- c := s[0]
- s = s[1:]
- if c != '\\' {
- b = append(b, c)
- continue
- }
- c = s[0]
- s = s[1:]
- switch c {
- case 'a':
- b = append(b, 0x7)
- case 'b':
- b = append(b, 0x8)
- case 'f':
- b = append(b, 0xc)
- case 'n':
- b = append(b, '\n')
- case 'r':
- b = append(b, '\r')
- case 't':
- b = append(b, '\t')
- case 'x':
- if len(s) < 2 {
- return nil, errors.New("short escape")
- }
- n, err := strconv.ParseUint(s[:2], 16, 8)
- if err != nil {
- return nil, err
- }
- b = append(b, byte(n))
- s = s[2:]
- case '0':
- if len(s) < 3 {
- return nil, errors.New("short escape")
- }
- n, err := strconv.ParseUint(s[:3], 8, 8)
- if err != nil {
- return nil, err
- }
- b = append(b, byte(n))
- s = s[3:]
- default:
- b = append(b, c)
- }
- }
- return append(b, 0), nil
-}
-
-func varInfer(n varNode) (Signature, error) {
- if sig, ok := n.Sigs().Single(); ok {
- return sig, nil
- }
- return n.Infer()
-}