@@ -14,36 +14,41 @@ package main
1414import "C"
1515
1616import (
17- "errors"
18- "log"
17+ "fmt"
1918 "math"
2019 "os"
2120 "os/signal"
2221 "runtime"
22+ "runtime/debug"
23+ "strings"
2324 "time"
2425 "unsafe"
2526
2627 "golang.org/x/sys/unix"
28+ "golang.zx2c4.com/wireguard/conn"
2729 "golang.zx2c4.com/wireguard/device"
2830 "golang.zx2c4.com/wireguard/tun"
2931)
3032
3133var loggerFunc unsafe.Pointer
3234var loggerCtx unsafe.Pointer
33- var versionString * C.char
3435
35- type CLogger struct {
36- level C.int
36+ type CLogger int
37+
38+ func cstring (s string ) * C.char {
39+ b , err := unix .BytePtrFromString (s )
40+ if err != nil {
41+ b := [1 ]C.char {}
42+ return & b [0 ]
43+ }
44+ return (* C .char )(unsafe .Pointer (b ))
3745}
3846
39- func (l * CLogger ) Write ( p [] byte ) ( int , error ) {
47+ func (l CLogger ) Printf ( format string , args ... interface {} ) {
4048 if uintptr (loggerFunc ) == 0 {
41- return 0 , errors . New ( "No logger initialized" )
49+ return
4250 }
43- message := C .CString (string (p ))
44- C .callLogger (loggerFunc , loggerCtx , l .level , message )
45- C .free (unsafe .Pointer (message ))
46- return len (p ), nil
51+ C .callLogger (loggerFunc , loggerCtx , C .int (l ), cstring (fmt .Sprintf (format , args ... )))
4752}
4853
4954type tunnelHandle struct {
@@ -54,7 +59,6 @@ type tunnelHandle struct {
5459var tunnelHandles = make (map [int32 ]tunnelHandle )
5560
5661func init () {
57- versionString = C .CString (device .WireGuardGoVersion )
5862 signals := make (chan os.Signal )
5963 signal .Notify (signals , unix .SIGUSR2 )
6064 go func () {
@@ -81,40 +85,39 @@ func wgSetLogger(context, loggerFn uintptr) {
8185//export wgTurnOn
8286func wgTurnOn (settings * C.char , tunFd int32 ) int32 {
8387 logger := & device.Logger {
84- Debug : log .New (& CLogger {level : 0 }, "" , 0 ),
85- Info : log .New (& CLogger {level : 1 }, "" , 0 ),
86- Error : log .New (& CLogger {level : 2 }, "" , 0 ),
88+ Verbosef : CLogger (0 ).Printf ,
89+ Errorf : CLogger (1 ).Printf ,
8790 }
8891 dupTunFd , err := unix .Dup (int (tunFd ))
8992 if err != nil {
90- logger .Error . Println ( err )
93+ logger .Errorf ( "Unable to dup tun fd: %v" , err )
9194 return - 1
9295 }
9396
9497 err = unix .SetNonblock (dupTunFd , true )
9598 if err != nil {
96- logger .Error . Println ( err )
99+ logger .Errorf ( "Unable to set tun fd as non blocking: %v" , err )
97100 unix .Close (dupTunFd )
98101 return - 1
99102 }
100103 tun , err := tun .CreateTUNFromFile (os .NewFile (uintptr (dupTunFd ), "/dev/tun" ), 0 )
101104 if err != nil {
102- logger .Error . Println ( err )
105+ logger .Errorf ( "Unable to create new tun device from fd: %v" , err )
103106 unix .Close (dupTunFd )
104107 return - 1
105108 }
106- logger .Info . Println ("Attaching to interface" )
107- dev := device .NewDevice (tun , logger )
109+ logger .Verbosef ("Attaching to interface" )
110+ dev := device .NewDevice (tun , conn . NewStdNetBind (), logger )
108111
109112 err = dev .IpcSet (C .GoString (settings ))
110113 if err != nil {
111- logger .Error . Println ( err )
114+ logger .Errorf ( "Unable to set IPC settings: %v" , err )
112115 unix .Close (dupTunFd )
113116 return - 1
114117 }
115118
116119 dev .Up ()
117- logger .Info . Println ("Device started" )
120+ logger .Verbosef ("Device started" )
118121
119122 var i int32
120123 for i = 0 ; i < math .MaxInt32 ; i ++ {
@@ -148,7 +151,7 @@ func wgSetConfig(tunnelHandle int32, settings *C.char) int64 {
148151 }
149152 err := dev .IpcSet (C .GoString (settings ))
150153 if err != nil {
151- dev .Error . Println ( err )
154+ dev .Errorf ( "Unable to set IPC settings: %v" , err )
152155 if ipcErr , ok := err .(* device.IPCError ); ok {
153156 return ipcErr .ErrorCode ()
154157 }
@@ -183,10 +186,10 @@ func wgBumpSockets(tunnelHandle int32) {
183186 dev .SendKeepalivesToPeersWithCurrentKeypair ()
184187 return
185188 }
186- dev .Error . Printf ("Unable to update bind, try %d: %v" , i + 1 , err )
189+ dev .Errorf ("Unable to update bind, try %d: %v" , i + 1 , err )
187190 time .Sleep (time .Second / 2 )
188191 }
189- dev .Error . Println ("Gave up trying to update bind; tunnel is likely dysfunctional" )
192+ dev .Errorf ("Gave up trying to update bind; tunnel is likely dysfunctional" )
190193 }()
191194}
192195
@@ -201,7 +204,20 @@ func wgDisableSomeRoamingForBrokenMobileSemantics(tunnelHandle int32) {
201204
202205//export wgVersion
203206func wgVersion () * C.char {
204- return versionString
207+ info , ok := debug .ReadBuildInfo ()
208+ if ! ok {
209+ return C .CString ("unknown" )
210+ }
211+ for _ , dep := range info .Deps {
212+ if dep .Path == "golang.zx2c4.com/wireguard" {
213+ parts := strings .Split (dep .Version , "-" )
214+ if len (parts ) == 3 && len (parts [2 ]) == 12 {
215+ return C .CString (parts [2 ][:7 ])
216+ }
217+ return C .CString (dep .Version )
218+ }
219+ }
220+ return C .CString ("unknown" )
205221}
206222
207223func main () {}
0 commit comments