aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-08-08 17:16:30 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-08-08 17:16:30 +0200
commit301773302e5e97544be69965b9fae573791f1460 (patch)
treeead73dc871aa49f074d48f01a03786fdd47df5fc
parentdriver: account for timestamp callback but do nothing (diff)
downloadwireguard-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.go8
-rw-r--r--driver/driver_windows.go10
-rw-r--r--main.go6
-rw-r--r--manager/service.go8
-rw-r--r--ringlogger/dump.go12
-rw-r--r--ringlogger/global.go12
-rw-r--r--ringlogger/ringlogger.go9
-rw-r--r--tunnel/service.go8
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)
}
diff --git a/main.go b/main.go
index 6abdd11f..3284b8da 100644
--- a/main.go
+++ b/main.go
@@ -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