package ctlcmd import ( "io" "os" "os/exec" "v2ray.com/core/common/buf" "v2ray.com/core/common/platform" ) //go:generate errorgen func Run(args []string, input io.Reader) (buf.MultiBuffer, error) { v2ctl := platform.GetToolLocation("v2ctl") if _, err := os.Stat(v2ctl); err != nil { return nil, newError("v2ctl doesn't exist").Base(err) } errBuffer := buf.MultiBuffer{} outBuffer := buf.MultiBuffer{} cmd := exec.Command(v2ctl, args...) cmd.Stderr = &errBuffer cmd.Stdout = &outBuffer cmd.SysProcAttr = getSysProcAttr() if input != nil { cmd.Stdin = input } if err := cmd.Start(); err != nil { return nil, newError("failed to start v2ctl").Base(err) } if err := cmd.Wait(); err != nil { msg := "failed to execute v2ctl" if errBuffer.Len() > 0 { msg += ": " + errBuffer.String() } buf.ReleaseMulti(errBuffer) buf.ReleaseMulti(outBuffer) return nil, newError(msg).Base(err) } return outBuffer, nil }