// 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 {
return false, errRejectAuth
}
-func consume(ch <-chan *Terminal) {
- for _ = range ch {
- }
-}
-
func TestClientReject(t *testing.T) {
signer, err := NewRandomSigner(512)
config := MakeAuth(RejectAuth{})
}
defer s.Close()
- go consume(s.ServeTerminal())
+ go s.Serve()
conn, err := ssh.Dial("tcp", s.Addr().String(), NewClientConfig("foo"))
if err == nil {
// 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
}
// 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)
+ }()
+ }
}
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.