ctlcmd.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. var errBuffer buf.MultiBufferContainer
  16. var outBuffer buf.MultiBufferContainer
  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.MultiBuffer.String()
  31. }
  32. return nil, newError(msg).Base(err)
  33. }
  34. if !errBuffer.IsEmpty() {
  35. newError("v2ctl > ", errBuffer.String()).AtInfo().WriteToLog()
  36. }
  37. return outBuffer.MultiBuffer, nil
  38. }