Bubble android client. Fork of https://git.zx2c4.com/wireguard-android/
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

api-android.go 3.9 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /* SPDX-License-Identifier: Apache-2.0
  2. *
  3. * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
  4. */
  5. package main
  6. // #cgo LDFLAGS: -llog
  7. // #include <android/log.h>
  8. import "C"
  9. import (
  10. "bufio"
  11. "golang.org/x/sys/unix"
  12. "golang.zx2c4.com/wireguard/device"
  13. "golang.zx2c4.com/wireguard/ipc"
  14. "golang.zx2c4.com/wireguard/tun"
  15. "bytes"
  16. "log"
  17. "math"
  18. "net"
  19. "os"
  20. "os/signal"
  21. "runtime"
  22. "strings"
  23. "unsafe"
  24. )
  25. type AndroidLogger struct {
  26. level C.int
  27. interfaceName string
  28. }
  29. func (l AndroidLogger) Write(p []byte) (int, error) {
  30. C.__android_log_write(l.level, C.CString("WireGuard/GoBackend/"+l.interfaceName), C.CString(string(p)))
  31. return len(p), nil
  32. }
  33. type TunnelHandle struct {
  34. device *device.Device
  35. uapi net.Listener
  36. }
  37. var tunnelHandles map[int32]TunnelHandle
  38. func init() {
  39. device.RoamingDisabled = true
  40. tunnelHandles = make(map[int32]TunnelHandle)
  41. signals := make(chan os.Signal)
  42. signal.Notify(signals, unix.SIGUSR2)
  43. go func() {
  44. buf := make([]byte, os.Getpagesize())
  45. for {
  46. select {
  47. case <-signals:
  48. n := runtime.Stack(buf, true)
  49. buf[n] = 0
  50. C.__android_log_write(C.ANDROID_LOG_ERROR, C.CString("WireGuard/GoBackend/Stacktrace"), (*C.char)(unsafe.Pointer(&buf[0])))
  51. }
  52. }
  53. }()
  54. }
  55. //export wgTurnOn
  56. func wgTurnOn(ifnameRef string, tunFd int32, settings string) int32 {
  57. interfaceName := string([]byte(ifnameRef))
  58. logger := &device.Logger{
  59. Debug: log.New(&AndroidLogger{level: C.ANDROID_LOG_DEBUG, interfaceName: interfaceName}, "", 0),
  60. Info: log.New(&AndroidLogger{level: C.ANDROID_LOG_INFO, interfaceName: interfaceName}, "", 0),
  61. Error: log.New(&AndroidLogger{level: C.ANDROID_LOG_ERROR, interfaceName: interfaceName}, "", 0),
  62. }
  63. logger.Debug.Println("Debug log enabled")
  64. tun, name, err := tun.CreateUnmonitoredTUNFromFD(int(tunFd))
  65. if err != nil {
  66. unix.Close(int(tunFd))
  67. logger.Error.Println(err)
  68. return -1
  69. }
  70. logger.Info.Println("Attaching to interface", name)
  71. device := device.NewDevice(tun, logger)
  72. setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings)))
  73. if setError != nil {
  74. unix.Close(int(tunFd))
  75. logger.Error.Println(setError)
  76. return -1
  77. }
  78. var uapi net.Listener
  79. uapiFile, err := ipc.UAPIOpen(name)
  80. if err != nil {
  81. logger.Error.Println(err)
  82. } else {
  83. uapi, err = ipc.UAPIListen(name, uapiFile)
  84. if err != nil {
  85. uapiFile.Close()
  86. logger.Error.Println(err)
  87. } else {
  88. go func() {
  89. for {
  90. conn, err := uapi.Accept()
  91. if err != nil {
  92. return
  93. }
  94. go device.IpcHandle(conn)
  95. }
  96. }()
  97. }
  98. }
  99. device.Up()
  100. logger.Info.Println("Device started")
  101. var i int32
  102. for i = 0; i < math.MaxInt32; i++ {
  103. if _, exists := tunnelHandles[i]; !exists {
  104. break
  105. }
  106. }
  107. if i == math.MaxInt32 {
  108. unix.Close(int(tunFd))
  109. return -1
  110. }
  111. tunnelHandles[i] = TunnelHandle{device: device, uapi: uapi}
  112. return i
  113. }
  114. //export wgTurnOff
  115. func wgTurnOff(tunnelHandle int32) {
  116. handle, ok := tunnelHandles[tunnelHandle]
  117. if !ok {
  118. return
  119. }
  120. delete(tunnelHandles, tunnelHandle)
  121. if handle.uapi != nil {
  122. handle.uapi.Close()
  123. }
  124. handle.device.Close()
  125. }
  126. //export wgGetSocketV4
  127. func wgGetSocketV4(tunnelHandle int32) int32 {
  128. handle, ok := tunnelHandles[tunnelHandle]
  129. if !ok {
  130. return -1
  131. }
  132. fd, err := handle.device.PeekLookAtSocketFd4()
  133. if err != nil {
  134. return -1
  135. }
  136. return int32(fd)
  137. }
  138. //export wgGetSocketV6
  139. func wgGetSocketV6(tunnelHandle int32) int32 {
  140. handle, ok := tunnelHandles[tunnelHandle]
  141. if !ok {
  142. return -1
  143. }
  144. fd, err := handle.device.PeekLookAtSocketFd6()
  145. if err != nil {
  146. return -1
  147. }
  148. return int32(fd)
  149. }
  150. //export wgGetConfig
  151. func wgGetConfig(tunnelHandle int32) *C.char {
  152. handle, ok := tunnelHandles[tunnelHandle]
  153. if !ok {
  154. return nil
  155. }
  156. settings := new(bytes.Buffer)
  157. writer := bufio.NewWriter(settings)
  158. err := handle.device.IpcGetOperation(writer)
  159. if err != nil {
  160. return nil
  161. }
  162. writer.Flush()
  163. return C.CString(settings.String())
  164. }
  165. //export wgVersion
  166. func wgVersion() *C.char {
  167. return C.CString(device.WireGuardGoVersion)
  168. }
  169. func main() {}