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  }