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

SNMP编程

开发平台:

Unix_Linux

  1. #include <net-snmp/net-snmp-config.h>
  2. #include <sys/types.h>
  3. #if TIME_WITH_SYS_TIME
  4. # ifdef WIN32
  5. #  include <sys/timeb.h>
  6. # else
  7. #  include <sys/time.h>
  8. # endif
  9. # include <time.h>
  10. #else
  11. # if HAVE_SYS_TIME_H
  12. #  include <sys/time.h>
  13. # else
  14. #  include <time.h>
  15. # endif
  16. #endif
  17. #if HAVE_NETINET_IN_H
  18. #include <netinet/in.h>
  19. #endif
  20. #if HAVE_WINSOCK_H
  21. #include <winsock.h>
  22. #endif
  23. #if HAVE_STRING_H
  24. #include <string.h>
  25. #endif
  26. #include <net-snmp/net-snmp-includes.h>
  27. #include <net-snmp/agent/net-snmp-agent-includes.h>
  28. #include "struct.h"
  29. #include "versioninfo.h"
  30. #include "util_funcs.h"
  31. void
  32. init_versioninfo(void)
  33. {
  34.     /*
  35.      * define the structure we're going to ask the agent to register our
  36.      * information at 
  37.      */
  38.     struct variable2 extensible_version_variables[] = {
  39.         {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_version, 1,
  40.          {MIBINDEX}},
  41.         {VERTAG, ASN_OCTET_STR, RONLY, var_extensible_version, 1,
  42.          {VERTAG}},
  43.         {VERDATE, ASN_OCTET_STR, RONLY, var_extensible_version, 1,
  44.          {VERDATE}},
  45.         {VERCDATE, ASN_OCTET_STR, RONLY, var_extensible_version, 1,
  46.          {VERCDATE}},
  47.         {VERIDENT, ASN_OCTET_STR, RONLY, var_extensible_version, 1,
  48.          {VERIDENT}},
  49.         {VERCONFIG, ASN_OCTET_STR, RONLY, var_extensible_version, 1,
  50.          {VERCONFIG}},
  51.         {VERCLEARCACHE, ASN_INTEGER, RWRITE, var_extensible_version, 1,
  52.          {VERCLEARCACHE}},
  53.         {VERUPDATECONFIG, ASN_INTEGER, RWRITE, var_extensible_version, 1,
  54.          {VERUPDATECONFIG}},
  55.         {VERRESTARTAGENT, ASN_INTEGER, RWRITE, var_extensible_version, 1,
  56.          {VERRESTARTAGENT}},
  57.         {VERSAVEPERSISTENT, ASN_INTEGER, RWRITE, var_extensible_version, 1,
  58.          {VERSAVEPERSISTENT}},
  59.         {VERDEBUGGING, ASN_INTEGER, RWRITE, var_extensible_version, 1,
  60.          {VERDEBUGGING}}
  61.     };
  62.     /*
  63.      * Define the OID pointer to the top of the mib tree that we're
  64.      * registering underneath 
  65.      */
  66.     oid             version_variables_oid[] =
  67.         { UCDAVIS_MIB, VERSIONMIBNUM };
  68.     /*
  69.      * register ourselves with the agent to handle our mib tree 
  70.      */
  71.     REGISTER_MIB("ucd-snmp/versioninfo", extensible_version_variables,
  72.                  variable2, version_variables_oid);
  73. }
  74. u_char         *
  75. var_extensible_version(struct variable *vp,
  76.                        oid * name,
  77.                        size_t * length,
  78.                        int exact,
  79.                        size_t * var_len, WriteMethod ** write_method)
  80. {
  81.     static long     long_ret;
  82.     static char     errmsg[300];
  83.     char           *cptr;
  84.     time_t          curtime;
  85. #ifdef CONFIGURE_OPTIONS
  86.     static char     config_opts[] = CONFIGURE_OPTIONS;
  87. #endif
  88.     DEBUGMSGTL(("ucd-snmp/versioninfo", "var_extensible_version: "));
  89.     DEBUGMSGOID(("ucd-snmp/versioninfo", name, *length));
  90.     DEBUGMSG(("ucd-snmp/versioninfo", " %dn", exact));
  91.     if (header_generic(vp, name, length, exact, var_len, write_method))
  92.         return (NULL);
  93.     switch (vp->magic) {
  94.     case MIBINDEX:
  95.         long_ret = name[8];
  96.         return ((u_char *) (&long_ret));
  97.     case VERTAG:
  98.         sprintf(errmsg, netsnmp_get_version());
  99.         *var_len = strlen(errmsg);
  100.         return ((u_char *) errmsg);
  101.     case VERDATE:
  102.         sprintf(errmsg, "$Date: 2004/01/27 17:24:26 $");
  103.         *var_len = strlen(errmsg);
  104.         return ((u_char *) errmsg);
  105.     case VERCDATE:
  106.         curtime = time(NULL);
  107.         cptr = ctime(&curtime);
  108.         sprintf(errmsg, cptr);
  109.         *var_len = strlen(errmsg) - 1;
  110.         return ((u_char *) errmsg);
  111.     case VERIDENT:
  112.         sprintf(errmsg,
  113.                 "$Id: versioninfo.c,v 5.2 2004/01/27 17:24:26 slif Exp $");
  114.         *var_len = strlen(errmsg);
  115.         return ((u_char *) errmsg);
  116.     case VERCONFIG:
  117. #ifdef CONFIGURE_OPTIONS
  118.         *var_len = strlen(config_opts);
  119.         if (*var_len > 1024)
  120.             *var_len = 1024;    /* mib imposed restriction */
  121.         return (u_char *) config_opts;
  122. #else
  123.         sprintf(errmsg, "");
  124.         *var_len = strlen(errmsg);
  125.         return ((u_char *) errmsg);
  126. #endif
  127.     case VERCLEARCACHE:
  128.         *write_method = clear_cache;
  129.         long_ret = 0;
  130.         return ((u_char *) & long_ret);
  131.     case VERUPDATECONFIG:
  132.         *write_method = update_hook;
  133.         long_ret = 0;
  134.         return ((u_char *) & long_ret);
  135.     case VERRESTARTAGENT:
  136.         *write_method = restart_hook;
  137.         long_ret = 0;
  138.         return ((u_char *) & long_ret);
  139.     case VERSAVEPERSISTENT:
  140.         *write_method = save_persistent;
  141.         long_ret = 0;
  142.         return ((u_char *) & long_ret);
  143.     case VERDEBUGGING:
  144.         *write_method = debugging_hook;
  145.         long_ret = snmp_get_do_debugging();
  146.         return ((u_char *) & long_ret);
  147.     }
  148.     return NULL;
  149. }
  150. int
  151. update_hook(int action,
  152.             u_char * var_val,
  153.             u_char var_val_type,
  154.             size_t var_val_len,
  155.             u_char * statP, oid * name, size_t name_len)
  156. {
  157.     long            tmp = 0;
  158.     if (var_val_type != ASN_INTEGER) {
  159.         snmp_log(LOG_ERR, "Wrong type != intn");
  160.         return SNMP_ERR_WRONGTYPE;
  161.     }
  162.     tmp = *((long *) var_val);
  163.     if (tmp == 1 && action == COMMIT) {
  164.         update_config();
  165.     }
  166.     return SNMP_ERR_NOERROR;
  167. }
  168. int
  169. debugging_hook(int action,
  170.                u_char * var_val,
  171.                u_char var_val_type,
  172.                size_t var_val_len,
  173.                u_char * statP, oid * name, size_t name_len)
  174. {
  175.     long            tmp = 0;
  176.     if (var_val_type != ASN_INTEGER) {
  177.         DEBUGMSGTL(("versioninfo", "Wrong type != intn"));
  178.         return SNMP_ERR_WRONGTYPE;
  179.     }
  180.     tmp = *((long *) var_val);
  181.     if (action == COMMIT) {
  182.         snmp_set_do_debugging(tmp);
  183.     }
  184.     return SNMP_ERR_NOERROR;
  185. }
  186. int
  187. save_persistent(int action,
  188.                u_char * var_val,
  189.                u_char var_val_type,
  190.                size_t var_val_len,
  191.                u_char * statP, oid * name, size_t name_len)
  192. {
  193.     long            tmp = 0;
  194.     if (var_val_type != ASN_INTEGER) {
  195.         DEBUGMSGTL(("versioninfo", "Wrong type != intn"));
  196.         return SNMP_ERR_WRONGTYPE;
  197.     }
  198.     tmp = *((long *) var_val);
  199.     if (action == COMMIT) {
  200.         snmp_store(netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
  201.                                          NETSNMP_DS_LIB_APPTYPE));
  202.     }
  203.     return SNMP_ERR_NOERROR;
  204. }