X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcypherpunks.ru%2Fgovpn%2Ftap.go;h=dd3c7e9dd678606997c88ec2991430988aff9f1f;hb=ff2ecfd11acbf58a2e1a5885ef6859f811ff2c77;hp=efb53a3e591c95dacf1f90057a9d065a63292ac4;hpb=e7696b430e885f94c81abf3a635982aca23af2c2;p=govpn.git diff --git a/src/cypherpunks.ru/govpn/tap.go b/src/cypherpunks.ru/govpn/tap.go index efb53a3..dd3c7e9 100644 --- a/src/cypherpunks.ru/govpn/tap.go +++ b/src/cypherpunks.ru/govpn/tap.go @@ -36,6 +36,7 @@ type TAP struct { Name string Sink chan []byte dev io.ReadWriteCloser + closed bool } var ( @@ -70,6 +71,9 @@ func NewTAP(ifaceName string, mtu int) (*TAP, error) { bufZ = !bufZ n, err = tap.dev.Read(buf) if err != nil { + if tap.closed { + return + } logger.WithError(err).WithFields(logrus.Fields{ "func": logFuncPrefix + "TAP read sink loop", "name": tap.Name, @@ -93,8 +97,15 @@ func (t *TAP) Write(data []byte) (int, error) { // Close close TAP/TUN virtual network interface func (t *TAP) Close() error { - // TODO add chan to stop read loop - return t.dev.Close() + if t.closed { + return nil + } + err := t.dev.Close() + if err != nil { + return errors.Wrap(err, "water.Interface.Close") + } + t.closed = true + return nil } // TAPListen opens an existing TAP (creates if none exists)