aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/manager
diff options
context:
space:
mode:
Diffstat (limited to 'manager')
-rw-r--r--manager/adaptercleanup.go (renamed from manager/adapters.go)28
-rw-r--r--manager/ipc_server.go3
-rw-r--r--manager/service.go4
3 files changed, 16 insertions, 19 deletions
diff --git a/manager/adapters.go b/manager/adaptercleanup.go
index 5ac16465..779e4b80 100644
--- a/manager/adapters.go
+++ b/manager/adaptercleanup.go
@@ -7,6 +7,7 @@ package manager
import (
"log"
+ "strings"
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/svc"
@@ -16,12 +17,13 @@ import (
"golang.zx2c4.com/wireguard/windows/services"
)
-func cleanStaleAdapters() {
+const unnamedWintunInterface = "Local Area Connection"
+
+func cleanupStaleAdapters() {
defer printPanic()
m, err := mgr.Connect()
if err != nil {
- log.Printf("Error connecting to Service Control Manager: %v", err)
return
}
defer m.Disconnect()
@@ -32,36 +34,28 @@ func cleanStaleAdapters() {
log.Printf("Removing Wintun interface %s because determining interface name failed: %v", wintun.GUID().String(), err)
return true
}
+ if strings.HasPrefix(interfaceName, unnamedWintunInterface) {
+ return false
+ }
serviceName, err := services.ServiceNameOfTunnel(interfaceName)
if err != nil {
- log.Printf("Removing Wintun interface %s because determining tunnel service name failed: %v", interfaceName, err)
+ 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 orphaned Wintun interface %s", interfaceName)
+ log.Printf("Removing Wintun interface ‘%s’ because no service for it exists", interfaceName)
return true
- }
- if err != nil {
- log.Printf("Error opening service %s: %v", serviceName, err)
+ } else if err != nil {
return false
}
defer service.Close()
- config, err := service.Config()
- if err != nil {
- log.Printf("Error getting service %s configuration: %v", serviceName, err)
- return false
- }
- if config.StartType == mgr.StartAutomatic {
- return false
- }
status, err := service.Query()
if err != nil {
- log.Printf("Error getting service %s status: %v", serviceName, err)
return false
}
if status.State == svc.Stopped {
- log.Printf("Removing unused Wintun interface %s", interfaceName)
+ log.Printf("Removing Wintun interface ‘%s’ because its service is stopped", interfaceName)
return true
}
return false
diff --git a/manager/ipc_server.go b/manager/ipc_server.go
index 7691adb8..ed60d6b6 100644
--- a/manager/ipc_server.go
+++ b/manager/ipc_server.go
@@ -107,6 +107,7 @@ func (s *ManagerService) Start(tunnelName string, unused *uintptr) error {
}
}
}()
+ go cleanupStaleAdapters()
// After that process is started -- it's somewhat asynchronous -- we install the new one.
c, err := conf.LoadFromName(tunnelName)
@@ -121,6 +122,8 @@ func (s *ManagerService) Start(tunnelName string, unused *uintptr) error {
}
func (s *ManagerService) Stop(tunnelName string, _ *uintptr) error {
+ go cleanupStaleAdapters()
+
err := UninstallTunnel(tunnelName)
if err == windows.ERROR_SERVICE_DOES_NOT_EXIST {
_, notExistsError := conf.LoadFromName(tunnelName)
diff --git a/manager/service.go b/manager/service.go
index 7ab3db16..8a525b12 100644
--- a/manager/service.go
+++ b/manager/service.go
@@ -182,7 +182,7 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest
return
}
- log.Printf("Starting UI process for user '%s@%s' for session %d", username, domain, session)
+ log.Printf("Starting UI process for user ‘%s@%s’ for session %d", username, domain, session)
attr := &os.ProcAttr{
Sys: &syscall.SysProcAttr{
Token: syscall.Token(elevatedToken),
@@ -247,7 +247,7 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest
}()
}
- go cleanStaleAdapters()
+ go cleanupStaleAdapters()
go checkForUpdates()
var sessionsPointer *windows.WTS_SESSION_INFO