}
}
- cl.conns, err = listenAll(cl.enabledPeerNetworks(), cl.config.ListenHost, cl.config.ListenPort, cl.config.ProxyURL)
+ cl.conns, err = listenAll(cl.enabledPeerNetworks(), cl.config.ListenHost, cl.config.ListenPort, cl.config.ProxyURL, cl.firewallCallback)
if err != nil {
return
}
return
}
+func (cl *Client) firewallCallback(net.Addr) bool {
+ cl.rLock()
+ block := !cl.wantConns()
+ cl.rUnlock()
+ if block {
+ torrent.Add("connections firewalled", 1)
+ } else {
+ torrent.Add("connections not firewalled", 1)
+ }
+ return block
+}
+
func (cl *Client) enabledPeerNetworks() (ns []string) {
for _, n := range allPeerNetworks {
if peerNetworkEnabled(n, cl.config) {
return blocked
}
+func (cl *Client) wantConns() bool {
+ for _, t := range cl.torrents {
+ if t.wantConns() {
+ return true
+ }
+ }
+ return false
+}
+
func (cl *Client) waitAccept() {
for {
- for _, t := range cl.torrents {
- if t.wantConns() {
- return
- }
- }
if cl.closed.IsSet() {
return
}
+ if cl.wantConns() {
+ return
+ }
cl.event.Wait()
}
}
return proxy.FromURL(fixedURL, proxy.Direct)
}
-func listen(network, addr, proxyURL string) (socket, error) {
+func listen(network, addr, proxyURL string, f firewallCallback) (socket, error) {
if isTcpNetwork(network) {
return listenTcp(network, addr, proxyURL)
} else if isUtpNetwork(network) {
- return listenUtp(network, addr, proxyURL)
+ return listenUtp(network, addr, proxyURL, f)
} else {
panic(fmt.Sprintf("unknown network %q", network))
}
return net.JoinHostPort(host, strconv.FormatInt(int64(port), 10))
}
-func listenAll(networks []string, getHost func(string) string, port int, proxyURL string) ([]socket, error) {
+func listenAll(networks []string, getHost func(string) string, port int, proxyURL string, f firewallCallback) ([]socket, error) {
if len(networks) == 0 {
return nil, nil
}
nahs = append(nahs, networkAndHost{n, getHost(n)})
}
for {
- ss, retry, err := listenAllRetry(nahs, port, proxyURL)
+ ss, retry, err := listenAllRetry(nahs, port, proxyURL, f)
if !retry {
return ss, err
}
Host string
}
-func listenAllRetry(nahs []networkAndHost, port int, proxyURL string) (ss []socket, retry bool, err error) {
+func listenAllRetry(nahs []networkAndHost, port int, proxyURL string, f firewallCallback) (ss []socket, retry bool, err error) {
ss = make([]socket, 1, len(nahs))
portStr := strconv.FormatInt(int64(port), 10)
- ss[0], err = listen(nahs[0].Network, net.JoinHostPort(nahs[0].Host, portStr), proxyURL)
+ ss[0], err = listen(nahs[0].Network, net.JoinHostPort(nahs[0].Host, portStr), proxyURL, f)
if err != nil {
return nil, false, fmt.Errorf("first listen: %s", err)
}
}()
portStr = strconv.FormatInt(int64(missinggo.AddrPort(ss[0].Addr())), 10)
for _, nah := range nahs[1:] {
- s, err := listen(nah.Network, net.JoinHostPort(nah.Host, portStr), proxyURL)
+ s, err := listen(nah.Network, net.JoinHostPort(nah.Host, portStr), proxyURL, f)
if err != nil {
return ss,
missinggo.IsAddrInUse(err) && port == 0,
return
}
-func listenUtp(network, addr, proxyURL string) (s socket, err error) {
- us, err := NewUtpSocket(network, addr)
+type firewallCallback func(net.Addr) bool
+
+func listenUtp(network, addr, proxyURL string, fc firewallCallback) (s socket, err error) {
+ us, err := NewUtpSocket(network, addr, fc)
if err != nil {
return
}