type nativeTun struct {
name string
- fd *os.File
+ tunFile *os.File
+ fd uintptr
rwcancel *rwcancel.RWCancel
events chan TUNEvent
errors chan error
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{
- fd: file,
- events: make(chan TUNEvent, 10),
- errors: make(chan error, 1),
+ tunFile: file,
+ fd: file.Fd(),
+ events: make(chan TUNEvent, 10),
+ errors: make(chan error, 1),
}
name, err := tun.Name()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
return iface.Index, nil
}()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
- tun.rwcancel, err = rwcancel.NewRWCancel(int(file.Fd()))
+ tun.rwcancel, err = rwcancel.NewRWCancel(int(tun.fd))
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
_, _, errno := unix.Syscall6(
unix.SYS_GETSOCKOPT,
- uintptr(tun.fd.Fd()),
+ uintptr(tun.fd),
2, /* #define SYSPROTO_CONTROL 2 */
2, /* #define UTUN_OPT_IFNAME 2 */
uintptr(unsafe.Pointer(&ifName)),
}
func (tun *nativeTun) File() *os.File {
- return tun.fd
+ return tun.tunFile
}
func (tun *nativeTun) Events() chan TUNEvent {
return 0, err
default:
buff := buff[offset-4:]
- n, err := tun.fd.Read(buff[:])
+ n, err := tun.tunFile.Read(buff[:])
if n < 4 {
return 0, err
}
// write
- return tun.fd.Write(buff)
+ return tun.tunFile.Write(buff)
}
func (tun *nativeTun) Close() error {
var err3 error
err1 := tun.rwcancel.Cancel()
- err2 := tun.fd.Close()
+ err2 := tun.tunFile.Close()
if tun.routeSocket != -1 {
unix.Shutdown(tun.routeSocket, unix.SHUT_RDWR)
err3 = unix.Close(tun.routeSocket)
type nativeTun struct {
name string
- fd *os.File
+ tunFile *os.File
+ fd uintptr
rwcancel *rwcancel.RWCancel
events chan TUNEvent
errors chan error
return nil, fmt.Errorf("interface %s already exists", name)
}
- tunfile, err := os.OpenFile("/dev/tun", unix.O_RDWR, 0)
+ tunFile, err := os.OpenFile("/dev/tun", unix.O_RDWR, 0)
if err != nil {
return nil, err
}
- tunfd := tunfile.Fd()
+ tunfd := tunFile.Fd()
assignedName, err := tunName(tunfd)
if err != nil {
- tunfile.Close()
+ tunFile.Close()
return nil, err
}
uintptr(unsafe.Pointer(&ifr)),
)
if errno != 0 {
- tunfile.Close()
+ tunFile.Close()
tunDestroy(name)
return nil, fmt.Errorf("failed to rename %s to %s: %s", assignedName, name, errno.Error())
}
- return CreateTUNFromFile(tunfile, mtu)
+ return CreateTUNFromFile(tunFile, mtu)
}
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{
- fd: file,
- events: make(chan TUNEvent, 10),
- errors: make(chan error, 1),
+ tunFile: file,
+ fd: file.Fd(),
+ events: make(chan TUNEvent, 10),
+ errors: make(chan error, 1),
}
name, err := tun.Name()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
return iface.Index, nil
}()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
- tun.rwcancel, err = rwcancel.NewRWCancel(int(file.Fd()))
+ tun.rwcancel, err = rwcancel.NewRWCancel(int(tun.fd))
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
}
func (tun *nativeTun) Name() (string, error) {
- name, err := tunName(tun.fd.Fd())
+ name, err := tunName(tun.fd)
if err != nil {
return "", err
}
}
func (tun *nativeTun) File() *os.File {
- return tun.fd
+ return tun.tunFile
}
func (tun *nativeTun) Events() chan TUNEvent {
return 0, err
default:
buff := buff[offset-4:]
- n, err := tun.fd.Read(buff[:])
+ n, err := tun.tunFile.Read(buff[:])
if n < 4 {
return 0, err
}
// write
- return tun.fd.Write(buff)
+ return tun.tunFile.Write(buff)
}
func (tun *nativeTun) Close() error {
var err4 error
err1 := tun.rwcancel.Cancel()
- err2 := tun.fd.Close()
+ err2 := tun.tunFile.Close()
err3 := tunDestroy(tun.name)
if tun.routeSocket != -1 {
unix.Shutdown(tun.routeSocket, unix.SHUT_RDWR)
)
type nativeTun struct {
- fd *os.File
+ tunFile *os.File
+ fd uintptr
fdCancel *rwcancel.RWCancel
index int32 // if index
name string // name of interface
}
func (tun *nativeTun) File() *os.File {
- return tun.fd
+ return tun.tunFile
}
func (tun *nativeTun) routineHackListener() {
/* This is needed for the detection to work across network namespaces
* If you are reading this and know a better method, please get in touch.
*/
- fd := int(tun.fd.Fd())
+ fd := int(tun.fd)
for {
_, err := unix.Write(fd, nil)
switch err {
var ifr [ifReqSize]byte
_, _, errno := unix.Syscall(
unix.SYS_IOCTL,
- tun.fd.Fd(),
+ tun.fd,
uintptr(unix.TUNGETIFF),
uintptr(unsafe.Pointer(&ifr[0])),
)
// write
- return tun.fd.Write(buff)
+ return tun.tunFile.Write(buff)
}
func (tun *nativeTun) doRead(buff []byte, offset int) (int, error) {
return 0, err
default:
if tun.nopi {
- return tun.fd.Read(buff[offset:])
+ return tun.tunFile.Read(buff[offset:])
} else {
buff := buff[offset-4:]
- n, err := tun.fd.Read(buff[:])
+ n, err := tun.tunFile.Read(buff[:])
if n < 4 {
return 0, err
}
} else if tun.events != nil {
close(tun.events)
}
- err2 := tun.fd.Close()
+ err2 := tun.tunFile.Close()
err3 := tun.fdCancel.Cancel()
if err1 != nil {
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{
- fd: file,
+ tunFile: file,
+ fd: file.Fd(),
events: make(chan TUNEvent, 5),
errors: make(chan error, 5),
statusListenersShutdown: make(chan struct{}),
- nopi: false,
+ nopi: false,
}
var err error
- tun.fdCancel, err = rwcancel.NewRWCancel(int(file.Fd()))
+ tun.fdCancel, err = rwcancel.NewRWCancel(int(tun.fd))
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
_, err = tun.Name()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
tun.netlinkSock, err = createNetlinkSocket()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
tun.netlinkCancel, err = rwcancel.NewRWCancel(tun.netlinkSock)
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
type nativeTun struct {
name string
- fd *os.File
+ tunFile *os.File
rwcancel *rwcancel.RWCancel
events chan TUNEvent
errors chan error
func CreateTUNFromFile(file *os.File, mtu int) (TUNDevice, error) {
tun := &nativeTun{
- fd: file,
- events: make(chan TUNEvent, 10),
- errors: make(chan error, 1),
+ tunFile: file,
+ events: make(chan TUNEvent, 10),
+ errors: make(chan error, 1),
}
name, err := tun.Name()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
return iface.Index, nil
}()
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
tun.rwcancel, err = rwcancel.NewRWCancel(int(file.Fd()))
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
if err != nil {
- tun.fd.Close()
+ tun.tunFile.Close()
return nil, err
}
}
func (tun *nativeTun) Name() (string, error) {
- gostat, err := tun.fd.Stat()
+ gostat, err := tun.tunFile.Stat()
if err != nil {
tun.name = ""
return "", err
}
func (tun *nativeTun) File() *os.File {
- return tun.fd
+ return tun.tunFile
}
func (tun *nativeTun) Events() chan TUNEvent {
return 0, err
default:
buff := buff[offset-4:]
- n, err := tun.fd.Read(buff[:])
+ n, err := tun.tunFile.Read(buff[:])
if n < 4 {
return 0, err
}
// write
- return tun.fd.Write(buff)
+ return tun.tunFile.Write(buff)
}
func (tun *nativeTun) Close() error {
var err3 error
err1 := tun.rwcancel.Cancel()
- err2 := tun.fd.Close()
+ err2 := tun.tunFile.Close()
if tun.routeSocket != -1 {
unix.Shutdown(tun.routeSocket, unix.SHUT_RDWR)
err3 = unix.Close(tun.routeSocket)