a41f938cec
As we have seen, dependencies version can prevent the build. We should user lock versions on dependencies that we know work: * Packages are vendored * Add Godep support * Added addtional install step in readme * Fix travis build error
81 lignes
1,5 Kio
Go
81 lignes
1,5 Kio
Go
package i2p
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
type i2pListener struct {
|
|
// parent session
|
|
session Session
|
|
// local address
|
|
laddr I2PAddr
|
|
}
|
|
|
|
// implements net.Listener
|
|
func (l *i2pListener) Addr() net.Addr {
|
|
return l.laddr
|
|
}
|
|
|
|
// implements net.Listener
|
|
func (l *i2pListener) Close() error {
|
|
l.session = nil
|
|
return nil
|
|
}
|
|
|
|
// implements net.Listener
|
|
func (l *i2pListener) Accept() (c net.Conn, err error) {
|
|
if l.session == nil {
|
|
err = errors.New("session closed")
|
|
return
|
|
}
|
|
var nc net.Conn
|
|
nc, err = l.session.OpenControlSocket()
|
|
if err == nil {
|
|
_, err = fmt.Fprintf(nc, "STREAM ACCEPT ID=%s SILENT=false\n", l.session.Name())
|
|
if err == nil {
|
|
r := bufio.NewReader(nc)
|
|
var line string
|
|
// read response line
|
|
line, err = r.ReadString(10)
|
|
if err == nil {
|
|
sc := bufio.NewScanner(strings.NewReader(line))
|
|
sc.Split(bufio.ScanWords)
|
|
for sc.Scan() {
|
|
text := sc.Text()
|
|
upper := strings.ToUpper(text)
|
|
if upper == "STREAM" {
|
|
continue
|
|
}
|
|
if upper == "RESULT" {
|
|
continue
|
|
}
|
|
if upper == "RESULT=OK" {
|
|
// we good
|
|
break
|
|
}
|
|
// error
|
|
err = errors.New(text)
|
|
}
|
|
}
|
|
// read address line
|
|
line, err = r.ReadString(10)
|
|
if err == nil {
|
|
// we got a new connection yeeeeh
|
|
c = &I2PConn{
|
|
c: nc,
|
|
laddr: l.laddr,
|
|
raddr: I2PAddr(line[:len(line)-1]),
|
|
}
|
|
}
|
|
}
|
|
if c == nil {
|
|
// we didn't get a connection
|
|
nc.Close()
|
|
}
|
|
}
|
|
return
|
|
}
|