diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-08-29 12:30:00 -0600 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-08-30 08:47:21 -0600 |
commit | 8bdd3390b3c9649334759bfe2bfbcde64dcda235 (patch) | |
tree | 1da4d20d700fb25df198117145a1a9e3e57e99cf /manager/interfacecleanup.go | |
parent | elevate: ensure desktop token is opened with duplication allowed (diff) | |
download | wireguard-windows-8bdd3390b3c9649334759bfe2bfbcde64dcda235.tar.xz wireguard-windows-8bdd3390b3c9649334759bfe2bfbcde64dcda235.zip |
manager: adjust for wintun api changes
Also get rid of the "Local Area Connection" hack and "/wintun
/deleteall".
Diffstat (limited to 'manager/interfacecleanup.go')
-rw-r--r-- | manager/interfacecleanup.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/manager/interfacecleanup.go b/manager/interfacecleanup.go new file mode 100644 index 00000000..7b13b10c --- /dev/null +++ b/manager/interfacecleanup.go @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package manager + +import ( + "log" + + "golang.org/x/sys/windows" + "golang.org/x/sys/windows/svc" + "golang.org/x/sys/windows/svc/mgr" + "golang.zx2c4.com/wireguard/tun/wintun" + + "golang.zx2c4.com/wireguard/tun" + "golang.zx2c4.com/wireguard/windows/services" +) + +func cleanupStaleAdapters() { + defer printPanic() + + m, err := mgr.Connect() + if err != nil { + return + } + defer m.Disconnect() + + tun.WintunPool.DeleteMatchingInterfaces(func(wintun *wintun.Interface) bool { + interfaceName, err := wintun.Name() + if err != nil { + log.Printf("Removing Wintun interface %s because determining interface name failed: %v", wintun.GUID().String(), err) + return true + } + serviceName, err := services.ServiceNameOfTunnel(interfaceName) + if err != nil { + log.Printf("Removing Wintun interface ‘%s’ because determining tunnel service name failed: %v", interfaceName, err) + return true + } + service, err := m.OpenService(serviceName) + if err == windows.ERROR_SERVICE_DOES_NOT_EXIST { + log.Printf("Removing Wintun interface ‘%s’ because no service for it exists", interfaceName) + return true + } else if err != nil { + return false + } + defer service.Close() + status, err := service.Query() + if err != nil { + return false + } + if status.State == svc.Stopped { + log.Printf("Removing Wintun interface ‘%s’ because its service is stopped", interfaceName) + return true + } + return false + }) +} |