diff options
| author | Jeff Carr <[email protected]> | 2024-03-09 17:46:36 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2024-03-09 17:46:36 -0600 |
| commit | fe94c0057bd0c44317f22afeb0fe8432e0b18c64 (patch) | |
| tree | 7d9041456dc538ce592981344403cda7197d3441 /run.go | |
| parent | f163738c86b84d8b6ddf12326d835de0191834bd (diff) | |
remove some of the wierder code
Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'run.go')
| -rw-r--r-- | run.go | 169 |
1 files changed, 4 insertions, 165 deletions
@@ -1,18 +1,11 @@ package shell import ( - "bufio" - "bytes" "errors" - "fmt" - "io" "os" "os/exec" "strings" "syscall" - "time" - - "github.com/svent/go-nbreader" "go.wit.com/log" ) @@ -60,11 +53,11 @@ func Run(args []string) bool { var ErrorArgvEmpty error = errors.New("command was empty") type RunResult struct { - ok bool - argv []string - path string + ok bool + argv []string + path string output []byte - err error + err error outerr error } @@ -113,160 +106,6 @@ func RunPath(path string, args []string) *RunResult { return r } -func (cmd *OldShell) Run(cmdline string) string { - cmd.InitProcess(cmdline) - if cmd.Error != nil { - return "" - } - cmd.Exec(cmdline) - return Chomp(cmd.Buffer) -} - -func (cmd *OldShell) InitProcess(cmdline string) { - log.Log(RUN, "shell.InitProcess() START "+cmdline) - - cmd.Cmdline = Chomp(cmdline) // this is like 'chomp' in perl - cmdArgs := strings.Fields(cmd.Cmdline) - if len(cmdArgs) == 0 { - cmd.Error = fmt.Errorf("cmdline == ''") - cmd.Done = true - return - } - if cmdArgs[0] == "cd" { - if len(cmdArgs) > 1 { - log.Log(RUN, "os.Chdir()", cmd) - os.Chdir(cmdArgs[1]) - } - handleError(nil, 0) - cmd.Done = true - return - } - - cmd.Process = exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) -} - -func (cmd *OldShell) FileCreate(out string) { - var newfile File - - var iof io.ReadCloser - if out == "STDOUT" { - iof, _ = cmd.Process.StdoutPipe() - } else { - iof, _ = cmd.Process.StderrPipe() - } - - newfile.Fio = iof - newfile.Fbufio = bufio.NewReader(iof) - newfile.Fnbreader = nbreader.NewNBReader(newfile.Fbufio, 1024) - - if out == "STDOUT" { - cmd.STDOUT = &newfile - } else { - cmd.STDERR = &newfile - } -} - -// NOTE: this might cause problems: -// always remove the newlines at the end ? -func (cmd *OldShell) Exec(cmdline string) { - log.Log(RUN, "shell.Run() START "+cmdline) - - cmd.InitProcess(cmdline) - if cmd.Error != nil { - return - } - - cmd.FileCreate("STDOUT") - cmd.FileCreate("STDERR") - - cmd.Process.Start() - - // TODO; 'goroutine' both of these - // and make your own wait that will make sure - // the process is then done and run process.Wait() - go cmd.Capture(cmd.STDERR) - cmd.Capture(cmd.STDOUT) - - // wait until the process exists - // https://golang.org/pkg/os/exec/#Cmd.Wait - // What should happen here, before calling Wait() - // is checks to make sure the READERS() on STDOUT and STDERR are done - err := cmd.Process.Wait() - - // time.Sleep(2 * time.Second) // putting this here doesn't help STDOUT flush() - - if err != nil { - cmd.Fail = true - cmd.Error = err - log.Log(RUN, "process.Wait() END err =", err.Error()) - } else { - log.Log(RUN, "process.Wait() END") - } - return -} - -// nonblocking read until file errors -func (cmd *OldShell) Capture(f *File) { - log.Log(RUN, "nbrREADER() START") - - if cmd.Buffer == nil { - cmd.Buffer = new(bytes.Buffer) - } - if cmd.Buffer == nil { - f.Dead = false - cmd.Error = fmt.Errorf("could not make buffer") - log.Error(cmd.Error, "f.Buffer == nil") - log.Error(cmd.Error, "SHOULD DIE HERE") - cmd.Done = true - } - - f.Dead = false - - // loop that keeps trying to read from f - for f.Dead == false { - time.Sleep(time.Duration(msecDelay) * time.Millisecond) // only check the buffer 500 times a second - - // set to false so it keeps retrying reads - f.Empty = false - - // tight loop that reads 1024 bytes at a time until buffer is empty - // 1024 is set in f.BufferSize - for f.Empty == false { - f.Empty = cmd.ReadToBuffer(f) - } - } -} - -// returns true if filehandle buffer is empty -func (cmd *OldShell) ReadToBuffer(f *File) bool { - log.Log(RUN, "ReadToBuffer() START") - nbr := f.Fnbreader - oneByte := make([]byte, 1024) - if nbr == nil { - // log.Debugln("ReadToBuffer() ERROR nbr is nil") - f.Dead = true - return true - } - count, err := nbr.Read(oneByte) - f.TotalCount += count - - if err != nil { - // log.Debugln("ReadToBuffer() file has closed with", err) - // log.Debugln("ReadToBuffer() count = ", count, "err = ", err) - f.Dead = true - return true - } - if count == 0 { - // log.Debugln("ReadToBuffer() START count == 0 return true") - return true - } - // log.Debugln("ReadToBuffer() count = ", count) - // tmp := Chomp(oneByte) - // log.Debugln("ReadToBuffer() tmp = ", tmp) - io.WriteString(cmd.Buffer, strings.Trim(string(oneByte), "\x00")) - return false -} - // send the path and the command func RunCmd(workingpath string, parts []string) (error, bool, string) { if len(parts) == 0 { |
