passgo/impl_darwin.go
2019-09-04 22:32:19 -04:00

87 lines
1.5 KiB
Go

//+build !android !linux
package gpass
import (
"fmt"
"bufio"
"bytes"
"os"
"os/exec"
"os/user"
"path"
"strconv"
)
func setAgentInfo() {
// get UID
usr, err := user.Current()
if err != nil {
fmt.Printf("Error: cannot get user ID: %s\n", err)
return
}
uid := usr.Uid
// get GPG Agent PID
output, err := exec.Command("pgrep", "-U", uid, "gpg-agent").Output()
if err != nil {
fmt.Printf("Error: %s\n", err)
return
} else {
fmt.Printf("gpg-agent process number is %s\n", output)
}
pid, err := strconv.Atoi(string(output[:len(output)-1]))
if err != nil {
fmt.Printf("Integer conversion failed: %s\n", err)
return
}
// find agent socket file
cmd := exec.Command("lsof", "-w", "-Fn", "-u", uid, "-baUcgpg-agent")
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Printf("Error: connect stdout to lsof: %s\n", err)
return
}
scanner := bufio.NewScanner(stdout)
err = cmd.Start()
if err != nil {
fmt.Printf("Error: cannot run lsof: %s\n", err)
}
filename := ""
for scanner.Scan() {
x := scanner.Text()
if x[0] != 'n' {
continue
}
x = x[1:]
if path.Base(x) == "S.gpg-agent" {
fmt.Println(x)
filename = x
}
}
cmd.Wait()
if filename == "" {
fmt.Printf("Error: gpg-agent socket file not found\n")
return
}
s := fmt.Sprintf("%s:%d:1", filename, pid)
fmt.Printf("GPG_AGENT_INFO = %s\n", s)
os.Setenv("GPG_AGENT_INFO",s)
ask = GPGPrompt
}
func init() {
setAgentInfo()
}
func Clip(x string) {
b := bytes.NewBuffer([]byte(x))
cmd := exec.Command("pbcopy")
cmd.Stdin = b
cmd.Run()
}