X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fperl.c;h=1ad72487cc329c487eef65cc65837edee74bfc31;hb=79e5cac135349c56f26cd437dff6f865b8c4e949;hp=d8f294f06b1bf61472d267ebef6fb8bc77e3b487;hpb=9b87126dfc4bd3fd52ecf8d26e21e13e589f1ecd;p=collectd.git diff --git a/src/perl.c b/src/perl.c index d8f294f0..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")) { @@ -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;