func main() { flag.Parse() if *fKeyFile == "" { flag.Usage() return } // Read key file. key, err := ioutil.ReadFile(*fKeyFile) if err != nil { log.Fatalf("key file: %s", err) } // Dial. conn, err := spipe.Dial(key, "tcp", *fAddr) if err != nil { log.Fatalf("Dial: %s", err) } defer conn.Close() errc := make(chan error, 1) go func() { _, err := io.Copy(conn, os.Stdin) errc <- err }() go func() { _, err := io.Copy(os.Stdout, conn) errc <- err }() <-errc conn.Close() }
func main() { flag.Parse() if *fKeyFile == "" { flag.Usage() return } // Read key file. key, err := ioutil.ReadFile(*fKeyFile) if err != nil { log.Fatalf("key file: %s", err) } s, _ := net.Listen("tcp", *sAddr) for { c, _ := s.Accept() // Dial. conn, err := spipe.Dial(key, "tcp", *fAddr) if err != nil { log.Fatalf("Dial: %s", err) } defer conn.Close() errc := make(chan error, 1) go func() { _, err := io.Copy(conn, c) errc <- err }() go func() { _, err := io.Copy(c, conn) errc <- err }() <-errc conn.Close() } }
func NewTCPConn(key []byte, peer string) (conn net.Conn, err error) { sconn, err := spipe.Dial(key, "tcp", peer) if err != nil { return } return newBufferedSpipeConn(sconn), nil }
func (pipe *spipeData) Run() { if pipe.Type == "enc" { s, _ := net.Listen("tcp", ":"+pipe.LocalPort) for { c, _ := s.Accept() t, _ := spipe.Dial(pipe.key, "tcp", pipe.TargetDest) go pipe.handleCopy(c, t) } } else { s, _ := spipe.Listen(pipe.key, "tcp", ":"+pipe.LocalPort) for { c, _ := s.Accept() t, _ := net.Dial("tcp", pipe.TargetDest) go pipe.handleCopy(c, t) } } }
func forward(local io.ReadWriteCloser) { defer local.Close() var err error var remote io.ReadWriteCloser if secure { remote, err = spipe.Dial(key, "tcp", *tcs) } else { remote, err = net.Dial("tcp", *tcs) } if err != nil { log.Printf("failed to dial tcs %q: %v", *tcs, err) return } defer remote.Close() _, err = remote.Write(header) if err != nil { log.Printf("failed to write header: %v", err) return } var dumpOutWriter io.WriteCloser if len(*dumpOut) != 0 { dumpOutWriter, err = os.OpenFile(*dumpOut, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777) if err != nil { log.Printf("failed to open dump out file %q: %v", *dumpOut, err) return } defer dumpOutWriter.Close() } var dumpInWriter io.WriteCloser if len(*dumpIn) != 0 { dumpInWriter, err = os.OpenFile(*dumpIn, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777) if err != nil { log.Printf("failed to open dump in file %q: %v", *dumpIn, err) return } defer dumpInWriter.Close() } wg := &sync.WaitGroup{} wg.Add(2) go func() { if dumpInWriter != nil { io.Copy(local, io.TeeReader(remote, dumpInWriter)) } else { io.Copy(local, remote) } wg.Done() local.Close() }() go func() { if dumpOutWriter != nil { io.Copy(remote, io.TeeReader(local, dumpOutWriter)) } else { io.Copy(remote, local) } wg.Done() remote.Close() }() wg.Wait() }