X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fperl.c;h=1ad72487cc329c487eef65cc65837edee74bfc31;hb=63cbff115ba03717e81087d1419fc07c24d205c2;hp=ebdacb8aa4839255fb2a04f38e1a353bb9a5e5f7;hpb=56d9e605484d5360f483079af8160d42e148ae39;p=collectd.git diff --git a/src/perl.c b/src/perl.c index ebdacb8a..1ad72487 100644 --- a/src/perl.c +++ b/src/perl.c @@ -25,8 +25,6 @@ */ #include "collectd.h" -#include "common.h" -#include "plugin.h" #include "configfile.h" @@ -35,6 +33,15 @@ #include +/* Some versions of Perl define their own version of DEBUG... :-/ */ +#ifdef DEBUG +# undef DEBUG +#endif /* DEBUG */ + +/* ... while we want the definition found in plugin.h. */ +#include "plugin.h" +#include "common.h" + #define PLUGIN_INIT 0 #define PLUGIN_READ 1 #define PLUGIN_WRITE 2 @@ -85,7 +92,7 @@ static const char *config_keys[] = { "LoadPlugin", "BaseName", - NULL + "IncludeDir" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); @@ -952,6 +959,8 @@ static XS (boot_Collectd) static int perl_config (const char *key, const char *value) { + assert (NULL != perl); + log_debug ("perl_config: key = \"%s\", value=\"%s\"", key, value); if (0 == strcasecmp (key, "LoadPlugin")) { @@ -965,7 +974,7 @@ static int perl_config (const char *key, const char *value) log_debug ("perl_config: loading perl plugin \"%s\"", value); Perl_load_module (perl, PERL_LOADMOD_NOIMPORT, - newSVpv (module_name, strlen (module_name)), + Perl_newSVpv (perl, module_name, strlen (module_name)), Nullsv); } else if (0 == strcasecmp (key, "BaseName")) { @@ -973,6 +982,11 @@ static int perl_config (const char *key, const char *value) strncpy (base_name, value, sizeof (base_name)); base_name[sizeof (base_name) - 1] = '\0'; } + else if (0 == strcasecmp (key, "IncludeDir")) { + Perl_av_unshift (perl, GvAVn (PL_incgv), 1); + Perl_av_store (perl, GvAVn (PL_incgv), + 0, Perl_newSVpv (perl, value, strlen (value))); + } else { return -1; } @@ -981,24 +995,32 @@ static int perl_config (const char *key, const char *value) static int perl_init (void) { + assert (NULL != perl); + PERL_SET_CONTEXT (perl); return pplugin_call_all (PLUGIN_INIT); } /* static int perl_init (void) */ static int perl_read (void) { + assert (NULL != perl); + PERL_SET_CONTEXT (perl); return pplugin_call_all (PLUGIN_READ); } /* static int perl_read (void) */ static int perl_write (const data_set_t *ds, const value_list_t *vl) { + assert (NULL != perl); + PERL_SET_CONTEXT (perl); return pplugin_call_all (PLUGIN_WRITE, ds, vl); } /* static int perl_write (const data_set_t *, const value_list_t *) */ static void perl_log (int level, const char *msg) { + assert (NULL != perl); + PERL_SET_CONTEXT (perl); pplugin_call_all (PLUGIN_LOG, level, msg); return; @@ -1009,6 +1031,14 @@ static int perl_shutdown (void) int i = 0; int ret = 0; + plugin_unregister_log ("perl"); + plugin_unregister_config ("perl"); + plugin_unregister_init ("perl"); + plugin_unregister_read ("perl"); + plugin_unregister_write ("perl"); + + assert (NULL != perl); + PERL_SET_CONTEXT (perl); ret = pplugin_call_all (PLUGIN_SHUTDOWN); @@ -1042,8 +1072,11 @@ static int perl_shutdown (void) perl_destruct (perl); perl_free (perl); + perl = NULL; PERL_SYS_TERM (); + + plugin_unregister_shutdown ("perl"); return ret; } /* static void perl_shutdown (void) */ @@ -1097,7 +1130,9 @@ void module_register (void) plugin_register_log ("perl", perl_log); plugin_register_config ("perl", perl_config, config_keys, config_keys_num); plugin_register_init ("perl", perl_init); + plugin_register_read ("perl", perl_read); + plugin_register_write ("perl", perl_write); plugin_register_shutdown ("perl", perl_shutdown); return;