aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--main.go4
-rw-r--r--ringlogger/ringlogger_windows.go34
-rw-r--r--service/ipc_client.go5
-rw-r--r--service/ipc_server.go6
-rw-r--r--service/service_manager.go7
-rw-r--r--ui/ui.go8
6 files changed, 38 insertions, 26 deletions
diff --git a/main.go b/main.go
index d246e019..c9941ab9 100644
--- a/main.go
+++ b/main.go
@@ -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()
diff --git a/ui/ui.go b/ui/ui.go
index 08227a99..a3b9e696 100644
--- a/ui/ui.go
+++ b/ui/ui.go
@@ -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)