OSDN Git Service

PR go/48503
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 22 Apr 2011 18:23:47 +0000 (18:23 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 22 Apr 2011 18:23:47 +0000 (18:23 +0000)
libgo: Bring over http/cgi environment inheritance patches.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172864 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/go/http/cgi/host.go

index 2272387..af082e1 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 = "."