|
|
@@ -16,6 +16,7 @@ import (
|
|
|
"github.com/syncthing/syncthing/lib/dialer"
|
|
|
"github.com/syncthing/syncthing/lib/nat"
|
|
|
"github.com/syncthing/syncthing/lib/relay/client"
|
|
|
+ "github.com/syncthing/syncthing/lib/util"
|
|
|
)
|
|
|
|
|
|
func init() {
|
|
|
@@ -26,6 +27,7 @@ func init() {
|
|
|
}
|
|
|
|
|
|
type relayListener struct {
|
|
|
+ util.ServiceWithError
|
|
|
onAddressesChangedNotifier
|
|
|
|
|
|
uri *url.URL
|
|
|
@@ -34,30 +36,22 @@ type relayListener struct {
|
|
|
conns chan internalConn
|
|
|
factory listenerFactory
|
|
|
|
|
|
- err error
|
|
|
client client.RelayClient
|
|
|
mut sync.RWMutex
|
|
|
}
|
|
|
|
|
|
-func (t *relayListener) Serve() {
|
|
|
- t.mut.Lock()
|
|
|
- t.err = nil
|
|
|
- t.mut.Unlock()
|
|
|
-
|
|
|
+func (t *relayListener) serve(stop chan struct{}) error {
|
|
|
clnt, err := client.NewClient(t.uri, t.tlsCfg.Certificates, nil, 10*time.Second)
|
|
|
- invitations := clnt.Invitations()
|
|
|
if err != nil {
|
|
|
- t.mut.Lock()
|
|
|
- t.err = err
|
|
|
- t.mut.Unlock()
|
|
|
- l.Warnln("Listen (BEP/relay):", err)
|
|
|
- return
|
|
|
+ l.Infoln("Listen (BEP/relay):", err)
|
|
|
+ return err
|
|
|
}
|
|
|
-
|
|
|
- go clnt.Serve()
|
|
|
+ invitations := clnt.Invitations()
|
|
|
|
|
|
t.mut.Lock()
|
|
|
t.client = clnt
|
|
|
+ go clnt.Serve()
|
|
|
+ defer clnt.Stop()
|
|
|
t.mut.Unlock()
|
|
|
|
|
|
oldURI := clnt.URI()
|
|
|
@@ -69,7 +63,10 @@ func (t *relayListener) Serve() {
|
|
|
select {
|
|
|
case inv, ok := <-invitations:
|
|
|
if !ok {
|
|
|
- return
|
|
|
+ if err := clnt.Error(); err != nil {
|
|
|
+ l.Infoln("Listen (BEP/relay):", err)
|
|
|
+ }
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
conn, err := client.JoinSession(inv)
|
|
|
@@ -114,16 +111,11 @@ func (t *relayListener) Serve() {
|
|
|
oldURI = currentURI
|
|
|
t.notifyAddressesChanged(t)
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-func (t *relayListener) Stop() {
|
|
|
- t.mut.RLock()
|
|
|
- if t.client != nil {
|
|
|
- t.client.Stop()
|
|
|
+ case <-stop:
|
|
|
+ return nil
|
|
|
+ }
|
|
|
}
|
|
|
- t.mut.RUnlock()
|
|
|
}
|
|
|
|
|
|
func (t *relayListener) URI() *url.URL {
|
|
|
@@ -152,18 +144,16 @@ func (t *relayListener) LANAddresses() []*url.URL {
|
|
|
}
|
|
|
|
|
|
func (t *relayListener) Error() error {
|
|
|
- t.mut.RLock()
|
|
|
- err := t.err
|
|
|
- var cerr error
|
|
|
- if t.client != nil {
|
|
|
- cerr = t.client.Error()
|
|
|
- }
|
|
|
- t.mut.RUnlock()
|
|
|
-
|
|
|
+ err := t.ServiceWithError.Error()
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- return cerr
|
|
|
+ t.mut.RLock()
|
|
|
+ defer t.mut.RUnlock()
|
|
|
+ if t.client != nil {
|
|
|
+ return t.client.Error()
|
|
|
+ }
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func (t *relayListener) Factory() listenerFactory {
|
|
|
@@ -181,13 +171,15 @@ func (t *relayListener) NATType() string {
|
|
|
type relayListenerFactory struct{}
|
|
|
|
|
|
func (f *relayListenerFactory) New(uri *url.URL, cfg config.Wrapper, tlsCfg *tls.Config, conns chan internalConn, natService *nat.Service) genericListener {
|
|
|
- return &relayListener{
|
|
|
+ t := &relayListener{
|
|
|
uri: uri,
|
|
|
cfg: cfg,
|
|
|
tlsCfg: tlsCfg,
|
|
|
conns: conns,
|
|
|
factory: f,
|
|
|
}
|
|
|
+ t.ServiceWithError = util.AsServiceWithError(t.serve)
|
|
|
+ return t
|
|
|
}
|
|
|
|
|
|
func (relayListenerFactory) Valid(cfg config.Configuration) error {
|