|
|
|
@ -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)
|
|
|
|
|
}
|
|
|
|
|