ctlcmd.go 933 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package ctlcmd
  2. import (
  3. "io"
  4. "os"
  5. "os/exec"
  6. "v2ray.com/core/common/buf"
  7. "v2ray.com/core/common/platform"
  8. )
  9. //go:generate errorgen
  10. func Run(args []string, input io.Reader) (buf.MultiBuffer, error) {
  11. v2ctl := platform.GetToolLocation("v2ctl")
  12. if _, err := os.Stat(v2ctl); err != nil {
  13. return nil, newError("v2ctl doesn't exist").Base(err)
  14. }
  15. errBuffer := buf.MultiBuffer{}
  16. outBuffer := buf.MultiBuffer{}
  17. cmd := exec.Command(v2ctl, args...)
  18. cmd.Stderr = &errBuffer
  19. cmd.Stdout = &outBuffer
  20. cmd.SysProcAttr = getSysProcAttr()
  21. if input != nil {
  22. cmd.Stdin = input
  23. }
  24. if err := cmd.Start(); err != nil {
  25. return nil, newError("failed to start v2ctl").Base(err)
  26. }
  27. if err := cmd.Wait(); err != nil {
  28. msg := "failed to execute v2ctl"
  29. if errBuffer.Len() > 0 {
  30. msg += ": " + errBuffer.String()
  31. }
  32. errBuffer.Release()
  33. outBuffer.Release()
  34. return nil, newError(msg).Base(err)
  35. }
  36. return outBuffer, nil
  37. }