main.go 925 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "path"
  6. "plugin"
  7. )
  8. func loadPlugin(path string) (func(string), error) {
  9. p, err := plugin.Open(path)
  10. if err != nil {
  11. return nil, err
  12. }
  13. sayHello, err := p.Lookup("SayHello")
  14. if err != nil {
  15. return nil, err
  16. }
  17. return sayHello.(func(string)), nil
  18. }
  19. func getPlugins(pluginDir string) ([]func(string), error) {
  20. pDir, err := os.Open(pluginDir)
  21. if err != nil {
  22. return nil, err
  23. }
  24. pFiles, err := pDir.Readdir(0)
  25. if err != nil {
  26. return nil, err
  27. }
  28. var ret []func(string)
  29. for _, pFile := range pFiles {
  30. if pFile.IsDir() {
  31. continue
  32. }
  33. p, err := loadPlugin(path.Join(pluginDir, pFile.Name()))
  34. if err != nil {
  35. log.Printf("Failed to load pluging %s", p)
  36. } else {
  37. ret = append(ret, p)
  38. }
  39. }
  40. return ret, nil
  41. }
  42. func main() {
  43. pluginDir := os.Args[1]
  44. ps, err := getPlugins(pluginDir)
  45. if err != nil {
  46. panic(err)
  47. }
  48. for _, p := range ps {
  49. p("Gildas")
  50. }
  51. }