@@ -10,15 +10,12 @@ package main
10
10
import "C"
11
11
12
12
import (
13
- "bufio"
14
- "bytes"
15
- "log"
13
+ "fmt"
16
14
"math"
17
15
"net"
18
16
"os"
19
17
"os/signal"
20
18
"runtime"
21
- "strings"
22
19
"unsafe"
23
20
24
21
"golang.org/x/sys/unix"
@@ -29,13 +26,21 @@ import (
29
26
)
30
27
31
28
type AndroidLogger struct {
32
- level C.int
33
- interfaceName string
29
+ level C.int
30
+ tag * C. char
34
31
}
35
32
36
- func (l AndroidLogger ) Write (p []byte ) (int , error ) {
37
- C .__android_log_write (l .level , C .CString ("WireGuard/GoBackend/" + l .interfaceName ), C .CString (string (p )))
38
- return len (p ), nil
33
+ func cstring (s string ) * C.char {
34
+ b , err := unix .BytePtrFromString (s )
35
+ if err != nil {
36
+ b := [1 ]C.char {}
37
+ return & b [0 ]
38
+ }
39
+ return (* C .char )(unsafe .Pointer (b ))
40
+ }
41
+
42
+ func (l AndroidLogger ) Printf (format string , args ... interface {}) {
43
+ C .__android_log_write (l .level , l .tag , cstring (fmt .Sprintf (format , args ... )))
39
44
}
40
45
41
46
type TunnelHandle struct {
@@ -55,39 +60,38 @@ func init() {
55
60
select {
56
61
case <- signals :
57
62
n := runtime .Stack (buf , true )
63
+ if n == len (buf ) {
64
+ n --
65
+ }
58
66
buf [n ] = 0
59
- C .__android_log_write (C .ANDROID_LOG_ERROR , C . CString ("WireGuard/GoBackend/Stacktrace" ), (* C .char )(unsafe .Pointer (& buf [0 ])))
67
+ C .__android_log_write (C .ANDROID_LOG_ERROR , cstring ("WireGuard/GoBackend/Stacktrace" ), (* C .char )(unsafe .Pointer (& buf [0 ])))
60
68
}
61
69
}
62
70
}()
63
71
}
64
72
65
73
//export wgTurnOn
66
- func wgTurnOn (ifnameRef string , tunFd int32 , settings string ) int32 {
67
- interfaceName := string ([]byte (ifnameRef ))
68
-
74
+ func wgTurnOn (interfaceName string , tunFd int32 , settings string ) int32 {
75
+ tag := cstring ("WireGuard/GoBackend/" + interfaceName )
69
76
logger := & device.Logger {
70
- Debug : log .New (& AndroidLogger {level : C .ANDROID_LOG_DEBUG , interfaceName : interfaceName }, "" , 0 ),
71
- Info : log .New (& AndroidLogger {level : C .ANDROID_LOG_INFO , interfaceName : interfaceName }, "" , 0 ),
72
- Error : log .New (& AndroidLogger {level : C .ANDROID_LOG_ERROR , interfaceName : interfaceName }, "" , 0 ),
77
+ Verbosef : AndroidLogger {level : C .ANDROID_LOG_DEBUG , tag : tag }.Printf ,
78
+ Errorf : AndroidLogger {level : C .ANDROID_LOG_ERROR , tag : tag }.Printf ,
73
79
}
74
80
75
- logger .Debug .Println ("Debug log enabled" )
76
-
77
81
tun , name , err := tun .CreateUnmonitoredTUNFromFD (int (tunFd ))
78
82
if err != nil {
79
83
unix .Close (int (tunFd ))
80
- logger .Error . Println ( err )
84
+ logger .Errorf ( "CreateUnmonitoredTUNFromFD: %v" , err )
81
85
return - 1
82
86
}
83
87
84
- logger .Info . Println ("Attaching to interface" , name )
88
+ logger .Verbosef ("Attaching to interface %v " , name )
85
89
device := device .NewDevice (tun , logger )
86
90
87
- setError : = device .IpcSetOperation ( bufio . NewReader ( strings . NewReader ( settings )) )
88
- if setError != nil {
91
+ err = device .IpcSet ( settings )
92
+ if err != nil {
89
93
unix .Close (int (tunFd ))
90
- logger .Error . Println ( setError )
94
+ logger .Errorf ( "IpcSet: %v" , err )
91
95
return - 1
92
96
}
93
97
device .DisableSomeRoamingForBrokenMobileSemantics ()
@@ -96,12 +100,12 @@ func wgTurnOn(ifnameRef string, tunFd int32, settings string) int32 {
96
100
97
101
uapiFile , err := ipc .UAPIOpen (name )
98
102
if err != nil {
99
- logger .Error . Println ( err )
103
+ logger .Errorf ( "UAPIOpen: %v" , err )
100
104
} else {
101
105
uapi , err = ipc .UAPIListen (name , uapiFile )
102
106
if err != nil {
103
107
uapiFile .Close ()
104
- logger .Error . Println ( err )
108
+ logger .Errorf ( "UAPIListen: %v" , err )
105
109
} else {
106
110
go func () {
107
111
for {
@@ -116,7 +120,7 @@ func wgTurnOn(ifnameRef string, tunFd int32, settings string) int32 {
116
120
}
117
121
118
122
device .Up ()
119
- logger .Info . Println ("Device started" )
123
+ logger .Verbosef ("Device started" )
120
124
121
125
var i int32
122
126
for i = 0 ; i < math .MaxInt32 ; i ++ {
@@ -185,14 +189,11 @@ func wgGetConfig(tunnelHandle int32) *C.char {
185
189
if ! ok {
186
190
return nil
187
191
}
188
- settings := new (bytes.Buffer )
189
- writer := bufio .NewWriter (settings )
190
- err := handle .device .IpcGetOperation (writer )
192
+ settings , err := handle .device .IpcGet ()
191
193
if err != nil {
192
194
return nil
193
195
}
194
- writer .Flush ()
195
- return C .CString (settings .String ())
196
+ return C .CString (settings )
196
197
}
197
198
198
199
//export wgVersion
0 commit comments