gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

conn_other.go (2526B)


      1 // +build !darwin
      2 
      3 package dbus
      4 
      5 import (
      6 	"bytes"
      7 	"errors"
      8 	"fmt"
      9 	"io/ioutil"
     10 	"os"
     11 	"os/exec"
     12 	"os/user"
     13 	"path"
     14 	"strings"
     15 )
     16 
     17 var execCommand = exec.Command
     18 
     19 func getSessionBusPlatformAddress() (string, error) {
     20 	cmd := execCommand("dbus-launch")
     21 	b, err := cmd.CombinedOutput()
     22 
     23 	if err != nil {
     24 		return "", err
     25 	}
     26 
     27 	i := bytes.IndexByte(b, '=')
     28 	j := bytes.IndexByte(b, '\n')
     29 
     30 	if i == -1 || j == -1 || i > j {
     31 		return "", errors.New("dbus: couldn't determine address of session bus")
     32 	}
     33 
     34 	env, addr := string(b[0:i]), string(b[i+1:j])
     35 	os.Setenv(env, addr)
     36 
     37 	return addr, nil
     38 }
     39 
     40 // tryDiscoverDbusSessionBusAddress tries to discover an existing dbus session
     41 // and return the value of its DBUS_SESSION_BUS_ADDRESS.
     42 // It tries different techniques employed by different operating systems,
     43 // returning the first valid address it finds, or an empty string.
     44 //
     45 // * /run/user/<uid>/bus           if this exists, it *is* the bus socket. present on
     46 //                                 Ubuntu 18.04
     47 // * /run/user/<uid>/dbus-session: if this exists, it can be parsed for the bus
     48 //                                 address. present on Ubuntu 16.04
     49 //
     50 // See https://dbus.freedesktop.org/doc/dbus-launch.1.html
     51 func tryDiscoverDbusSessionBusAddress() string {
     52 	if runtimeDirectory, err := getRuntimeDirectory(); err == nil {
     53 
     54 		if runUserBusFile := path.Join(runtimeDirectory, "bus"); fileExists(runUserBusFile) {
     55 			// if /run/user/<uid>/bus exists, that file itself
     56 			// *is* the unix socket, so return its path
     57 			return fmt.Sprintf("unix:path=%s", runUserBusFile)
     58 		}
     59 		if runUserSessionDbusFile := path.Join(runtimeDirectory, "dbus-session"); fileExists(runUserSessionDbusFile) {
     60 			// if /run/user/<uid>/dbus-session exists, it's a
     61 			// text file // containing the address of the socket, e.g.:
     62 			// DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-E1c73yNqrG
     63 
     64 			if f, err := ioutil.ReadFile(runUserSessionDbusFile); err == nil {
     65 				fileContent := string(f)
     66 
     67 				prefix := "DBUS_SESSION_BUS_ADDRESS="
     68 
     69 				if strings.HasPrefix(fileContent, prefix) {
     70 					address := strings.TrimRight(strings.TrimPrefix(fileContent, prefix), "\n\r")
     71 					return address
     72 				}
     73 			}
     74 		}
     75 	}
     76 	return ""
     77 }
     78 
     79 func getRuntimeDirectory() (string, error) {
     80 	if currentUser, err := user.Current(); err != nil {
     81 		return "", err
     82 	} else {
     83 		return fmt.Sprintf("/run/user/%s", currentUser.Uid), nil
     84 	}
     85 }
     86 
     87 func fileExists(filename string) bool {
     88 	if _, err := os.Stat(filename); !os.IsNotExist(err) {
     89 		return true
     90 	} else {
     91 		return false
     92 	}
     93 }