54 lines
981 B
Go
54 lines
981 B
Go
package utility
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"log"
|
|
"os/exec"
|
|
)
|
|
|
|
func ExecutePipe(outbuffer *bytes.Buffer, stack ...*exec.Cmd) (err error) {
|
|
var errbuffer bytes.Buffer
|
|
pipestack := make([]*io.PipeWriter, len(stack)-1)
|
|
i := 0
|
|
|
|
for ; i < len(stack)-1; i++ {
|
|
stdinpipe, stdoutpipe := io.Pipe()
|
|
stack[i].Stdout = stdoutpipe
|
|
stack[i].Stderr = &errbuffer
|
|
stack[i+1].Stdin = stdinpipe
|
|
pipestack[i] = stdoutpipe
|
|
}
|
|
|
|
stack[i].Stdout = outbuffer
|
|
stack[i].Stderr = &errbuffer
|
|
|
|
if err := callpipe(stack, pipestack); err != nil {
|
|
log.Fatalln(string(errbuffer.Bytes()), err)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func callpipe(stack []*exec.Cmd, pipes []*io.PipeWriter) (err error) {
|
|
if stack[0].Process == nil {
|
|
if err = stack[0].Start(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if len(stack) > 1 {
|
|
if err = stack[1].Start(); err != nil {
|
|
return err
|
|
}
|
|
defer func() {
|
|
if err == nil {
|
|
pipes[0].Close()
|
|
err = callpipe(stack[1:], pipes[1:])
|
|
}
|
|
}()
|
|
}
|
|
|
|
return stack[0].Wait()
|
|
}
|