conn: add CopyN function

This commit is contained in:
nadoo 2020-10-01 21:33:59 +08:00
parent c01c2d1839
commit 47e20cf7f4
4 changed files with 28 additions and 4 deletions

View File

@ -306,6 +306,10 @@ Examples:
./glider -verbose -dns=:53 -dnsserver=8.8.8.8:53 -dnsrecord=www.example.com/1.2.3.4
-listen on :53 as dns server, forward dns requests to 8.8.8.8:53, return 1.2.3.4 when resolving www.example.com.
Services:
dhcpd: service=dhcpd,INTERFACE,START_IP,END_IP
e.g.,service=dhcpd,en0,192.168.254.100,192.168.254.199
```
</details>
@ -367,7 +371,8 @@ glider -config CONFIGPATH -listen :8080 -verbose
## Service
Scheme:
#### Scheme:
service=SERVICE_NAME[,SERVICE_CONFIG]
- dhcpd(from v0.11.0):

View File

@ -107,6 +107,19 @@ func Copy(dst io.Writer, src io.Reader) (written int64, err error) {
return CopyBuffer(dst, src)
}
// CopyN copies n bytes (or until an error) from src to dst.
func CopyN(dst io.Writer, src io.Reader, n int64) (written int64, err error) {
written, err = Copy(dst, io.LimitReader(src, n))
if written == n {
return n, nil
}
if written < n && err == nil {
// src stopped early; must have been EOF.
err = io.EOF
}
return
}
// CopyBuffer copies from src to dst with a userspace buffer.
func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
size := TCPBufSize

View File

@ -313,4 +313,9 @@ func usage() {
fmt.Fprintf(w, " "+app+" -verbose -dns=:53 -dnsserver=8.8.8.8:53 -dnsrecord=www.example.com/1.2.3.4\n")
fmt.Fprintf(w, " -listen on :53 as dns server, forward dns requests to 8.8.8.8:53, return 1.2.3.4 when resolving www.example.com.\n")
fmt.Fprintf(w, "\n")
fmt.Fprintf(w, "Services:\n")
fmt.Fprintf(w, " dhcpd: service=dhcpd,INTERFACE,START_IP,END_IP\n")
fmt.Fprintf(w, " e.g.,service=dhcpd,en0,192.168.254.100,192.168.254.199\n")
fmt.Fprintf(w, "\n")
}

View File

@ -9,6 +9,7 @@ import (
"net"
"strings"
"github.com/nadoo/glider/common/conn"
"github.com/nadoo/glider/common/pool"
)
@ -38,7 +39,7 @@ func NewConn(c net.Conn, uuid [16]byte, target string) (*Conn, error) {
buf.WriteByte(Version) // ver
buf.Write(uuid[:]) // uuid
buf.WriteByte(0) // addinfo
buf.WriteByte(0) // addLen
buf.WriteByte(CmdTCP) // cmd
// target
@ -67,8 +68,8 @@ func (c *Conn) Read(b []byte) (n int, err error) {
return n, errors.New("version not supported")
}
if addLen := int64(buf[1]); addLen != 0 {
io.CopyN(ioutil.Discard, c.Conn, addLen)
if addLen := int64(buf[1]); addLen > 0 {
conn.CopyN(ioutil.Discard, c.Conn, addLen)
}
c.rcved = true
}