1
0
mirror of https://github.com/fumiama/water.git synced 2026-06-13 06:50:28 +08:00

fix some io error

This commit is contained in:
fumiama
2021-12-29 23:01:50 +08:00
parent 2e6a6e7c87
commit f6779d7a58

View File

@@ -5,11 +5,14 @@ import (
"errors" "errors"
"fmt" "fmt"
"net" "net"
"os"
"sync" "sync"
"syscall" "syscall"
"unsafe" "unsafe"
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/registry" "golang.org/x/sys/windows/registry"
"golang.zx2c4.com/wintun" "golang.zx2c4.com/wintun"
) )
@@ -293,8 +296,18 @@ func (w *wintunRWC) Close() error {
} }
func (w *wintunRWC) Write(b []byte) (int, error) { func (w *wintunRWC) Write(b []byte) (int, error) {
w.s.SendPacket(b) packet, err := w.s.AllocateSendPacket(len(b))
return len(b), nil switch err {
case nil:
w.s.SendPacket(packet)
return len(b), nil
case windows.ERROR_HANDLE_EOF:
return 0, os.ErrClosed
case windows.ERROR_BUFFER_OVERFLOW:
return 0, nil // Dropping when ring is full.
default:
return 0, err
}
} }
func (w *wintunRWC) Read(b []byte) (int, error) { func (w *wintunRWC) Read(b []byte) (int, error) {
@@ -317,15 +330,17 @@ func (w *wintunRWC) Read(b []byte) (int, error) {
} }
packet, err := w.s.ReceivePacket() packet, err := w.s.ReceivePacket()
if err != nil { switch err {
return n, err case nil:
n += copy(b, packet)
if len(packet) > len(b) {
w.readbuf = make([]byte, len(packet)-len(b))
copy(w.readbuf, packet[len(b):])
}
w.s.ReleaseReceivePacket(packet)
case windows.ERROR_NO_MORE_ITEMS:
return n, nil
} }
n += copy(b, packet)
if len(packet) > len(b) {
w.readbuf = packet[len(b):]
}
return n, err return n, err
} }
@@ -350,6 +365,7 @@ func openDev(config Config) (ifce *Interface, err error) {
} }
s, err := ad.StartSession(0x800000) // Ring capacity, 8 MiB s, err := ad.StartSession(0x800000) // Ring capacity, 8 MiB
if err != nil { if err != nil {
ad.Close()
return return
} }
return &Interface{ReadWriteCloser: &wintunRWC{s: s, ad: ad}, name: config.InterfaceName}, nil return &Interface{ReadWriteCloser: &wintunRWC{s: s, ad: ad}, name: config.InterfaceName}, nil