github.com/opentofu/opentofu@v1.7.1/internal/command/cliconfig/config_windows.go (about) 1 // Copyright (c) The OpenTofu Authors 2 // SPDX-License-Identifier: MPL-2.0 3 // Copyright (c) 2023 HashiCorp, Inc. 4 // SPDX-License-Identifier: MPL-2.0 5 6 //go:build windows 7 // +build windows 8 9 package cliconfig 10 11 import ( 12 "path/filepath" 13 "syscall" 14 "unsafe" 15 ) 16 17 var ( 18 shell = syscall.MustLoadDLL("Shell32.dll") 19 getFolderPath = shell.MustFindProc("SHGetFolderPathW") 20 ) 21 22 const CSIDL_APPDATA = 26 23 24 func configFile() (string, error) { 25 dir, err := homeDir() 26 if err != nil { 27 return "", err 28 } 29 30 newConfigFile := filepath.Join(dir, "terraform.rc") 31 oldConfigFile := filepath.Join(dir, "tofu.rc") 32 33 return getNewOrLegacyPath(newConfigFile, oldConfigFile) 34 } 35 36 func configDir() (string, error) { 37 dir, err := homeDir() 38 if err != nil { 39 return "", err 40 } 41 42 return filepath.Join(dir, "terraform.d"), nil 43 } 44 45 func dataDirs() ([]string, error) { 46 dir, err := configDir() 47 if err != nil { 48 return nil, err 49 } 50 return []string{dir}, nil 51 } 52 53 func homeDir() (string, error) { 54 b := make([]uint16, syscall.MAX_PATH) 55 56 // See: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx 57 r, _, err := getFolderPath.Call(0, CSIDL_APPDATA, 0, 0, uintptr(unsafe.Pointer(&b[0]))) 58 if uint32(r) != 0 { 59 return "", err 60 } 61 62 return syscall.UTF16ToString(b), nil 63 }