aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service/ipc_server.go
diff options
context:
space:
mode:
Diffstat (limited to 'service/ipc_server.go')
-rw-r--r--service/ipc_server.go59
1 files changed, 26 insertions, 33 deletions
diff --git a/service/ipc_server.go b/service/ipc_server.go
index a2a4c9ee..73c2916e 100644
--- a/service/ipc_server.go
+++ b/service/ipc_server.go
@@ -6,13 +6,15 @@
package service
import (
+ "bytes"
+ "encoding/gob"
"errors"
- "golang.org/x/sys/windows"
"golang.zx2c4.com/wireguard/windows/conf"
"net/rpc"
"os"
"sync"
"sync/atomic"
+ "time"
)
var managerServices = make(map[*ManagerService]bool)
@@ -21,8 +23,7 @@ var haveQuit uint32
var quitManagersChan = make(chan struct{}, 1)
type ManagerService struct {
- notifierHandles map[windows.Handle]bool
- notifierHandlesLock sync.RWMutex
+ events *os.File
}
func (s *ManagerService) StoredConfig(tunnelName string, config *conf.Config) error {
@@ -127,22 +128,8 @@ func (s *ManagerService) Quit(stopTunnelsOnQuit bool, alreadyQuit *bool) error {
return nil
}
-func (s *ManagerService) RegisterAsNotificationThread(handle windows.Handle, unused *uintptr) error {
- s.notifierHandlesLock.Lock()
- s.notifierHandles[handle] = true
- s.notifierHandlesLock.Unlock()
- return nil
-}
-
-func (s *ManagerService) UnregisterAsNotificationThread(handle windows.Handle, unused *uintptr) error {
- s.notifierHandlesLock.Lock()
- delete(s.notifierHandles, handle)
- s.notifierHandlesLock.Unlock()
- return nil
-}
-
-func IPCServerListen(reader *os.File, writer *os.File) error {
- service := &ManagerService{notifierHandles: make(map[windows.Handle]bool)}
+func IPCServerListen(reader *os.File, writer *os.File, events *os.File) error {
+ service := &ManagerService{events: events}
server := rpc.NewServer()
err := server.Register(service)
@@ -163,28 +150,34 @@ func IPCServerListen(reader *os.File, writer *os.File) error {
return nil
}
-//sys postMessage(hwnd windows.Handle, msg uint, wparam uintptr, lparam uintptr) (err error) = user32.PostMessageW
+func notifyAll(notificationType NotificationType, iface interface{}) {
+ var buf bytes.Buffer
+ encoder := gob.NewEncoder(&buf)
+ err := encoder.Encode(notificationType)
+ if err != nil {
+ return
+ }
+ if iface != nil {
+ err = encoder.Encode(iface)
+ if err != nil {
+ return
+ }
+ }
-func notifyAll(f func(handle windows.Handle)) {
managerServicesLock.RLock()
- for m, _ := range managerServices {
- m.notifierHandlesLock.RLock()
- for handle, _ := range m.notifierHandles {
- f(handle)
- }
- m.notifierHandlesLock.RUnlock()
+ for m := range managerServices {
+ go func() {
+ m.events.SetWriteDeadline(time.Now().Add(time.Second))
+ m.events.Write(buf.Bytes())
+ }()
}
managerServicesLock.RUnlock()
}
func IPCServerNotifyTunnelChange(name string) {
- notifyAll(func(handle windows.Handle) {
- //TODO: postthreadmessage
- })
+ notifyAll(TunnelChangeNotificationType, name)
}
func IPCServerNotifyTunnelsChange() {
- notifyAll(func(handle windows.Handle) {
- postMessage(handle, tunnelsChangedMessage, 0, 0)
- })
+ notifyAll(TunnelsChangeNotificationType, nil)
}