snmp_perl.c

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      * DynaLoader is a special case 
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     /* newer perl */
00082     eval_pv(something, TRUE);
00083 #else
00084 #ifdef HAVE_PERL_EVAL_PV
00085     /* older perl */
00086     perl_eval_pv(something, TRUE);
00087 #else /* !HAVE_PERL_EVAL_PV */
00088 #error embedded perl broken 
00089 #endif /* !HAVE_PERL_EVAL_PV */
00090 #endif /* !HAVE_EVAL_PV */
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      * register config handlers 
00113      */
00114     snmpd_register_config_handler("perl", perl_config_handler, NULL,
00115                                   "PERLCODE");
00116 
00117     /*
00118      * define the perlInitFile token to point to an init file 
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      * define the perlInitFile token to point to an init file 
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 }

net-snmpに対してSat Sep 5 13:14:25 2009に生成されました。  doxygen 1.4.7