package main import ( "flag" "io" "log" "net" "os" ) func main() { listen := flag.String("listen", "192.168.1.105:9245", "TCP address to expose") socket := flag.String("socket", os.Getenv("HOME")+"/.config/herdr/herdr.sock", "herdr Unix socket") flag.Parse() ln, err := net.Listen("tcp", *listen) if err != nil { log.Fatal(err) } log.Printf("herdr bridge listening on %s -> unix:%s", *listen, *socket) for { c, err := ln.Accept() if err != nil { log.Printf("accept: %v", err) continue } go proxy(c, *socket) } } func proxy(c net.Conn, socket string) { defer c.Close() u, err := net.Dial("unix", socket) if err != nil { log.Printf("dial herdr: %v", err) return } defer u.Close() done := make(chan struct{}, 2) go func() { _, _ = io.Copy(u, c); _ = u.Close(); done <- struct{}{} }() go func() { _, _ = io.Copy(c, u); _ = c.Close(); done <- struct{}{} }() <-done }