diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-08-08 17:16:30 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-08-08 17:16:30 +0200 |
commit | 301773302e5e97544be69965b9fae573791f1460 (patch) | |
tree | ead73dc871aa49f074d48f01a03786fdd47df5fc | |
parent | driver: account for timestamp callback but do nothing (diff) | |
download | wireguard-windows-301773302e5e97544be69965b9fae573791f1460.tar.xz wireguard-windows-301773302e5e97544be69965b9fae573791f1460.zip |
driver: break encapsulation and pass timestamp to ringlogger
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | conf/path_windows.go | 8 | ||||
-rw-r--r-- | driver/driver_windows.go | 10 | ||||
-rw-r--r-- | main.go | 6 | ||||
-rw-r--r-- | manager/service.go | 8 | ||||
-rw-r--r-- | ringlogger/dump.go | 12 | ||||
-rw-r--r-- | ringlogger/global.go | 12 | ||||
-rw-r--r-- | ringlogger/ringlogger.go | 9 | ||||
-rw-r--r-- | tunnel/service.go | 8 |
8 files changed, 46 insertions, 27 deletions
diff --git a/conf/path_windows.go b/conf/path_windows.go index e9ff783a..e63e4774 100644 --- a/conf/path_windows.go +++ b/conf/path_windows.go @@ -126,3 +126,11 @@ func RootDirectory(create bool) (string, error) { cachedRootDir = data return cachedRootDir, nil } + +func LogFile(createRoot bool) (string, error) { + root, err := RootDirectory(createRoot) + if err != nil { + return "", err + } + return filepath.Join(root, "log.bin"), nil +}
\ No newline at end of file diff --git a/driver/driver_windows.go b/driver/driver_windows.go index aa69e09c..f5dda9f0 100644 --- a/driver/driver_windows.go +++ b/driver/driver_windows.go @@ -13,6 +13,7 @@ import ( "unsafe" "golang.org/x/sys/windows" + "golang.zx2c4.com/wireguard/windows/ringlogger" "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" ) @@ -53,8 +54,13 @@ var ( func setupLogger(dll *lazyDLL) { syscall.Syscall(dll.NewProc("WireGuardSetLogger").Addr(), 1, windows.NewCallback(func(level loggerLevel, timestamp uint64, msg *uint16) int { - // TODO: Unfortunately, we're ignoring the precise timestamp here. - log.Println(windows.UTF16PtrToString(msg)) + // This is a filthy hack that breaks layers of encapsulation and also introduces + // an unfortunate dependency of this package. + if rl, ok := log.Default().Writer().(*ringlogger.Ringlogger); ok { + rl.WriteWithTimestamp([]byte(log.Default().Prefix()+windows.UTF16PtrToString(msg)), (int64(timestamp)-116444736000000000)*100) + } else { + log.Println(windows.UTF16PtrToString(msg)) + } return 0 }), 0, 0) } @@ -282,7 +282,11 @@ func main() { } file := os.NewFile(uintptr(outputHandle), "stdout") defer file.Close() - err = ringlogger.DumpTo(file, true) + logPath, err := conf.LogFile(false) + if err != nil { + fatal(err) + } + err = ringlogger.DumpTo(logPath, file) if err != nil { fatal(err) } diff --git a/manager/service.go b/manager/service.go index 9555d386..5c44cfd8 100644 --- a/manager/service.go +++ b/manager/service.go @@ -42,7 +42,13 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest changes <- svc.Status{State: svc.StopPending} }() - err = ringlogger.InitGlobalLogger("MGR") + var logFile string + logFile, err = conf.LogFile(true) + if err != nil { + serviceError = services.ErrorRingloggerOpen + return + } + err = ringlogger.InitGlobalLogger(logFile, "MGR") if err != nil { serviceError = services.ErrorRingloggerOpen return diff --git a/ringlogger/dump.go b/ringlogger/dump.go index 8b5651e3..4891bb60 100644 --- a/ringlogger/dump.go +++ b/ringlogger/dump.go @@ -8,20 +8,12 @@ package ringlogger import ( "io" "os" - "path/filepath" "golang.org/x/sys/windows" - - "golang.zx2c4.com/wireguard/windows/conf" ) -func DumpTo(out io.Writer, notSystem bool) error { - root, err := conf.RootDirectory(!notSystem) - if err != nil { - return err - } - path := filepath.Join(root, "log.bin") - file, err := os.Open(path) +func DumpTo(inPath string, out io.Writer) error { + file, err := os.Open(inPath) if err != nil { return err } diff --git a/ringlogger/global.go b/ringlogger/global.go index 4213e2f1..0685cbd7 100644 --- a/ringlogger/global.go +++ b/ringlogger/global.go @@ -7,23 +7,17 @@ package ringlogger import ( "log" - "path/filepath" "unsafe" - - "golang.zx2c4.com/wireguard/windows/conf" ) var Global *Ringlogger -func InitGlobalLogger(tag string) error { +func InitGlobalLogger(file, tag string) error { if Global != nil { return nil } - root, err := conf.RootDirectory(true) - if err != nil { - return err - } - Global, err = NewRinglogger(filepath.Join(root, "log.bin"), tag) + var err error + Global, err = NewRinglogger(file, tag) if err != nil { return err } diff --git a/ringlogger/ringlogger.go b/ringlogger/ringlogger.go index 443e1848..8888b64e 100644 --- a/ringlogger/ringlogger.go +++ b/ringlogger/ringlogger.go @@ -107,6 +107,12 @@ func newRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string, ac } 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() + return rl.WriteWithTimestamp(p, ts) +} + +func (rl *Ringlogger) WriteWithTimestamp(p []byte, ts int64) (n int, err error) { if rl.readOnly { return 0, io.ErrShortWrite } @@ -116,9 +122,6 @@ func (rl *Ringlogger) Write(p []byte) (n int, err error) { return ret, nil } - // Race: This isn't synchronized with the fetch_add below, so items might be slightly out of order. - ts := time.Now().UnixNano() - if rl.log == nil { return 0, io.EOF } diff --git a/tunnel/service.go b/tunnel/service.go index a5f1df4c..14264193 100644 --- a/tunnel/service.go +++ b/tunnel/service.go @@ -107,7 +107,13 @@ func (service *tunnelService) Execute(args []string, r <-chan svc.ChangeRequest, log.Println("Shutting down") }() - err = ringlogger.InitGlobalLogger("TUN") + var logFile string + logFile, err = conf.LogFile(true) + if err != nil { + serviceError = services.ErrorRingloggerOpen + return + } + err = ringlogger.InitGlobalLogger(logFile, "TUN") if err != nil { serviceError = services.ErrorRingloggerOpen return |