X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fperl.c;h=f2cb7b6687a40ced37e5f05572cdf07c563e5b1f;hb=930d01e4400ef87372eefa2b92f385d34d527c90;hp=f42708d7dde81cff2d8d811f66d0a3e2eda8e781;hpb=6106b146e0ee9b02cd34501eec58a4340be89029;p=collectd.git diff --git a/src/perl.c b/src/perl.c index f42708d7..f2cb7b66 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); @@ -326,7 +333,7 @@ static char *get_module_name (char *buf, size_t buf_len, const char *module) { status = snprintf (buf, buf_len, "%s::%s", base_name, module); if ((status < 0) || (status >= buf_len)) return (NULL); - buf[buf_len] = '\0'; + buf[buf_len - 1] = '\0'; return (buf); } /* char *get_module_name */ @@ -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) */ @@ -1064,7 +1097,7 @@ static void xs_init (pTHX) /* * Create the perl interpreter and register it with collectd. */ -void module_register (modreg_e load) +void module_register (void) { char *embed_argv[] = { "", "-e", "bootstrap Collectd \""VERSION"\"", NULL }; int embed_argc = 3; @@ -1098,8 +1131,7 @@ void module_register (modreg_e load) plugin_register_config ("perl", perl_config, config_keys, config_keys_num); plugin_register_init ("perl", perl_init); - if (load & MR_READ) - plugin_register_read ("perl", perl_read); + plugin_register_read ("perl", perl_read); plugin_register_write ("perl", perl_write); plugin_register_shutdown ("perl", perl_shutdown);