Selaa lähdekoodia

Update osext dependency (fixes #1272)

Jakob Borg 10 vuotta sitten
vanhempi
sitoutus
45c1357bab

+ 1 - 1
Godeps/Godeps.json

@@ -31,7 +31,7 @@
 		},
 		},
 		{
 		{
 			"ImportPath": "github.com/kardianos/osext",
 			"ImportPath": "github.com/kardianos/osext",
-			"Rev": "6e7f843663477789fac7c02def0d0909e969b4e5"
+			"Rev": "345163ffe35aa66560a4cd7dddf00f3ae21c9fda"
 		},
 		},
 		{
 		{
 			"ImportPath": "github.com/rcrowley/go-metrics",
 			"ImportPath": "github.com/rcrowley/go-metrics",

+ 2 - 2
Godeps/_workspace/src/github.com/kardianos/osext/osext_procfs.go

@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 // license that can be found in the LICENSE file.
 
 
-// +build linux netbsd openbsd solaris dragonfly
+// +build linux netbsd solaris dragonfly
 
 
 package osext
 package osext
 
 
@@ -27,7 +27,7 @@ func executable() (string, error) {
 		return execpath, nil
 		return execpath, nil
 	case "netbsd":
 	case "netbsd":
 		return os.Readlink("/proc/curproc/exe")
 		return os.Readlink("/proc/curproc/exe")
-	case "openbsd", "dragonfly":
+	case "dragonfly":
 		return os.Readlink("/proc/curproc/file")
 		return os.Readlink("/proc/curproc/file")
 	case "solaris":
 	case "solaris":
 		return os.Readlink(fmt.Sprintf("/proc/%d/path/a.out", os.Getpid()))
 		return os.Readlink(fmt.Sprintf("/proc/%d/path/a.out", os.Getpid()))

+ 53 - 6
Godeps/_workspace/src/github.com/kardianos/osext/osext_sysctl.go

@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 // license that can be found in the LICENSE file.
 
 
-// +build darwin freebsd
+// +build darwin freebsd openbsd
 
 
 package osext
 package osext
 
 
 import (
 import (
 	"os"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"path/filepath"
 	"runtime"
 	"runtime"
 	"syscall"
 	"syscall"
@@ -23,6 +24,8 @@ func executable() (string, error) {
 		mib = [4]int32{1 /* CTL_KERN */, 14 /* KERN_PROC */, 12 /* KERN_PROC_PATHNAME */, -1}
 		mib = [4]int32{1 /* CTL_KERN */, 14 /* KERN_PROC */, 12 /* KERN_PROC_PATHNAME */, -1}
 	case "darwin":
 	case "darwin":
 		mib = [4]int32{1 /* CTL_KERN */, 38 /* KERN_PROCARGS */, int32(os.Getpid()), -1}
 		mib = [4]int32{1 /* CTL_KERN */, 38 /* KERN_PROCARGS */, int32(os.Getpid()), -1}
+	case "openbsd":
+		mib = [4]int32{1 /* CTL_KERN */, 55 /* KERN_PROC_ARGS */, int32(os.Getpid()), 1 /* KERN_PROC_ARGV */}
 	}
 	}
 
 
 	n := uintptr(0)
 	n := uintptr(0)
@@ -42,14 +45,58 @@ func executable() (string, error) {
 	if n == 0 { // This shouldn't happen.
 	if n == 0 { // This shouldn't happen.
 		return "", nil
 		return "", nil
 	}
 	}
-	for i, v := range buf {
-		if v == 0 {
-			buf = buf[:i]
-			break
+
+	var execPath string
+	switch runtime.GOOS {
+	case "openbsd":
+		// buf now contains **argv, with pointers to each of the C-style
+		// NULL terminated arguments.
+		var args []string
+		argv := uintptr(unsafe.Pointer(&buf[0]))
+		Loop:
+			for {
+				argp := *(**[1<<20]byte)(unsafe.Pointer(argv))
+				if argp == nil {
+					break
+				}
+				for i := 0; uintptr(i) < n; i++ {
+					// we don't want the full arguments list
+					if string(argp[i]) == " " {
+						break Loop
+					}
+					if argp[i] != 0 {
+						continue
+					}
+					args = append(args, string(argp[:i]))
+					n -= uintptr(i)
+					break
+				}
+				if n < unsafe.Sizeof(argv) {
+					break
+				}
+				argv += unsafe.Sizeof(argv)
+				n -= unsafe.Sizeof(argv)
+			}
+		execPath = args[0]
+		// There is no canonical way to get an executable path on
+		// OpenBSD, so check PATH in case we are called directly
+		if execPath[0] != '/' && execPath[0] != '.' {
+			execIsInPath, err := exec.LookPath(execPath)
+			if err == nil {
+				execPath = execIsInPath
+			}
 		}
 		}
+	default:
+		for i, v := range buf {
+			if v == 0 {
+				buf = buf[:i]
+				break
+			}
+		}
+		execPath = string(buf)
 	}
 	}
+
 	var err error
 	var err error
-	execPath := string(buf)
 	// execPath will not be empty due to above checks.
 	// execPath will not be empty due to above checks.
 	// Try to get the absolute path if the execPath is not rooted.
 	// Try to get the absolute path if the execPath is not rooted.
 	if execPath[0] != '/' {
 	if execPath[0] != '/' {