forked from FloatTech/ZeroBot-Plugin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
325 additions
and
175 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// Copyright 2016 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
// Package plugin implements loading and symbol resolution of Go plugins. | ||
// | ||
// A plugin is a Go main package with exported functions and variables that | ||
// has been built with: | ||
// | ||
// go build -buildmode=plugin | ||
// | ||
// When a plugin is first opened, the init functions of all packages not | ||
// already part of the program are called. The main function is not run. | ||
// A plugin is only initialized once, and cannot be closed. | ||
// | ||
// Currently plugins are only supported on Linux, FreeBSD, and macOS. | ||
// Please report any issues. | ||
|
||
//go:build linux,cgo darwin,cgo freebsd,cgo | ||
// +build linux,cgo darwin,cgo freebsd,cgo | ||
|
||
package plugin | ||
|
||
import ( | ||
pl "plugin" | ||
"unsafe" | ||
) | ||
|
||
// Plugin is a loaded Go plugin. | ||
type Plugin struct { | ||
pluginpath string | ||
err string // set if plugin failed to load | ||
loaded chan struct{} // closed when loaded | ||
syms map[string]interface{} | ||
} | ||
|
||
// Open opens a Go plugin. | ||
// If a path has already been opened, then the existing *Plugin is returned. | ||
// It is safe for concurrent use by multiple goroutines. | ||
func Open(path string) (*Plugin, error) { | ||
p, err := pl.Open(path) | ||
return (*Plugin)(unsafe.Pointer(p)), err | ||
} | ||
|
||
// Lookup searches for a symbol named symName in plugin p. | ||
// A symbol is any exported variable or function. | ||
// It reports an error if the symbol is not found. | ||
// It is safe for concurrent use by multiple goroutines. | ||
func (p *Plugin) Lookup(symName string) (Symbol, error) { | ||
return (*pl.Plugin)(unsafe.Pointer(p)).Lookup(symName) | ||
} | ||
|
||
// Close closes a Go plugin. | ||
// If a path is noth opened, it is ignored. | ||
// It is safe for concurrent use by multiple goroutines. | ||
func Close(p *Plugin) error { | ||
return unload(p) | ||
} | ||
|
||
// A Symbol is a pointer to a variable or function. | ||
// | ||
// For example, a plugin defined as | ||
// | ||
// package main | ||
// | ||
// import "fmt" | ||
// | ||
// var V int | ||
// | ||
// func F() { fmt.Printf("Hello, number %d\n", V) } | ||
// | ||
// may be loaded with the Open function and then the exported package | ||
// symbols V and F can be accessed | ||
// | ||
// p, err := plugin.Open("plugin_name.so") | ||
// if err != nil { | ||
// panic(err) | ||
// } | ||
// v, err := p.Lookup("V") | ||
// if err != nil { | ||
// panic(err) | ||
// } | ||
// f, err := p.Lookup("F") | ||
// if err != nil { | ||
// panic(err) | ||
// } | ||
// *v.(*int) = 7 | ||
// f.(func())() // prints "Hello, number 7" | ||
type Symbol interface{} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.