|
|
@@ -0,0 +1,61 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "log"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "plugin"
|
|
|
+)
|
|
|
+
|
|
|
+type Plugin struct {
|
|
|
+ *plugin.Plugin
|
|
|
+}
|
|
|
+
|
|
|
+func newPlugin(path string) (*Plugin, error) {
|
|
|
+ p, err := plugin.Open(path)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return &Plugin{Plugin: p}, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (p *Plugin) Name() string {
|
|
|
+ s, _ := p.Lookup("Name")
|
|
|
+ return *(s).(*string)
|
|
|
+}
|
|
|
+
|
|
|
+func loadPlugins() error {
|
|
|
+ path, err := os.UserConfigDir()
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ path = filepath.Join(path, name, "plugins")
|
|
|
+ err = os.MkdirAll(path, os.ModePerm)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ entries, err := os.ReadDir(path)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, entry := range entries {
|
|
|
+ if entry.IsDir() {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ if filepath.Ext(entry.Name()) == ".so" {
|
|
|
+ p, err := newPlugin(filepath.Join(path, entry.Name()))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ plugins = append(plugins, p)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|