| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- // Copyright (c) Tailscale Inc & AUTHORS
- // SPDX-License-Identifier: BSD-3-Clause
- //go:build linux && !android && !ts_omit_dbus
- package dns
- import (
- "context"
- "time"
- "github.com/godbus/dbus/v5"
- )
- func init() {
- optDBusPing.Set(dbusPing)
- optDBusReadString.Set(dbusReadString)
- }
- func dbusPing(name, objectPath string) error {
- conn, err := dbus.SystemBus()
- if err != nil {
- // DBus probably not running.
- return err
- }
- ctx, cancel := context.WithTimeout(context.Background(), time.Second)
- defer cancel()
- obj := conn.Object(name, dbus.ObjectPath(objectPath))
- call := obj.CallWithContext(ctx, "org.freedesktop.DBus.Peer.Ping", 0)
- return call.Err
- }
- // dbusReadString reads a string property from the provided name and object
- // path. property must be in "interface.member" notation.
- func dbusReadString(name, objectPath, iface, member string) (string, error) {
- conn, err := dbus.SystemBus()
- if err != nil {
- // DBus probably not running.
- return "", err
- }
- ctx, cancel := context.WithTimeout(context.Background(), time.Second)
- defer cancel()
- obj := conn.Object(name, dbus.ObjectPath(objectPath))
- var result dbus.Variant
- err = obj.CallWithContext(ctx, "org.freedesktop.DBus.Properties.Get", 0, iface, member).Store(&result)
- if err != nil {
- return "", err
- }
- if s, ok := result.Value().(string); ok {
- return s, nil
- }
- return result.String(), nil
- }
|