//+build !android !linux package passgo import ( "bufio" "bytes" "fmt" "os" "os/exec" "os/user" "path" "strconv" ) func setAgentInfo() { // get UID of current user 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 // look for gpg-agent running as the current user: 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) } // trim trailing /n and convert to int 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 // find unix domain sockets opened by the current user's gpg-agent 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) } // look for a socket named "S.gpg-agent" 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) // gpg-agent is running, so use GPGPrompt as password prompt ask = GPGPrompt } func init() { setAgentInfo() } //Clip copies a string to the clipboard func Clip(x string) { b := bytes.NewBuffer([]byte(x)) cmd := exec.Command("pbcopy") cmd.Stdin = b cmd.Run() }