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

SNMP编程

开发平台:

Unix_Linux

  1. #include <net-snmp/net-snmp-config.h>
  2. #ifdef CMU_COMPATIBLE
  3. #include <net-snmp/mib_api.h>
  4. #include <net-snmp/pdu_api.h>
  5. #include <net-snmp/session_api.h>
  6. int
  7. mib_TxtToOid(char *Buf, oid ** OidP, size_t * LenP)
  8. {
  9.     return read_objid(Buf, *OidP, LenP);
  10. }
  11. int
  12. mib_OidToTxt(oid * O, size_t OidLen, char *Buf, size_t BufLen)
  13. {
  14.     _sprint_objid(Buf, O, OidLen);
  15.     return 1;
  16. }
  17. /*
  18.  * cmu_snmp_parse - emulate CMU library's snmp_parse.
  19.  *
  20.  * Parse packet, storing results into PDU.
  21.  * Returns community string if success, NULL if fail.
  22.  * WARNING: may return a zero length community string.
  23.  *
  24.  * Note:
  25.  * Some CMU-aware apps call init_mib(), but do not
  26.  * initialize a session.
  27.  * Check Reqid to make sure that this module is initialized.
  28.  */
  29. u_char         *
  30. cmu_snmp_parse(netsnmp_session * session,
  31.                netsnmp_pdu *pdu, u_char * data, size_t length)
  32. {
  33.     u_char         *bufp = NULL;
  34.     snmp_sess_init(session);    /* gimme a break! */
  35.     switch (pdu->version) {
  36.     case SNMP_VERSION_1:
  37.     case SNMP_VERSION_2c:
  38.     case SNMP_DEFAULT_VERSION:
  39.         break;
  40.     default:
  41.         return NULL;
  42.     }
  43. #ifndef NO_INTERNAL_VARLIST
  44.     if (snmp_parse(0, session, pdu, data, length) != SNMP_ERR_NOERROR) {
  45.         return NULL;
  46.     }
  47. #else
  48.     /*
  49.      * while there are two versions of variable_list:
  50.      * use an internal variable list for snmp_parse;
  51.      * clone the result.
  52.      */
  53.     if (1) {
  54.         netsnmp_pdu    *snmp_clone_pdu(netsnmp_pdu *);
  55.         netsnmp_pdu    *snmp_2clone_pdu(netsnmp_pdu *from_pdu,
  56.                                         netsnmp_pdu *to_pdu);
  57.         netsnmp_pdu    *ipdu;
  58.         ipdu = snmp_clone_pdu(pdu);
  59.         if (snmp_parse(0, session, ipdu, data, length) != SNMP_ERR_NOERROR) {
  60.             snmp_free_internal_pdu(ipdu);
  61.             return NULL;
  62.         }
  63.         pdu = snmp_2clone_pdu(ipdu, pdu);
  64.         snmp_free_internal_pdu(ipdu);
  65.     }
  66. #endif                          /* NO_INTERNAL_VAR_LIST */
  67.     /*
  68.      * Add a null to meet the caller's expectations. 
  69.      */
  70.     bufp = (u_char *) malloc(1 + pdu->community_len);
  71.     if (bufp && pdu->community_len) {
  72.         memcpy(bufp, pdu->community, pdu->community_len);
  73.         bufp[pdu->community_len] = '';
  74.     }
  75.     return (bufp);
  76. }
  77. #endif                          /* CMU_COMPATIBLE */