snmp_perl.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:4k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. #include <EXTERN.h>
  2. #include "perl.h"
  3. #include <net-snmp/net-snmp-config.h>
  4. #include <net-snmp/net-snmp-includes.h>
  5. #include <net-snmp/agent/net-snmp-agent-includes.h>
  6. static PerlInterpreter *my_perl;
  7. void            boot_DynaLoader(CV * cv);
  8. void
  9. xs_init(void)
  10. {
  11.     char            myfile[] = __FILE__;
  12.     char            modulename[] = "DynaLoader::boot_DynaLoader";
  13.     /*
  14.      * DynaLoader is a special case 
  15.      */
  16.     newXS(modulename, boot_DynaLoader, myfile);
  17. }
  18. void
  19. maybe_source_perl_startup(void)
  20. {
  21.     const char     *embedargs[] = { "", "" };
  22.     const char     *perl_init_file = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
  23.    NETSNMP_DS_AGENT_PERL_INIT_FILE);
  24.     char            init_file[SNMP_MAXBUF];
  25.     static int      have_done_init = 0;
  26.     if (have_done_init)
  27.         return;
  28.     have_done_init = 1;
  29.     if (!perl_init_file) {
  30.         snprintf(init_file, sizeof(init_file) - 1,
  31.                  "%s/%s", SNMPSHAREPATH, "snmp_perl.pl");
  32.         perl_init_file = init_file;
  33.     }
  34.     embedargs[1] = perl_init_file;
  35.     DEBUGMSGTL(("perl", "initializing perl (%s)n", embedargs[1]));
  36.     my_perl = perl_alloc();
  37.     if (!my_perl)
  38.         goto bail_out;
  39.     perl_construct(my_perl);
  40.     if (perl_parse(my_perl, xs_init, 2, (char **) embedargs, NULL))
  41.         goto bail_out;
  42.     if (perl_run(my_perl))
  43.         goto bail_out;
  44.     DEBUGMSGTL(("perl", "done initializing perln"));
  45.     return;
  46.   bail_out:
  47.     snmp_log(LOG_ERR, "embedded perl support failed to initalizen");
  48.     netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, 
  49.    NETSNMP_DS_AGENT_DISABLE_PERL, 1);
  50.     return;
  51. }
  52. void
  53. do_something_perlish(char *something)
  54. {
  55.     if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  56.        NETSNMP_DS_AGENT_DISABLE_PERL)) {
  57.         return;
  58.     }
  59.     maybe_source_perl_startup();
  60.     if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  61.        NETSNMP_DS_AGENT_DISABLE_PERL)) {
  62.         return;
  63.     }
  64.     DEBUGMSGTL(("perl", "calling perln"));
  65. #ifdef HAVE_EVAL_PV
  66.     /* newer perl */
  67.     eval_pv(something, TRUE);
  68. #else
  69. #ifdef HAVE_PERL_EVAL_PV
  70.     /* older perl */
  71.     perl_eval_pv(something, TRUE);
  72. #else /* !HAVE_PERL_EVAL_PV */
  73. #error embedded perl broken 
  74. #endif /* !HAVE_PERL_EVAL_PV */
  75. #endif /* !HAVE_EVAL_PV */
  76.     DEBUGMSGTL(("perl", "finished calling perln"));
  77. }
  78. void
  79. perl_config_handler(const char *token, char *line)
  80. {
  81.     do_something_perlish(line);
  82. }
  83. void
  84. init_perl(void)
  85. {
  86.     const char     *appid = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 
  87.   NETSNMP_DS_LIB_APPTYPE);
  88.     const char     *defaultid = "snmpd";
  89.     if (!appid) {
  90.         appid = defaultid;
  91.     }
  92.     /*
  93.      * register config handlers 
  94.      */
  95.     snmpd_register_config_handler("perl", perl_config_handler, NULL,
  96.                                   "PERLCODE");
  97.     /*
  98.      * define the perlInitFile token to point to an init file 
  99.      */
  100.     netsnmp_ds_register_premib(ASN_OCTET_STR, appid, "perlInitFile",
  101.        NETSNMP_DS_APPLICATION_ID, 
  102.        NETSNMP_DS_AGENT_PERL_INIT_FILE);
  103.     /*
  104.      * define the perlInitFile token to point to an init file 
  105.      */
  106.     netsnmp_ds_register_premib(ASN_BOOLEAN, appid, "disablePerl",
  107.        NETSNMP_DS_APPLICATION_ID,
  108.        NETSNMP_DS_AGENT_DISABLE_PERL);
  109. }
  110. void
  111. shutdown_perl(void)
  112. {
  113.     if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  114.        NETSNMP_DS_AGENT_DISABLE_PERL)) {
  115.         return;
  116.     }
  117.     DEBUGMSGTL(("perl", "shutting down perln"));
  118.     perl_destruct(my_perl);
  119.     perl_free(my_perl);
  120.     DEBUGMSGTL(("perl", "finished shutting down perln"));
  121. }