func RunExternalDump(cmd, wd string, argv []string, dump io.Writer) (err os.Error) { var p *exec.Cmd p, err = exec.Run(cmd, argv, nil, wd, exec.PassThrough, exec.Pipe, exec.PassThrough) if err != nil { return } if p != nil { src := p.Stdout buffer := make([]byte, 1024) for { n, cpErr := src.Read(buffer) if cpErr != nil { break } _, cpErr = dump.Write(buffer[0:n]) if cpErr != nil { break } } var wmsg *os.Waitmsg wmsg, err = p.Wait(0) if wmsg.ExitStatus() != 0 { err = os.NewError(fmt.Sprintf("%v: %s\n", argv, wmsg.String())) return } if err != nil { return } } return }
func build(gcfile string, opts []string, proFileName string, files []string, envv []string, dir string) (status syscall.WaitStatus, err os.Error) { arg := []string{gcfile, "-o", proFileName} for _, v := range opts { arg = append(arg, v) } for _, v := range files { arg = append(arg, string(v)) } fmt.Println("\t", arg) var cmd *exec.Cmd cmd, err = exec.Run(gcfile, arg[:], envv[:], dir, 0, 1, 2) if err != nil { fmt.Printf("Error, %s", err) return } defer cmd.Close() var wait *os.Waitmsg wait, err = cmd.Wait(0) if err != nil { fmt.Printf("Error, %s", err) return } status = wait.WaitStatus return }
func RunWithEnvAndWd(command string, args []string, env []string, wd string) (proc *exec.Cmd, err os.Error) { //log.Println(command, args) //hho := exec.PassThrough args = prepend(args, command) env = mergeEnv(os.Environ(), env) binpath, err := findCmd(findEnv(env, "PATH"), command) if err != nil { return nil, err } cmd := new(exec.Cmd) cmd.Path = binpath cmd.Args = args cmd.Env = env cmd.Dir = wd cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout err = cmd.Start() if err != nil { log.Print("Error running command ", command, ": ", err, "\n") return nil, err } return cmd, nil }
func RunExternalAndStdout(cmd, wd string, argv []string) (stdout []byte, err os.Error) { argv = SplitArgs(argv) var c *exec.Cmd if len(argv) > 0 { c = exec.Command(cmd, argv...) } else { c = exec.Command(cmd) } c.Dir = wd c.Env = os.Environ() bStdout := bytes.NewBuffer(nil) bStderr := bytes.NewBuffer(nil) c.Stdout = bStdout c.Stderr = bStderr err = c.Run() if wmsg, ok := err.(*os.Waitmsg); ok { if wmsg.ExitStatus() != 0 { err = os.NewError(fmt.Sprintf("command: %s %v\n%s\n", cmd, argv, bStderr.String())) } else { err = nil } } else { stdout = bStdout.Bytes() } return }
func pack(pkfile string, target string, ofile string, envv []string, dir string) (status syscall.WaitStatus, err os.Error) { arg := []string{pkfile, "grc", target, ofile} fmt.Println("\t", arg) var cmd *exec.Cmd cmd, err = exec.Run(pkfile, arg[:], envv[:], dir, 0, 1, 2) if err != nil { fmt.Printf("Error, %s", err) return } defer cmd.Close() var wait *os.Waitmsg wait, err = cmd.Wait(0) if err != nil { fmt.Printf("Error, %s", err) return } status = wait.WaitStatus return }
/* Execute command coming from inch channel */ func execute(inch chan *command) { var c *command var cmd *exec.Cmd var err os.Error var argv0, dir string var argv []string for { c = <-inch dir = os.Getenv("PWD") switch c.cmdtype { case BUILTIN: cb := BUILTIN_COMMANDS[c.name] LAST_RETURN_VALUE = cb(c.args) case EXTERNAL: if argv0, err = exec.LookPath(c.name); err != nil { goto Error } if len(c.args) > 0 { argv = c.args } envv := os.Environ() cmd, err = exec.Run(argv0, argv, envv, dir, exec.PassThrough, exec.PassThrough, exec.PassThrough) err = cmd.Close() //TODO update LAST_RETURN_VALUE Error: if err != nil { error(err.String()) } } inch <- nil //release blockage in main loop() } }
func link(glfile string, opts []string, target string, ofile string, envv []string, dir string) (status syscall.WaitStatus, err os.Error) { arg := []string{glfile, "-o", target} for _, v := range opts { arg = append(arg, v) } arg = append(arg, ofile) fmt.Println("\t", arg) var cmd *exec.Cmd cmd, err = exec.Run(glfile, arg[:], envv[:], dir, 0, 1, 2) if err != nil { fmt.Printf("Error, %s", err) return } defer cmd.Close() var wait *os.Waitmsg wait, err = cmd.Wait(0) if err != nil { fmt.Printf("Error, %s", err) return } status = wait.WaitStatus return }
// run runs the command argv, resolving argv[0] if necessary by searching $PATH. // It provides input on standard input to the command. func run(argv []string, input []byte) (out string, err os.Error) { if len(argv) < 1 { err = os.EINVAL goto Error } prog, ok := lookPathCache[argv[0]] if !ok { prog, err = exec.LookPath(argv[0]) if err != nil { goto Error } lookPathCache[argv[0]] = prog } // fmt.Fprintf(os.Stderr, "%v\n", argv); var cmd *exec.Cmd if len(input) == 0 { cmd, err = exec.Run(prog, argv, os.Environ(), "", exec.DevNull, exec.Pipe, exec.MergeWithStdout) if err != nil { goto Error } } else { cmd, err = exec.Run(prog, argv, os.Environ(), "", exec.Pipe, exec.Pipe, exec.MergeWithStdout) if err != nil { goto Error } go func() { cmd.Stdin.Write(input) cmd.Stdin.Close() }() } defer cmd.Close() var buf bytes.Buffer _, err = io.Copy(&buf, cmd.Stdout) out = buf.String() if err != nil { cmd.Wait(0) goto Error } w, err := cmd.Wait(0) if err != nil { goto Error } if !w.Exited() || w.ExitStatus() != 0 { err = w goto Error } return Error: err = &runError{copy(argv), err} return }
func StdExecve(argv []string, stopOnTrouble bool) bool { var err os.Error var cmd *exec.Cmd switch len(argv) { case 0: if stopOnTrouble { log.Fatalf("[ERROR] len(argv) == 0\n") } return false case 1: cmd = exec.Command(argv[0]) default: cmd = exec.Command(argv[0], argv[1:]...) } // pass-through cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin err = cmd.Start() if err != nil { if stopOnTrouble { log.Fatalf("[ERROR] %s\n", err) } else { log.Printf("[ERROR] %s\n", err) return false } } err = cmd.Wait() if err != nil { if stopOnTrouble { log.Fatalf("[ERROR] %s\n", err) } else { log.Printf("[ERROR] %s\n", err) return false } } return true }
func run(argv []string, stdin, stdout, stderr int) (out string, err os.Error) { if len(argv) < 1 { err = os.EINVAL goto Error } var cmd *exec.Cmd cmd, err = exec.Run(argv[0], argv, os.Environ(), "", stdin, stdout, stderr) if err != nil { goto Error } defer cmd.Close() var buf bytes.Buffer _, err = io.Copy(&buf, cmd.Stdout) out = buf.String() if err != nil { cmd.Wait(0) goto Error } w, err := cmd.Wait(0) if err != nil { goto Error } if !w.Exited() || w.ExitStatus() != 0 { err = w goto Error } return Error: err = &runError{copy(argv), err} return }
func ProcessRequest(request DownloadRequest) { var tempFile string = MakeTempFileName(request.url, ".flv") var tempFileSansExtension string { pathDotIndex := strings.LastIndex(tempFile, ".") tempFileSansExtension = tempFile[0:pathDotIndex] } var cmd *exec.Cmd = MakeCommand(&request, tempFile) if cmd == nil { request.WriteError("forming the download command", nil) return } var proc *StdoutProcessor if pipe, e := cmd.StdoutPipe(); e != nil { request.WriteError("setting youtube-dl pipe", e) return } else { proc = NewStdoutProcessor(&pipe) } if e := cmd.Start(); e != nil { request.WriteError("running youtube-dl", e) return } var state DownloadState = kStarting var data map[string]interface{} var e os.Error for { status, e := proc.ParseOneStatusMessage() if e != nil { if state < kExtractingAudio { request.WriteError("downloading the video", e) return } else { break } } else if status == nil { continue } if status.state != kDownloadingVideo && (status.state == 0 || status.state == state) { continue } fmt.Printf("Proc SM: %v\n", status) if status.state >= kDownloadingVideo && state != status.state { if data, e = ReadJson(tempFile + ".info.json"); e != nil { request.WriteError("reading video JSON", e) return } status.title = data["title"].(string) } state = status.state status.requestId = request.id request.statusChannel <- *status } var finalFileBaseName = data["title"].(string) + "." + *outputFormat var finalFile = request.basePath + "/" + finalFileBaseName if _, e := CopyFile(finalFile, tempFileSansExtension+"."+*outputFormat); e != nil { request.WriteError("tagging", e) return } request.statusChannel <- StatusMessage{request.id, kTagging, "", "", 0, 0, 0, nil, ""} var c = exec.Command("lltag", "--yes", "-G", "--rename=%a/%t", finalFileBaseName) c.Dir = request.basePath out, ioError := c.StdoutPipe() if ioError != nil { request.WriteError("starting the tagger", ioError) return } var in io.WriteCloser in, ioError = c.StdinPipe() if ioError != nil { request.WriteError("starting the tagger", ioError) return } var link string if e = c.Start(); e != nil { request.WriteError("tagging", e) return } else { in.Write([]byte(strings.Repeat("y\n", 20))) outData, e := ioutil.ReadAll(out) if e != nil { request.WriteError("reading the tagger output", e) return } match := regexp.MustCompile("New filename is '([^\n]*)'\n").FindStringSubmatch(string(outData)) fmt.Printf("out data: %s\n\nmatch: %v\n", string(outData), match) if match == nil { request.WriteError("finding the output file", os.NewError("fail")) return } link = "/files/" + match[1] } fmt.Printf("Link: %s\n", link) request.statusChannel <- StatusMessage{request.id, kComplete, link, "", 0, 0, 0, nil, ""} }
/* Set up a command to use os standard in/out/err */ func set_exec(c *exec.Cmd) { c.Stdout = os.Stdout c.Stdin = os.Stdin c.Stderr = os.Stderr }