-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
58 lines (56 loc) · 1.13 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package main
import (
"fmt"
"os"
"os/exec"
"runtime"
"syscall"
)
func main() {
if len(os.Args) == 1 {
fmt.Fprintln(os.Stderr, "mispipe: Wrong number of args, aborting")
os.Exit(1)
}
cmds := make([]*exec.Cmd, len(os.Args)-1)
for i, arg := range os.Args[1:] {
args := []string{"/bin/sh", "-c"}
if runtime.GOOS == "windows" {
args = []string{"cmd", "/c"}
}
args = append(args, arg)
cmds[i] = exec.Command(args[0], args[1:]...)
if i > 0 {
rc, err := cmds[i-1].StdoutPipe()
if err != nil {
fmt.Fprintf(os.Stderr, "%s: %s: %s\n", os.Args[0], arg, err)
os.Exit(1)
}
cmds[i].Stdin = rc
}
}
cmds[0].Stdin = os.Stdin
cmds[len(cmds)-1].Stdout = os.Stdout
for _, c := range cmds {
err := c.Start()
if err != nil {
fmt.Fprintf(os.Stderr, "%s: %s\n", os.Args[0], err)
os.Exit(1)
}
}
for _, c := range cmds {
err := c.Wait()
if err != nil {
fmt.Fprintf(os.Stderr, "%s: %s\n", os.Args[0], err)
}
}
status := 0
state := cmds[0].ProcessState
if state != nil {
if ws, ok := state.Sys().(syscall.WaitStatus); ok {
if ws.Exited() {
status = ws.ExitStatus()
}
}
}
os.Exit(status)
}