00001 #include <EXTERN.h>
00002 #include "perl.h"
00003
00004 #include <net-snmp/net-snmp-config.h>
00005 #include <net-snmp/net-snmp-includes.h>
00006 #include <net-snmp/agent/net-snmp-agent-includes.h>
00007
00008 static PerlInterpreter *my_perl;
00009
00010 void boot_DynaLoader(CV * cv);
00011
00012 void
00013 xs_init(void)
00014 {
00015 char myfile[] = __FILE__;
00016 char modulename[] = "DynaLoader::boot_DynaLoader";
00017
00018
00019
00020 newXS(modulename, boot_DynaLoader, myfile);
00021 }
00022
00023 void
00024 maybe_source_perl_startup(void)
00025 {
00026 const char *embedargs[] = { "", "" };
00027 const char *perl_init_file = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
00028 NETSNMP_DS_AGENT_PERL_INIT_FILE);
00029 char init_file[SNMP_MAXBUF];
00030
00031 static int have_done_init = 0;
00032
00033 if (have_done_init)
00034 return;
00035 have_done_init = 1;
00036
00037 if (!perl_init_file) {
00038 snprintf(init_file, sizeof(init_file) - 1,
00039 "%s/%s", SNMPSHAREPATH, "snmp_perl.pl");
00040 perl_init_file = init_file;
00041 }
00042 embedargs[1] = perl_init_file;
00043
00044 DEBUGMSGTL(("perl", "initializing perl (%s)\n", embedargs[1]));
00045 my_perl = perl_alloc();
00046 if (!my_perl)
00047 goto bail_out;
00048
00049 perl_construct(my_perl);
00050 if (perl_parse(my_perl, xs_init, 2, (char **) embedargs, NULL))
00051 goto bail_out;
00052
00053 if (perl_run(my_perl))
00054 goto bail_out;
00055
00056 DEBUGMSGTL(("perl", "done initializing perl\n"));
00057
00058 return;
00059
00060 bail_out:
00061 snmp_log(LOG_ERR, "embedded perl support failed to initalize\n");
00062 netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
00063 NETSNMP_DS_AGENT_DISABLE_PERL, 1);
00064 return;
00065 }
00066
00067 void
00068 do_something_perlish(char *something)
00069 {
00070 if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00071 NETSNMP_DS_AGENT_DISABLE_PERL)) {
00072 return;
00073 }
00074 maybe_source_perl_startup();
00075 if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00076 NETSNMP_DS_AGENT_DISABLE_PERL)) {
00077 return;
00078 }
00079 DEBUGMSGTL(("perl", "calling perl\n"));
00080 #ifdef HAVE_EVAL_PV
00081
00082 eval_pv(something, TRUE);
00083 #else
00084 #ifdef HAVE_PERL_EVAL_PV
00085
00086 perl_eval_pv(something, TRUE);
00087 #else
00088 #error embedded perl broken
00089 #endif
00090 #endif
00091 DEBUGMSGTL(("perl", "finished calling perl\n"));
00092 }
00093
00094 void
00095 perl_config_handler(const char *token, char *line)
00096 {
00097 do_something_perlish(line);
00098 }
00099
00100 void
00101 init_perl(void)
00102 {
00103 const char *appid = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
00104 NETSNMP_DS_LIB_APPTYPE);
00105 const char *defaultid = "snmpd";
00106
00107 if (!appid) {
00108 appid = defaultid;
00109 }
00110
00111
00112
00113
00114 snmpd_register_config_handler("perl", perl_config_handler, NULL,
00115 "PERLCODE");
00116
00117
00118
00119
00120 netsnmp_ds_register_premib(ASN_OCTET_STR, appid, "perlInitFile",
00121 NETSNMP_DS_APPLICATION_ID,
00122 NETSNMP_DS_AGENT_PERL_INIT_FILE);
00123
00124
00125
00126
00127 netsnmp_ds_register_premib(ASN_BOOLEAN, appid, "disablePerl",
00128 NETSNMP_DS_APPLICATION_ID,
00129 NETSNMP_DS_AGENT_DISABLE_PERL);
00130 }
00131
00132 void
00133 shutdown_perl(void)
00134 {
00135 if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00136 NETSNMP_DS_AGENT_DISABLE_PERL)) {
00137 return;
00138 }
00139 DEBUGMSGTL(("perl", "shutting down perl\n"));
00140 perl_destruct(my_perl);
00141 perl_free(my_perl);
00142 DEBUGMSGTL(("perl", "finished shutting down perl\n"));
00143 }