aboutsummaryrefslogtreecommitdiff
path: root/src/plugin
diff options
context:
space:
mode:
authorDavid Crawshaw <crawshaw@golang.org>2016-09-19 14:09:07 -0400
committerDavid Crawshaw <crawshaw@golang.org>2016-09-23 02:16:42 +0000
commitb444d438c061fa934130fed17d34c23e77174851 (patch)
tree0913be8cfe3b21a0c0f4608e98ac87986b59342f /src/plugin
parentb4c9829c2299772eb0aaffcd437085f9f43e7166 (diff)
downloadgo-b444d438c061fa934130fed17d34c23e77174851.tar.gz
go-b444d438c061fa934130fed17d34c23e77174851.zip
plugin: darwin support
Change-Id: I76981d1d83da401178226634d076371a04f5ccb7 Reviewed-on: https://go-review.googlesource.com/29392 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/plugin')
-rw-r--r--src/plugin/plugin_dlopen.go17
-rw-r--r--src/plugin/plugin_stubs.go2
2 files changed, 14 insertions, 5 deletions
diff --git a/src/plugin/plugin_dlopen.go b/src/plugin/plugin_dlopen.go
index 45c0eeb07f..e881b258e0 100644
--- a/src/plugin/plugin_dlopen.go
+++ b/src/plugin/plugin_dlopen.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,cgo
+// +build linux,cgo darwin,cgo
package plugin
@@ -13,6 +13,8 @@ package plugin
#include <stdlib.h>
#include <stdint.h>
+#include <stdio.h>
+
static uintptr_t pluginOpen(const char* path, char** err) {
void* h = dlopen(path, RTLD_NOW|RTLD_GLOBAL);
if (h == NULL) {
@@ -38,12 +40,18 @@ import (
)
func open(name string) (*Plugin, error) {
- pluginsMu.Lock()
+ cPath := (*C.char)(C.malloc(C.PATH_MAX + 1))
+ defer C.free(unsafe.Pointer(cPath))
+
cRelName := C.CString(name)
- cPath := C.realpath(cRelName, nil)
+ if C.realpath(cRelName, cPath) == nil {
+ return nil, errors.New("plugin.Open(" + name + "): realpath failed")
+ }
C.free(unsafe.Pointer(cRelName))
- defer C.free(unsafe.Pointer(cPath))
+
path := C.GoString(cPath)
+
+ pluginsMu.Lock()
if p := plugins[path]; p != nil {
pluginsMu.Unlock()
<-p.loaded
@@ -61,6 +69,7 @@ func open(name string) (*Plugin, error) {
if len(name) > 3 && name[len(name)-3:] == ".so" {
name = name[:len(name)-3]
}
+
syms := lastmoduleinit()
if plugins == nil {
plugins = make(map[string]*Plugin)
diff --git a/src/plugin/plugin_stubs.go b/src/plugin/plugin_stubs.go
index 1b935bffa9..f0bcb4a3bd 100644
--- a/src/plugin/plugin_stubs.go
+++ b/src/plugin/plugin_stubs.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 !cgo
+// +build !linux,!darwin !cgo
package plugin