From f1cc9b7f8cf5c7da8b4bc2b076c9c56c92af1cee Mon Sep 17 00:00:00 2001 From: Aidan Date: Sun, 28 Jun 2020 14:20:17 -0700 Subject: [PATCH] function calls no longer return number tokens (cleaner output), added ? command to get return code --- stdlib/call.go | 23 +++++++++++++++-------- stdlib/stdlib.go | 7 +++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/stdlib/call.go b/stdlib/call.go index 9ceed6b..95e2050 100644 --- a/stdlib/call.go +++ b/stdlib/call.go @@ -29,6 +29,7 @@ import ( ) var bgProcs = make([]*exec.Cmd, 0) +var LastExitCode int func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { if in == nil { @@ -60,7 +61,6 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Stdin = os.Stdin - exit := 0 signalChan := make(chan os.Signal, 2) signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) @@ -74,13 +74,13 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { signal.Reset(os.Interrupt, syscall.SIGTERM) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { - exit = exitError.ExitCode() + LastExitCode = exitError.ExitCode() } else { log.Log(log.ERR, "Execution step returned unparsable error: " + err.Error(), "call") } } - return &ast.Token{Tag: ast.NUMBER, Inner: fmt.Sprintf("%d", exit)} + return nil } func bgcall(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { @@ -127,7 +127,6 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin - exit := 0 signalChan := make(chan os.Signal, 2) signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) @@ -141,13 +140,13 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { signal.Reset(os.Interrupt, syscall.SIGTERM) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { - exit = exitError.ExitCode() + LastExitCode = exitError.ExitCode() } else { - log.Log(log.ERR, "Execution step returned unparsable error: " + err.Error(), "call") + log.Log(log.ERR, "Execution step returned error: " + err.Error(), "call") } } - return &ast.Token{Tag: ast.NUMBER, Inner: fmt.Sprintf("%d", exit)} + return nil } func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { @@ -193,9 +192,17 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { close(signalChan) signal.Reset(os.Interrupt, syscall.SIGTERM) if err != nil { - log.Log(log.ERR, err.Error(), "$") + if exitError, ok := err.(*exec.ExitError); ok { + LastExitCode = exitError.ExitCode() + } else { + log.Log(log.ERR, "Execution step returned error: " + err.Error(), "$") + } } return &ast.Token{Tag: ast.STRING, Inner: out.String()} } + +func get_exit(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { + return &ast.Token{Tag: ast.NUMBER, Inner: fmt.Sprintf("%d", LastExitCode)} +} diff --git a/stdlib/stdlib.go b/stdlib/stdlib.go index 28a722c..a7971f4 100644 --- a/stdlib/stdlib.go +++ b/stdlib/stdlib.go @@ -122,6 +122,13 @@ func GenFuncTable() ast.FuncTable { TimesCalled: 0, Args: 0, }, + + "?": &ast.Function{ + Function: get_exit, + Name:"get exit code", + TimesCalled: 0, + Args: 0, + }, } return stdlib