I was about to add a third copy, so unify them now instead. Change-Id: I3b93896aa1249b1250a6b1df4829d57717f2311a Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>main
parent
5d9ab502f3
commit
8fe503057d
@ -0,0 +1,50 @@ |
||||
// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package netutil contains misc shared networking code & types.
|
||||
package netutil |
||||
|
||||
import ( |
||||
"io" |
||||
"net" |
||||
) |
||||
|
||||
// NewOneConnListener returns a net.Listener that returns c on its first
|
||||
// Accept and EOF thereafter. The Listener's Addr is a dummy address.
|
||||
func NewOneConnListener(c net.Conn) net.Listener { |
||||
return NewOneConnListenerFrom(c, dummyListener{}) |
||||
} |
||||
|
||||
// NewOneConnListenerFrom returns a net.Listener wrapping ln where
|
||||
// its Accept returns c on the first call and io.EOF thereafter.
|
||||
func NewOneConnListenerFrom(c net.Conn, ln net.Listener) net.Listener { |
||||
return &oneConnListener{c, ln} |
||||
} |
||||
|
||||
type oneConnListener struct { |
||||
conn net.Conn |
||||
net.Listener |
||||
} |
||||
|
||||
func (l *oneConnListener) Accept() (c net.Conn, err error) { |
||||
c = l.conn |
||||
if c == nil { |
||||
err = io.EOF |
||||
return |
||||
} |
||||
err = nil |
||||
l.conn = nil |
||||
return |
||||
} |
||||
|
||||
type dummyListener struct{} |
||||
|
||||
func (dummyListener) Close() error { return nil } |
||||
func (dummyListener) Addr() net.Addr { return dummyAddr("unused-address") } |
||||
func (dummyListener) Accept() (c net.Conn, err error) { return nil, io.EOF } |
||||
|
||||
type dummyAddr string |
||||
|
||||
func (a dummyAddr) Network() string { return string(a) } |
||||
func (a dummyAddr) String() string { return string(a) } |
||||
Loading…
Reference in new issue