github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/lib/plugin/plugin.go (about)

     1  // +build darwin linux
     2  
     3  package plugin
     4  
     5  import (
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"plugin"
    11  	"strings"
    12  )
    13  
    14  func init() {
    15  	dir := os.Getenv("RCLONE_PLUGIN_PATH")
    16  	if dir == "" {
    17  		return
    18  	}
    19  	// Get file names of plugin dir
    20  	listing, err := ioutil.ReadDir(dir)
    21  	if err != nil {
    22  		fmt.Fprintln(os.Stderr, "Failed to open plugin directory:", err)
    23  	}
    24  	// Enumerate file names, load valid plugins
    25  	for _, file := range listing {
    26  		// Match name
    27  		fileName := file.Name()
    28  		if !strings.HasPrefix(fileName, "librcloneplugin_") {
    29  			continue
    30  		}
    31  		if !strings.HasSuffix(fileName, ".so") {
    32  			continue
    33  		}
    34  		// Try to load plugin
    35  		_, err := plugin.Open(filepath.Join(dir, fileName))
    36  		if err != nil {
    37  			fmt.Fprintf(os.Stderr, "Failed to load plugin %s: %s\n",
    38  				fileName, err)
    39  		}
    40  	}
    41  }