tun_darwin.go 601 B

12345678910111213141516171819202122232425262728293031323334
  1. package libbox
  2. import (
  3. "golang.org/x/sys/unix"
  4. )
  5. // kanged from wireauard-apple
  6. const utunControlName = "com.apple.net.utun_control"
  7. func GetTunnelFileDescriptor() int32 {
  8. ctlInfo := &unix.CtlInfo{}
  9. copy(ctlInfo.Name[:], utunControlName)
  10. for fd := 0; fd < 1024; fd++ {
  11. addr, err := unix.Getpeername(fd)
  12. if err != nil {
  13. continue
  14. }
  15. addrCTL, loaded := addr.(*unix.SockaddrCtl)
  16. if !loaded {
  17. continue
  18. }
  19. if ctlInfo.Id == 0 {
  20. err = unix.IoctlCtlInfo(fd, ctlInfo)
  21. if err != nil {
  22. continue
  23. }
  24. }
  25. if addrCTL.ID == ctlInfo.Id {
  26. return int32(fd)
  27. }
  28. }
  29. return -1
  30. }