+ return 0;
+} /* static int init_pi (const char **, const int) */
+
+static int perl_config (const char *key, const char *value)
+{
+ log_debug ("perl_config: key = \"%s\", value=\"%s\"", key, value);
+
+ if (0 == strcasecmp (key, "LoadPlugin")) {
+ char module_name[DATA_MAX_NAME_LEN];
+
+ if (get_module_name (module_name, sizeof (module_name), value)
+ == NULL) {
+ log_err ("Invalid module name %s", value);
+ return (1);
+ } /* if (get_module_name == NULL) */
+
+ init_pi (perl_argc, perl_argv);
+
+ log_info ("perl_config: loading perl plugin \"%s\"", value);
+ Perl_load_module (perl, PERL_LOADMOD_NOIMPORT,
+ Perl_newSVpv (perl, module_name, strlen (module_name)),
+ Nullsv);
+ }
+ else if (0 == strcasecmp (key, "BaseName")) {
+ log_debug ("perl_config: Setting plugin basename to \"%s\"", value);
+ strncpy (base_name, value, sizeof (base_name));
+ base_name[sizeof (base_name) - 1] = '\0';
+ }
+ else if (0 == strcasecmp (key, "IncludeDir")) {
+ perl_argv = (char **)realloc (perl_argv,
+ (++perl_argc + 1) * sizeof (char *));
+
+ if (NULL == perl_argv) {
+ log_err ("perl_config: Not enough memory.");
+ exit (3);
+ }
+
+ perl_argv[perl_argc - 1] = (char *)smalloc (strlen (value) + 3);
+ sstrncpy(perl_argv[perl_argc - 1], "-I", 3);
+ sstrncpy(perl_argv[perl_argc - 1] + 2, value, strlen (value) + 1);
+
+ perl_argv[perl_argc] = NULL;
+ }
+ else {
+ return -1;
+ }
+ return 0;
+} /* static int perl_config (char *, char *) */
+
+void module_register (void)
+{
+ perl_argc = 4;
+ perl_argv = (char **)smalloc ((perl_argc + 1) * sizeof (char *));
+
+ /* default options for the Perl interpreter */
+ perl_argv[0] = "";
+ perl_argv[1] = "-MCollectd";
+ perl_argv[2] = "-e";
+ perl_argv[3] = "1";
+ perl_argv[4] = NULL;
+
+ plugin_register_config ("perl", perl_config, config_keys, config_keys_num);