From 47e20cf7f4b65e1594553cbc7380d2f46d1b8079 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Thu, 1 Oct 2020 21:33:59 +0800 Subject: [PATCH] conn: add CopyN function --- README.md | 7 ++++++- common/conn/conn.go | 13 +++++++++++++ config.go | 5 +++++ proxy/vless/client.go | 7 ++++--- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f0f1c43..9c2e784 100644 --- a/README.md +++ b/README.md @@ -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 ``` @@ -367,7 +371,8 @@ glider -config CONFIGPATH -listen :8080 -verbose ## Service -Scheme: +#### Scheme: + service=SERVICE_NAME[,SERVICE_CONFIG] - dhcpd(from v0.11.0): diff --git a/common/conn/conn.go b/common/conn/conn.go index ee84a5d..3ce6d4c 100644 --- a/common/conn/conn.go +++ b/common/conn/conn.go @@ -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 diff --git a/config.go b/config.go index 45fda0a..4b1440c 100644 --- a/config.go +++ b/config.go @@ -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") } diff --git a/proxy/vless/client.go b/proxy/vless/client.go index c1488df..7e5760b 100644 --- a/proxy/vless/client.go +++ b/proxy/vless/client.go @@ -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 }