package pipe import ( "io" "net" "github.com/lxc/lxd/shared/eagain" "github.com/sirupsen/logrus" ) func UnixPiper(srcs <-chan net.Conn, bindAddress string) { for src := range srcs { go Unix(src, bindAddress) } } func Unix(src net.Conn, target string) error { dst, err := net.Dial("unix", target) if err != nil { src.Close() return err } Connect(src, dst) return nil } func Connect(src net.Conn, dst net.Conn) { go func() { _, err := io.Copy(eagain.Writer{Writer: dst}, eagain.Reader{Reader: src}) if err != nil && err != io.EOF { logrus.Warnf("copy pipe src->dst closed: %v", err) } src.Close() dst.Close() }() go func() { _, err := io.Copy(eagain.Writer{Writer: src}, eagain.Reader{Reader: dst}) if err != nil { logrus.Warnf("copy pipe dst->src closed: %v", err) } src.Close() dst.Close() }() }