re PR go/48503 (http/cgi FAILs if libgcc_s.so.1 isn't in default ld.so.1 search path)
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 22 Apr 2011 18:23:47 +0000 (18:23 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 22 Apr 2011 18:23:47 +0000 (18:23 +0000)
PR go/48503
libgo: Bring over http/cgi environment inheritance patches.

From-SVN: r172864

libgo/go/http/cgi/host.go

index 227238737495544232bb115f63bb25f7287eeb1b..af082e1a7ec2b22c7363d6c3dda811ba85bebc25 100644 (file)
@@ -25,20 +25,30 @@ import (
        "os"
        "path/filepath"
        "regexp"
+       "runtime"
        "strconv"
        "strings"
 )
 
 var trailingPort = regexp.MustCompile(`:([0-9]+)$`)
 
+var osDefaultInheritEnv = map[string][]string{
+       "darwin":  []string{"DYLD_LIBRARY_PATH"},
+       "freebsd": []string{"LD_LIBRARY_PATH"},
+       "hpux":    []string{"LD_LIBRARY_PATH", "SHLIB_PATH"},
+       "linux":   []string{"LD_LIBRARY_PATH"},
+       "windows": []string{"SystemRoot", "COMSPEC", "PATHEXT", "WINDIR"},
+}
+
 // Handler runs an executable in a subprocess with a CGI environment.
 type Handler struct {
        Path string // path to the CGI executable
        Root string // root URI prefix of handler or empty for "/"
 
-       Env    []string    // extra environment variables to set, if any
-       Logger *log.Logger // optional log for errors or nil to use log.Print
-       Args   []string    // optional arguments to pass to child process
+       Env        []string    // extra environment variables to set, if any, as "key=value"
+       InheritEnv []string    // environment variables to inherit from host, as "key"
+       Logger     *log.Logger // optional log for errors or nil to use log.Print
+       Args       []string    // optional arguments to pass to child process
 }
 
 func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
@@ -110,6 +120,24 @@ func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
                env = append(env, h.Env...)
        }
 
+       path := os.Getenv("PATH")
+       if path == "" {
+               path = "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin"
+       }
+       env = append(env, "PATH="+path)
+
+       for _, e := range h.InheritEnv {
+               if v := os.Getenv(e); v != "" {
+                       env = append(env, e+"="+v)
+               }
+       }
+
+       for _, e := range osDefaultInheritEnv[runtime.GOOS] {
+               if v := os.Getenv(e); v != "" {
+                       env = append(env, e+"="+v)
+               }
+       }
+
        cwd, pathBase := filepath.Split(h.Path)
        if cwd == "" {
                cwd = "."