"/Library/Keychains/System.keychain",
}
- home := os.UserHomeDir()
- if home == "" {
+ home, err := os.UserHomeDir()
+ if err != nil {
if debugExecDarwinRoots {
- println("crypto/x509: can't get user home directory")
+ println("crypto/x509: can't get user home directory: %v", err)
}
} else {
args = append(args,
// On Unix, including macOS, it returns the $HOME environment variable.
// On Windows, it returns %USERPROFILE%.
// On Plan 9, it returns the $home environment variable.
-func UserHomeDir() string {
+func UserHomeDir() (string, error) {
+ env, enverr := "HOME", "$HOME"
switch runtime.GOOS {
case "windows":
- return Getenv("USERPROFILE")
+ env, enverr = "USERPROFILE", "%userprofile%"
case "plan9":
- return Getenv("home")
+ env, enverr = "home", "$home"
case "nacl", "android":
- return "/"
+ return "/", nil
case "darwin":
if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
- return "/"
+ return "/", nil
}
- fallthrough
- default:
- return Getenv("HOME")
}
+ if v := Getenv(env); v != "" {
+ return v, nil
+ }
+ return "", errors.New(enverr + " is not defined")
}
// Chmod changes the mode of the named file to mode.
}
func TestUserHomeDir(t *testing.T) {
- dir := UserHomeDir()
- if dir == "" {
- t.Fatal("UserHomeDir returned an empty string")
+ dir, err := UserHomeDir()
+ if dir == "" && err == nil {
+ t.Fatal("UserHomeDir returned an empty string but no error")
+ }
+ if err != nil {
+ t.Skipf("UserHomeDir failed: %v", err)
}
fi, err := Stat(dir)
if err != nil {