github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbnm/findbin.go (about)

     1  package main
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  
     9  	"github.com/keybase/client/go/utils"
    10  )
    11  
    12  var errKeybaseNotFound = errors.New("failed to find the keybase binary")
    13  
    14  // findKeybaseBinary returns the path to a Keybase binary, if it finds it.
    15  func findKeybaseBinary(name string) (string, error) {
    16  	// Is it near the kbnm binary?
    17  	binPath, err := utils.BinPath()
    18  	if err == nil {
    19  		path := filepath.Join(filepath.Dir(binPath), name)
    20  		if _, err := os.Stat(path); !os.IsNotExist(err) {
    21  			return path, nil
    22  		}
    23  	}
    24  
    25  	// Is it in our PATH?
    26  	path, err := exec.LookPath(name)
    27  	if err == nil {
    28  		return path, nil
    29  	}
    30  
    31  	// Last ditch effort!
    32  	path = guessKeybasePath(name)
    33  	if _, err := os.Stat(path); !os.IsNotExist(err) {
    34  		return path, nil
    35  	}
    36  
    37  	return "", errKeybaseNotFound
    38  }