sshd.SSHListener: Use HandlerFunc instead of terminal channel feed
authorAndrey Petrov <andrey.petrov@shazow.net>
Sun, 17 Jul 2016 20:49:14 +0000 (16:49 -0400)
committerAndrey Petrov <andrey.petrov@shazow.net>
Sun, 17 Jul 2016 20:49:14 +0000 (16:49 -0400)
host.go
sshd/client_test.go
sshd/net.go
sshd/net_test.go

diff --git a/host.go b/host.go
index 5e887f96a9cb6f8f77c3dae2e0b1334b4f14460b..091baf42dc2d41595e5bd712241e0255e30ed3d0 100644 (file)
--- a/host.go
+++ b/host.go
@@ -178,11 +178,8 @@ func (h *Host) Connect(term *sshd.Terminal) {
 
 // Serve our chat room onto the listener
 func (h *Host) Serve() {
-       terminals := h.listener.ServeTerminal()
-
-       for term := range terminals {
-               go h.Connect(term)
-       }
+       h.listener.HandlerFunc = h.Connect
+       h.listener.Serve()
 }
 
 func (h *Host) completeName(partial string) string {
index 651c67ee48ede56ecaf4b22dbe4025013ebbb996..8555221250c084bf1f8b35d815fd1440ec4707c9 100644 (file)
@@ -19,11 +19,6 @@ func (a RejectAuth) Check(net.Addr, ssh.PublicKey) (bool, error) {
        return false, errRejectAuth
 }
 
-func consume(ch <-chan *Terminal) {
-       for _ = range ch {
-       }
-}
-
 func TestClientReject(t *testing.T) {
        signer, err := NewRandomSigner(512)
        config := MakeAuth(RejectAuth{})
@@ -35,7 +30,7 @@ func TestClientReject(t *testing.T) {
        }
        defer s.Close()
 
-       go consume(s.ServeTerminal())
+       go s.Serve()
 
        conn, err := ssh.Dial("tcp", s.Addr().String(), NewClientConfig("foo"))
        if err == nil {
index 6d803a99c0fbddcf3b4499ab2617fbc90870d757..f893a5619e21f0b8aa96b878ccf6cf1665d70f34 100644 (file)
@@ -10,8 +10,10 @@ import (
 // Container for the connection and ssh-related configuration
 type SSHListener struct {
        net.Listener
-       config    *ssh.ServerConfig
-       RateLimit func() rateio.Limiter
+       config *ssh.ServerConfig
+
+       RateLimit   func() rateio.Limiter
+       HandlerFunc func(term *Terminal)
 }
 
 // Make an SSH listener socket
@@ -42,32 +44,24 @@ func (l *SSHListener) handleConn(conn net.Conn) (*Terminal, error) {
 }
 
 // Accept incoming connections as terminal requests and yield them
-func (l *SSHListener) ServeTerminal() <-chan *Terminal {
-       ch := make(chan *Terminal)
+func (l *SSHListener) Serve() {
+       defer l.Close()
+       for {
+               conn, err := l.Accept()
 
-       go func() {
-               for {
-                       conn, err := l.Accept()
+               if err != nil {
+                       logger.Printf("Failed to accept connection: %v", err)
+                       break
+               }
 
+               // Goroutineify to resume accepting sockets early
+               go func() {
+                       term, err := l.handleConn(conn)
                        if err != nil {
-                               logger.Printf("Failed to accept connection: %v", err)
-                               break
+                               logger.Printf("Failed to handshake: %v", err)
+                               return
                        }
-
-                       // Goroutineify to resume accepting sockets early
-                       go func() {
-                               term, err := l.handleConn(conn)
-                               if err != nil {
-                                       logger.Printf("Failed to handshake: %v", err)
-                                       return
-                               }
-                               ch <- term
-                       }()
-               }
-
-               l.Close()
-               close(ch)
-       }()
-
-       return ch
+                       l.HandlerFunc(term)
+               }()
+       }
 }
index c250525e8846d17e1496196b66ff57f90d5a04ea..abbde70081a2a4ca9fe9875d5bb85e73b292c190 100644 (file)
@@ -34,7 +34,11 @@ func TestServeTerminals(t *testing.T) {
                t.Fatal(err)
        }
 
-       terminals := s.ServeTerminal()
+       terminals := make(chan *Terminal)
+       s.HandlerFunc = func(term *Terminal) {
+               terminals <- term
+       }
+       go s.Serve()
 
        go func() {
                // Accept one terminal, read from it, echo back, close.