X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=cmd%2Ftlss%2Fmain.go;h=881d2210990b85d1d745b5b6ac0f0c78e749c2fd;hb=72fc7e6d14a5113b013514eecd3c5b3485671631;hp=c0f7a09f443da23151236219e1ed39da006d3f80;hpb=c39958cb57c7a598f668a15a3d793a2ab708b193;p=ucspi.git diff --git a/cmd/tlss/main.go b/cmd/tlss/main.go index c0f7a09..881d221 100644 --- a/cmd/tlss/main.go +++ b/cmd/tlss/main.go @@ -22,6 +22,7 @@ import ( "crypto/x509" "flag" "fmt" + "io" "log" "os" "os/exec" @@ -53,7 +54,7 @@ func main() { } var cas *x509.CertPool if *casPath != "" { - cas, err = ucspi.CertPoolFromFile(*casPath) + _, cas, err = ucspi.CertPoolFromFile(*casPath) if err != nil { log.Fatalln(err) } @@ -70,7 +71,7 @@ func main() { cfg.ClientAuth = tls.RequireAndVerifyClientCert } - conn := &ucspi.Conn{R: os.Stdin, W: os.Stdout} + conn, _ := ucspi.NewConn(os.Stdin, os.Stdout) tlsConn := tls.Server(conn, cfg) if err = tlsConn.Handshake(); err != nil { log.Fatalln(err) @@ -80,10 +81,18 @@ func main() { dn = tlsConn.ConnectionState().PeerCertificates[0].Subject.String() } + rr, rw, err := os.Pipe() + if err != nil { + log.Fatalln(err) + } + wr, ww, err := os.Pipe() + if err != nil { + log.Fatalln(err) + } args := flag.Args() cmd := exec.Command(args[0], args[1:]...) - cmd.Stdin = tlsConn - cmd.Stdout = tlsConn + cmd.Stdin = rr + cmd.Stdout = ww cmd.Stderr = os.Stderr cmd.Env = append(os.Environ(), "PROTO=TLS") if dn != "" { @@ -93,7 +102,19 @@ func main() { if err = cmd.Start(); err != nil { log.Fatalln(err) } - if _, err = cmd.Process.Wait(); err != nil { + worker := make(chan struct{}) + go func() { + io.Copy(rw, tlsConn) + }() + go func() { + io.Copy(tlsConn, wr) + tlsConn.Close() + close(worker) + }() + err = cmd.Wait() + ww.Close() + <-worker + if err != nil { log.Fatalln(err) } }