diff options
-rw-r--r-- | main.go | 4 | ||||
-rw-r--r-- | ringlogger/ringlogger_windows.go | 34 | ||||
-rw-r--r-- | service/ipc_client.go | 5 | ||||
-rw-r--r-- | service/ipc_server.go | 6 | ||||
-rw-r--r-- | service/service_manager.go | 7 | ||||
-rw-r--r-- | ui/ui.go | 8 |
6 files changed, 38 insertions, 26 deletions
@@ -24,7 +24,7 @@ var flags = [...]string{ "/uninstalltunnelservice CONFIG_PATH", "/managerservice", "/tunnelservice CONFIG_PATH", - "/ui CMD_READ_HANDLE CMD_WRITE_HANDLE CMD_EVENT_HANDLE", + "/ui CMD_READ_HANDLE CMD_WRITE_HANDLE CMD_EVENT_HANDLE LOG_MAPPING_HANDLE", } //sys messageBoxEx(hwnd windows.Handle, text *uint16, title *uint16, typ uint, languageId uint16) = user32.MessageBoxExW @@ -135,7 +135,7 @@ func main() { } return case "/ui": - if len(os.Args) != 5 { + if len(os.Args) != 6 { usage() } readPipe, err := pipeFromHandleArgument(os.Args[2]) diff --git a/ringlogger/ringlogger_windows.go b/ringlogger/ringlogger_windows.go index 1a49570c..f0e7e50a 100644 --- a/ringlogger/ringlogger_windows.go +++ b/ringlogger/ringlogger_windows.go @@ -12,6 +12,7 @@ import ( "io" "os" "runtime" + "strconv" "sync/atomic" "time" "unsafe" @@ -54,12 +55,21 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { if err != nil { return nil, err } - view, err := windows.MapViewOfFile(mapping, windows.FILE_MAP_WRITE, 0, 0, 0) + rl, err := NewRingloggerFromMappingHandle(mapping, tag) if err != nil { return nil, err } + rl.file = file + return rl, nil +} + +func NewRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string) (*Ringlogger, error) { + view, err := windows.MapViewOfFile(mappingHandle, windows.FILE_MAP_WRITE, 0, 0, 0) if err != nil { - windows.CloseHandle(mapping) + return nil, err + } + if err != nil { + windows.CloseHandle(mappingHandle) return nil, err } log := (*logMem)(unsafe.Pointer(view)) @@ -74,14 +84,21 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { rl := &Ringlogger{ tag: tag, - file: file, - mapping: mapping, + mapping: mappingHandle, log: log, } runtime.SetFinalizer(rl, (*Ringlogger).Close) return rl, nil } +func NewRingloggerFromInheritedMappingHandle(handleStr string, tag string) (*Ringlogger, error) { + handle, err := strconv.ParseUint(handleStr, 10, 64) + if err != nil { + return nil, err + } + return NewRingloggerFromMappingHandle(windows.Handle(handle), tag) +} + func (rl *Ringlogger) Write(p []byte) (n int, err error) { // Race: This isn't synchronized with the fetch_add below, so items might be slightly out of order. ts := time.Now().UnixNano() @@ -202,6 +219,11 @@ func (rl *Ringlogger) Close() error { return nil } -func (rl *Ringlogger) Filename() string { - return rl.file.Name() +func (rl *Ringlogger) ExportInheritableMappingHandleStr() (str string, err error) { + err = windows.SetHandleInformation(rl.mapping, windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) + if err != nil { + return + } + str = strconv.FormatUint(uint64(rl.mapping), 10) + return } diff --git a/service/ipc_client.go b/service/ipc_client.go index 7e260ea7..e6295b91 100644 --- a/service/ipc_client.go +++ b/service/ipc_client.go @@ -141,11 +141,6 @@ func IPCClientQuit(stopTunnelsOnQuit bool) (bool, error) { return alreadyQuit, rpcClient.Call("ManagerService.Quit", stopTunnelsOnQuit, &alreadyQuit) } -func IPCClientLogFilePath() (string, error) { - var path string - return path, rpcClient.Call("ManagerService.LogFilePath", uintptr(0), &path) -} - func IPCClientRegisterTunnelChange(cb func(tunnel *Tunnel, state TunnelState, err error)) *TunnelChangeCallback { s := &TunnelChangeCallback{cb} tunnelChangeCallbacks[s] = true diff --git a/service/ipc_server.go b/service/ipc_server.go index 079dc85c..17ea67c2 100644 --- a/service/ipc_server.go +++ b/service/ipc_server.go @@ -11,7 +11,6 @@ import ( "github.com/Microsoft/go-winio" "golang.org/x/sys/windows/svc" "golang.zx2c4.com/wireguard/windows/conf" - "golang.zx2c4.com/wireguard/windows/ringlogger" "io/ioutil" "net/rpc" "os" @@ -207,11 +206,6 @@ func (s *ManagerService) Quit(stopTunnelsOnQuit bool, alreadyQuit *bool) error { return nil } -func (s *ManagerService) LogFilePath(unused uintptr, filepath *string) error { - *filepath = ringlogger.Global.Filename() - return nil -} - func IPCServerListen(reader *os.File, writer *os.File, events *os.File) error { service := &ManagerService{events: events} diff --git a/service/service_manager.go b/service/service_manager.go index 9fffbfe3..3d7449bd 100644 --- a/service/service_manager.go +++ b/service/service_manager.go @@ -169,6 +169,11 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest log.Printf("Unable to listen on IPC pipes: %v", err) return } + theirLogMapping, err := ringlogger.Global.ExportInheritableMappingHandleStr() + if err != nil { + log.Printf("Unable to export inheritable mapping handle for logging: %v", err) + return + } log.Printf("Starting UI process for user: '%s@%s'", username, domain) attr := &os.ProcAttr{ @@ -177,7 +182,7 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest }, Files: []*os.File{devNull, devNull, devNull}, } - proc, err := os.StartProcess(path, []string{path, "/ui", theirReaderStr, theirWriterStr, theirEventStr}, attr) + proc, err := os.StartProcess(path, []string{path, "/ui", theirReaderStr, theirWriterStr, theirEventStr, theirLogMapping}, attr) theirReader.Close() theirWriter.Close() theirEvents.Close() @@ -181,13 +181,9 @@ func RunUI() { restoreState = false }) - logfile, err := service.IPCClientLogFilePath() - var logger *ringlogger.Ringlogger - if err == nil { - logger, err = ringlogger.NewRinglogger(logfile, "GUI") - } + logger, err := ringlogger.NewRingloggerFromInheritedMappingHandle(os.Args[5], "GUI") if err != nil { - walk.MsgBox(nil, "Unable to initialize logging", fmt.Sprintf("%v\n\nFile: %s", err, logfile), walk.MsgBoxIconError) + walk.MsgBox(nil, "Unable to initialize logging", fmt.Sprint(err), walk.MsgBoxIconError) return } NewLogView(mw, logger) |