improve CGI exit code fetching

Signed-off-by: kim (grufwub) <grufwub@gmail.com>

Former-commit-id: d5dc759452e5be776500e265c8f466465c285ec3
development
kim (grufwub) 4 years ago
parent 21dabb5050
commit ce73853fd0

@ -26,6 +26,7 @@ func setupInitialCGIEnv(safePath string) []string {
// generateCGIEnv takes a Client, and Request object, uses the global constant slice and generates a full set of CGI environment variables
func generateCGIEnv(client *Client, request *Request) []string {
// Append
env := append(cgiEnv, "REMOTE_ADDR="+client.IP())
env = append(env, "QUERY_STRING="+request.Query())
env = append(env, "SCRIPT_NAME="+request.Path().Relative())
@ -69,7 +70,7 @@ func ExecuteCGIScript(client *Client, request *Request) *errors.Error {
return
}
// Get process group id
// Get process group id.
pgid, err := syscall.Getpgid(cmd.Process.Pid)
if err != nil {
SystemLog.Fatalf(pgidNotFoundErrStr)
@ -82,26 +83,19 @@ func ExecuteCGIScript(client *Client, request *Request) *errors.Error {
}
}()
// Wait for command to finish, get exit code
// Wait for command to finish
err = cmd.Wait()
exitCode := 0
if err != nil {
// Error, try to get exit code
exitError, ok := err.(*exec.ExitError)
if ok {
waitStatus := exitError.Sys().(syscall.WaitStatus)
exitCode = waitStatus.ExitStatus()
} else {
// Attempt to get exit code from error
var exitCode int
switch err.(type) {
case *exec.ExitError:
exitCode = err.(*exec.ExitError).Sys().(syscall.WaitStatus).ExitStatus()
default:
exitCode = 1
}
} else {
// No error! Get exit code directly from command process state
waitStatus := cmd.ProcessState.Sys().(syscall.WaitStatus)
exitCode = waitStatus.ExitStatus()
}
// Non-zero exit code? Return error
if exitCode != 0 {
// Log and return
SystemLog.Errorf(cgiExecuteErrStr, request.Path().Absolute(), exitCode)
return errors.NewError(CGIExitCodeErr)
}

Loading…
Cancel
Save