diff --git a/tun/tun_freebsd.go b/tun/tun_freebsd.go index 53d4f41..37f1a0c 100644 --- a/tun/tun_freebsd.go +++ b/tun/tun_freebsd.go @@ -21,6 +21,7 @@ const ( _TUNSIFHEAD = 0x80047460 _TUNSIFMODE = 0x8004745e _TUNGIFNAME = 0x4020745d + _TUNSIFPID = 0x2000745f _SIOCGIFINFO_IN6 = 0xc048696c _SIOCSIFINFO_IN6 = 0xc048696d @@ -266,6 +267,15 @@ func CreateTUNFromFile(file *os.File, mtu int) (Device, error) { errors: make(chan error, 1), } + var errno syscall.Errno + tun.operateOnFd(func(fd uintptr) { + _, _, errno = unix.Syscall(unix.SYS_IOCTL, fd, _TUNSIFPID, uintptr(0)) + }) + if errno != 0 { + tun.tunFile.Close() + return nil, fmt.Errorf("unable to become controlling TUN process: %w", errno) + } + name, err := tun.Name() if err != nil { tun.tunFile.Close()