aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/conf/path_windows.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-02-25 18:45:32 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2019-02-28 08:05:02 +0100
commit840f33de326233d5fee1144334db41bf5c82a8fa (patch)
tree43070181e30db403dfad69f3e67a566ba589df4e /conf/path_windows.go
parentInitial scaffolding (diff)
downloadwireguard-windows-840f33de326233d5fee1144334db41bf5c82a8fa.tar.xz
wireguard-windows-840f33de326233d5fee1144334db41bf5c82a8fa.zip
conf: introduce configuration management
Diffstat (limited to 'conf/path_windows.go')
-rw-r--r--conf/path_windows.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/conf/path_windows.go b/conf/path_windows.go
new file mode 100644
index 00000000..0ee3fc73
--- /dev/null
+++ b/conf/path_windows.go
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package conf
+
+import (
+ "errors"
+ "golang.org/x/sys/windows"
+ "os"
+ "path/filepath"
+ "unsafe"
+)
+
+//sys coTaskMemFree(pointer uintptr) = ole32.CoTaskMemFree
+//sys shGetKnownFolderPath(id *windows.GUID, flags uint32, token windows.Handle, path **uint16) (err error) [failretval!=0] = shell32.SHGetKnownFolderPath
+var folderIDLocalAppData = windows.GUID{0xf1b32785, 0x6fba, 0x4fcf, [8]byte{0x9d, 0x55, 0x7b, 0x8e, 0x7f, 0x15, 0x70, 0x91}}
+
+const kfFlagCreate = 0x00008000
+
+var cachedConfigFileDir string
+
+func resolveConfigFileDir() (string, error) {
+ if cachedConfigFileDir != "" {
+ return cachedConfigFileDir, nil
+ }
+ processToken, err := windows.OpenCurrentProcessToken()
+ if err != nil {
+ return "", err
+ }
+ defer processToken.Close()
+ var path *uint16
+ err = shGetKnownFolderPath(&folderIDLocalAppData, kfFlagCreate, windows.Handle(processToken), &path)
+ if err != nil {
+ return "", err
+ }
+ defer coTaskMemFree(uintptr(unsafe.Pointer(path)))
+ root := windows.UTF16ToString((*[windows.MAX_LONG_PATH + 1]uint16)(unsafe.Pointer(path))[:])
+ if len(root) == 0 {
+ return "", errors.New("Unable to determine configuration directory")
+ }
+ c := filepath.Join(root, "WireGuard", "Configurations")
+ err = os.MkdirAll(c, os.ModeDir|0700)
+ if err != nil {
+ return "", err
+ }
+ cachedConfigFileDir = c
+ return cachedConfigFileDir, nil
+}