plugin.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * plugin.h
  3. */
  4. #ifndef _clish_plugin_h
  5. #define _clish_plugin_h
  6. #include "lub/types.h"
  7. /* Symbol */
  8. /* Symbol types. Functions with different definition. */
  9. typedef enum {
  10. CLISH_SYM_TYPE_NONE = 0, /* None */
  11. CLISH_SYM_TYPE_ACTION, /* Common builtin symbol */
  12. CLISH_SYM_TYPE_INIT,
  13. CLISH_SYM_TYPE_FINI,
  14. CLISH_SYM_TYPE_ACCESS,
  15. CLISH_SYM_TYPE_CONFIG,
  16. CLISH_SYM_TYPE_LOG,
  17. CLISH_SYM_TYPE_MAX /* Number of elements */
  18. } clish_sym_type_e;
  19. typedef struct clish_sym_s clish_sym_t;
  20. typedef struct clish_plugin_s clish_plugin_t;
  21. /* Plugin types */
  22. /* Name of init function within plugin */
  23. #define CLISH_PLUGIN_INIT_FNAME clish_plugin_init
  24. #define CLISH_PLUGIN_INIT_NAME "clish_plugin_init"
  25. #define CLISH_PLUGIN_INIT_FUNC(name) int name(void *clish_shell, clish_plugin_t *plugin)
  26. #define CLISH_PLUGIN_INIT CLISH_PLUGIN_INIT_FUNC(CLISH_PLUGIN_INIT_FNAME)
  27. /* Name of fini function within plugin */
  28. #define CLISH_PLUGIN_FINI_FNAME clish_plugin_fini
  29. #define CLISH_PLUGIN_FINI_NAME "clish_plugin_fini"
  30. #define CLISH_PLUGIN_FINI_FUNC(name) int name(void *clish_shell, clish_plugin_t *plugin)
  31. #define CLISH_PLUGIN_FINI CLISH_PLUGIN_FINI_FUNC(CLISH_PLUGIN_FINI_FNAME)
  32. #define CLISH_HOOK_INIT(name) int name(void *clish_context)
  33. #define CLISH_HOOK_FINI(name) int name(void *clish_context)
  34. #define CLISH_PLUGIN_SYM(name) int name(void *clish_context, const char *script, char **out)
  35. #define CLISH_HOOK_ACCESS(name) int name(void *clish_context, const char *access)
  36. #define CLISH_HOOK_CONFIG(name) int name(void *clish_context)
  37. #define CLISH_HOOK_LOG(name) int name(void *clish_context, const char *line, int retcode)
  38. /* Default syms */
  39. #define CLISH_DEFAULT_SYM "clish_script@clish" /* Builtin symbol to use by default */
  40. #define CLISH_DEFAULT_ACCESS "clish_hook_access@clish"
  41. #define CLISH_DEFAULT_CONFIG "clish_hook_config@clish"
  42. #define CLISH_DEFAULT_LOG "clish_hook_log@clish"
  43. /* typedef void clish_shell_cmd_line_fn_t(clish_context_t *context, const char *cmd_line); */
  44. typedef CLISH_PLUGIN_INIT_FUNC(clish_plugin_init_t);
  45. typedef CLISH_PLUGIN_FINI_FUNC(clish_plugin_fini_t);
  46. typedef CLISH_PLUGIN_SYM(clish_hook_action_fn_t);
  47. typedef CLISH_HOOK_INIT(clish_hook_init_fn_t);
  48. typedef CLISH_HOOK_FINI(clish_hook_fini_fn_t);
  49. typedef CLISH_HOOK_ACCESS(clish_hook_access_fn_t);
  50. typedef CLISH_HOOK_CONFIG(clish_hook_config_fn_t);
  51. typedef CLISH_HOOK_LOG(clish_hook_log_fn_t);
  52. /* Helpers */
  53. #define SYM_FN(TYPE,SYM) (*((clish_hook_##TYPE##_fn_t *)(clish_sym__get_func(SYM))))
  54. /* Symbol */
  55. int clish_sym_compare(const void *first, const void *second);
  56. clish_sym_t *clish_sym_new(const char *name, void *func, int type);
  57. void clish_sym_free(clish_sym_t *instance);
  58. void clish_sym__set_func(clish_sym_t *instance, void *func);
  59. void *clish_sym__get_func(clish_sym_t *instance);
  60. void clish_sym__set_name(clish_sym_t *instance, const char *name);
  61. char *clish_sym__get_name(clish_sym_t *instance);
  62. void clish_sym__set_permanent(clish_sym_t *instance, bool_t permanent);
  63. bool_t clish_sym__get_permanent(clish_sym_t *instance);
  64. void clish_sym__set_plugin(clish_sym_t *instance, clish_plugin_t *plugin);
  65. clish_plugin_t *clish_sym__get_plugin(clish_sym_t *instance);
  66. void clish_sym__set_type(clish_sym_t *instance, int type);
  67. int clish_sym__get_type(clish_sym_t *instance);
  68. int clish_sym_clone(clish_sym_t *dst, clish_sym_t *src);
  69. /* Plugin */
  70. clish_plugin_t *clish_plugin_new(const char *file, const char *alias);
  71. void clish_plugin_free(clish_plugin_t *instance, void *userdata);
  72. int clish_plugin_load(clish_plugin_t *instance, void *userdata);
  73. clish_sym_t *clish_plugin_get_sym(clish_plugin_t *instance,
  74. const char *name, int type);
  75. clish_sym_t *clish_plugin_add_generic(clish_plugin_t *instance,
  76. void *func, const char *name, int type, bool_t permanent);
  77. clish_sym_t *clish_plugin_add_sym(clish_plugin_t *instance,
  78. clish_hook_action_fn_t *func, const char *name);
  79. clish_sym_t *clish_plugin_add_psym(clish_plugin_t *instance,
  80. clish_hook_action_fn_t *func, const char *name);
  81. clish_sym_t *clish_plugin_add_hook(clish_plugin_t *instance,
  82. void *func, const char *name, int type);
  83. clish_sym_t *clish_plugin_add_phook(clish_plugin_t *instance,
  84. void *func, const char *name, int type);
  85. void clish_plugin_dump(const clish_plugin_t *instance);
  86. void clish_plugin__set_name(clish_plugin_t *instance, const char *name);
  87. char *clish_plugin__get_name(const clish_plugin_t *instance);
  88. void clish_plugin__set_alias(clish_plugin_t *instance, const char *alias);
  89. char *clish_plugin__get_alias(const clish_plugin_t *instance);
  90. char *clish_plugin__get_pubname(const clish_plugin_t *instance);
  91. char *clish_plugin__get_file(const clish_plugin_t *instance);
  92. void clish_plugin__set_conf(clish_plugin_t *instance, const char *conf);
  93. char *clish_plugin__get_conf(const clish_plugin_t *instance);
  94. #endif /* _clish_plugin_h */
  95. /** @} clish_plugin */