From 45c1357bab87b168352e0de8b4662a4725d73f01 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 23 Nov 2015 13:09:42 +0100 Subject: [PATCH] Update osext dependency (fixes #1272) --- Godeps/Godeps.json | 2 +- .../kardianos/osext/osext_procfs.go | 4 +- .../kardianos/osext/osext_sysctl.go | 59 +++++++++++++++++-- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 69d9446e0..cfb812743 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -31,7 +31,7 @@ }, { "ImportPath": "github.com/kardianos/osext", - "Rev": "6e7f843663477789fac7c02def0d0909e969b4e5" + "Rev": "345163ffe35aa66560a4cd7dddf00f3ae21c9fda" }, { "ImportPath": "github.com/rcrowley/go-metrics", diff --git a/Godeps/_workspace/src/github.com/kardianos/osext/osext_procfs.go b/Godeps/_workspace/src/github.com/kardianos/osext/osext_procfs.go index b2598bc77..d59847ee5 100644 --- a/Godeps/_workspace/src/github.com/kardianos/osext/osext_procfs.go +++ b/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 // license that can be found in the LICENSE file. -// +build linux netbsd openbsd solaris dragonfly +// +build linux netbsd solaris dragonfly package osext @@ -27,7 +27,7 @@ func executable() (string, error) { return execpath, nil case "netbsd": return os.Readlink("/proc/curproc/exe") - case "openbsd", "dragonfly": + case "dragonfly": return os.Readlink("/proc/curproc/file") case "solaris": return os.Readlink(fmt.Sprintf("/proc/%d/path/a.out", os.Getpid())) diff --git a/Godeps/_workspace/src/github.com/kardianos/osext/osext_sysctl.go b/Godeps/_workspace/src/github.com/kardianos/osext/osext_sysctl.go index b66cac878..e19dd038e 100644 --- a/Godeps/_workspace/src/github.com/kardianos/osext/osext_sysctl.go +++ b/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 // license that can be found in the LICENSE file. -// +build darwin freebsd +// +build darwin freebsd openbsd package osext import ( "os" + "os/exec" "path/filepath" "runtime" "syscall" @@ -23,6 +24,8 @@ func executable() (string, error) { mib = [4]int32{1 /* CTL_KERN */, 14 /* KERN_PROC */, 12 /* KERN_PROC_PATHNAME */, -1} case "darwin": 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) @@ -42,14 +45,58 @@ func executable() (string, error) { if n == 0 { // This shouldn't happen. 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 - execPath := string(buf) // execPath will not be empty due to above checks. // Try to get the absolute path if the execPath is not rooted. if execPath[0] != '/' {