From: Rémy Oudompheng Date: Fri, 1 Mar 2013 20:04:14 +0000 (-0500) Subject: cmd/cgo: don't reimplement os/exec in util.go. X-Git-Tag: go1.1rc2~733 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=80d2eac14d973e672d8d60780c67283fcc58d933;p=gostls13.git cmd/cgo: don't reimplement os/exec in util.go. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/7450049 --- diff --git a/src/cmd/cgo/util.go b/src/cmd/cgo/util.go index a0f216614b..4e7800d127 100644 --- a/src/cmd/cgo/util.go +++ b/src/cmd/cgo/util.go @@ -5,9 +5,9 @@ package main import ( + "bytes" "fmt" "go/token" - "io/ioutil" "os" "os/exec" ) @@ -16,50 +16,17 @@ import ( // It returns the output to standard output and standard error. // ok indicates whether the command exited successfully. func run(stdin []byte, argv []string) (stdout, stderr []byte, ok bool) { - cmd, err := exec.LookPath(argv[0]) - if err != nil { - fatalf("exec %s: %s", argv[0], err) - } - r0, w0, err := os.Pipe() - if err != nil { - fatalf("%s", err) - } - r1, w1, err := os.Pipe() - if err != nil { - fatalf("%s", err) - } - r2, w2, err := os.Pipe() - if err != nil { - fatalf("%s", err) - } - p, err := os.StartProcess(cmd, argv, &os.ProcAttr{Files: []*os.File{r0, w1, w2}}) - if err != nil { - fatalf("%s", err) - } - r0.Close() - w1.Close() - w2.Close() - c := make(chan bool) - go func() { - w0.Write(stdin) - w0.Close() - c <- true - }() - go func() { - stdout, _ = ioutil.ReadAll(r1) - r1.Close() - c <- true - }() - stderr, _ = ioutil.ReadAll(r2) - r2.Close() - <-c - <-c - - state, err := p.Wait() - if err != nil { + p := exec.Command(argv[0], argv[1:]...) + p.Stdin = bytes.NewReader(stdin) + var bout, berr bytes.Buffer + p.Stdout = &bout + p.Stderr = &berr + err := p.Run() + if _, ok := err.(*exec.ExitError); err != nil && !ok { fatalf("%s", err) } - ok = state.Success() + ok = p.ProcessState.Success() + stdout, stderr = bout.Bytes(), berr.Bytes() return }