Compare commits

..

No commits in common. "5657c3c1e88d80d4da41e2b592eb961f064b8ddf" and "c644c61a8ed133ba352e64fa6609bb4a30893da0" have entirely different histories.

View file

@ -6,7 +6,6 @@
package tun package tun
import ( import (
"errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net" "net"
@ -131,7 +130,7 @@ func CreateTUN(name string, mtu int) (Device, error) {
} else { } else {
for ifIndex = 0; ifIndex < 256; ifIndex += 1 { for ifIndex = 0; ifIndex < 256; ifIndex += 1 {
tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR, 0) tunfile, err = os.OpenFile(fmt.Sprintf("/dev/tun%d", ifIndex), unix.O_RDWR, 0)
if err == nil || !errors.Is(err, syscall.EBUSY) { if err == nil || !errorIsEBUSY(err) {
break break
} }
} }
@ -165,7 +164,7 @@ func CreateTUN(name string, mtu int) (Device, error) {
uintptr(unsafe.Pointer(&ifheadmode)), uintptr(unsafe.Pointer(&ifheadmode)),
) )
if errno != 0 || ifheadmode == 0 { if errno != 0 || ifheadmode != 1 {
tunfile.Close() tunfile.Close()
return nil, fmt.Errorf("Unable to validate IFHEAD mode: %v (ifheadmode = %d)", errno, ifheadmode) return nil, fmt.Errorf("Unable to validate IFHEAD mode: %v (ifheadmode = %d)", errno, ifheadmode)
} }
@ -250,15 +249,19 @@ func (tun *NativeTun) Read(buff []byte, offset int) (int, error) {
return 0, err return 0, err
default: default:
buff := buff[offset-4:] buff := buff[offset-4:]
// buff := buff[offset:]
n, err := tun.tunFile.Read(buff[:]) n, err := tun.tunFile.Read(buff[:])
if n < 4 { if n < 4 {
return 0, err return 0, err
} }
return n - 4, err return n - 4, err
// return n, err
} }
} }
func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
// reserve space for header // reserve space for header
buff = buff[offset-4:] buff = buff[offset-4:]
@ -286,17 +289,15 @@ func (tun *NativeTun) Flush() error {
} }
func (tun *NativeTun) Close() error { func (tun *NativeTun) Close() error {
var err1, err2 error var err2 error
tun.closeOnce.Do(func () { err1 := tun.tunFile.Close()
err1 = tun.tunFile.Close() if tun.routeSocket != -1 {
if tun.routeSocket != -1 { unix.Shutdown(tun.routeSocket, unix.SHUT_RDWR)
unix.Shutdown(tun.routeSocket, unix.SHUT_RDWR) err2 = unix.Close(tun.routeSocket)
err2 = unix.Close(tun.routeSocket) tun.routeSocket = -1
tun.routeSocket = -1 } else if tun.events != nil {
} else if tun.events != nil { close(tun.events)
close(tun.events) }
}
})
if err1 != nil { if err1 != nil {
return err1 return err1
} }