Bubble android client. Fork of https://git.zx2c4.com/wireguard-android/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 rivejä
2.7 KiB

  1. package main
  2. // #cgo LDFLAGS: -llog
  3. // #include <android/log.h>
  4. import "C"
  5. import (
  6. "bufio"
  7. "io/ioutil"
  8. "log"
  9. "math"
  10. "os"
  11. "strings"
  12. "syscall"
  13. )
  14. type AndroidLogger struct {
  15. level C.int
  16. interfaceName string
  17. }
  18. func (l AndroidLogger) Write(p []byte) (int, error) {
  19. C.__android_log_write(l.level, C.CString("WireGuard/GoBackend/"+l.interfaceName), C.CString(string(p)))
  20. return len(p), nil
  21. }
  22. var tunnelHandles map[int32]*Device
  23. func init() {
  24. tunnelHandles = make(map[int32]*Device)
  25. }
  26. //export wgTurnOn
  27. func wgTurnOn(ifnameRef string, tun_fd int32, settings string) int32 {
  28. interfaceName := string([]byte(ifnameRef))
  29. logger := &Logger{
  30. Debug: log.New(&AndroidLogger{level: C.ANDROID_LOG_DEBUG, interfaceName: interfaceName}, "", 0),
  31. Info: log.New(&AndroidLogger{level: C.ANDROID_LOG_INFO, interfaceName: interfaceName}, "", 0),
  32. Error: log.New(&AndroidLogger{level: C.ANDROID_LOG_ERROR, interfaceName: interfaceName}, "", 0),
  33. }
  34. logger.Debug.Println("Debug log enabled")
  35. tun := &NativeTun{
  36. fd: os.NewFile(uintptr(tun_fd), "/dev/tun"),
  37. events: make(chan TUNEvent, 5),
  38. errors: make(chan error, 5),
  39. nopi: true,
  40. }
  41. var err error
  42. err = syscall.SetNonblock(int(tun_fd), true)
  43. if err != nil {
  44. logger.Error.Println(err)
  45. return -1
  46. }
  47. tun.closingReader, tun.closingWriter, err = os.Pipe()
  48. if err != nil {
  49. logger.Error.Println(err)
  50. return -1
  51. }
  52. name, err := tun.Name()
  53. if err != nil {
  54. logger.Error.Println(err)
  55. return -1
  56. }
  57. logger.Info.Println("Attaching to interface", name)
  58. device := NewDevice(tun, logger)
  59. logger.Debug.Println("Interface has MTU", device.tun.mtu)
  60. bufferedSettings := bufio.NewReadWriter(bufio.NewReader(strings.NewReader(settings)), bufio.NewWriter(ioutil.Discard))
  61. setError := ipcSetOperation(device, bufferedSettings)
  62. if setError != nil {
  63. logger.Error.Println(setError)
  64. return -1
  65. }
  66. device.Up()
  67. logger.Info.Println("Device started")
  68. var i int32
  69. for i = 0; i < math.MaxInt32; i++ {
  70. if _, exists := tunnelHandles[i]; !exists {
  71. break
  72. }
  73. }
  74. if i == math.MaxInt32 {
  75. return -1
  76. }
  77. tunnelHandles[i] = device
  78. return i
  79. }
  80. //export wgTurnOff
  81. func wgTurnOff(tunnelHandle int32) {
  82. device, ok := tunnelHandles[tunnelHandle]
  83. if !ok {
  84. return
  85. }
  86. delete(tunnelHandles, tunnelHandle)
  87. device.Close()
  88. }
  89. //export wgGetSocketV4
  90. func wgGetSocketV4(tunnelHandle int32) int32 {
  91. device, ok := tunnelHandles[tunnelHandle]
  92. if !ok {
  93. return -1
  94. }
  95. native, ok := device.net.bind.(*NativeBind)
  96. if !ok {
  97. return -1
  98. }
  99. return int32(native.sock4)
  100. }
  101. //export wgGetSocketV6
  102. func wgGetSocketV6(tunnelHandle int32) int32 {
  103. device, ok := tunnelHandles[tunnelHandle]
  104. if !ok {
  105. return -1
  106. }
  107. native, ok := device.net.bind.(*NativeBind)
  108. if !ok {
  109. return -1
  110. }
  111. return int32(native.sock6)
  112. }
  113. func main() {}