⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iquery.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
字号:
#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include "utilities/iquery.h"voidnetsnmp_parse_iquerySecLevel(const char *token, char *line){    char buf[1024];    int secLevel;    if ((secLevel = parse_secLevel_conf( token, line )) >= 0 ) {        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,                           NETSNMP_DS_AGENT_INTERNAL_SECLEVEL, secLevel);    } else {        snprintf(buf, sizeof(buf), "Unknown security level: %s", line);        buf[ sizeof(buf)-1 ] = 0;        config_perror(buf);    }}voidnetsnmp_parse_iqueryVersion(const char *token, char *line){    char buf[1024];#ifndef NETSNMP_DISABLE_SNMPV1    if (!strcmp( line, "1" ))        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,                           NETSNMP_DS_AGENT_INTERNAL_VERSION, SNMP_VERSION_1);    else #endif#ifndef NETSNMP_DISABLE_SNMPV2C         if (!strcmp( line, "2"  ) || !strcasecmp( line, "2c" ))        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,                           NETSNMP_DS_AGENT_INTERNAL_VERSION, SNMP_VERSION_2c);    else #endif         if (!strcmp( line, "3" ))        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,                           NETSNMP_DS_AGENT_INTERNAL_VERSION, SNMP_VERSION_3);    else {        snprintf(buf, sizeof(buf), "Unknown version: %s", line);        buf[ sizeof(buf)-1 ] = 0;        config_perror(buf);    }}int_init_default_iquery_session( int majorID, int minorID,                              void *serverargs, void *clientarg){    char *secName = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,                                          NETSNMP_DS_AGENT_INTERNAL_SECNAME);    if (secName)        netsnmp_query_set_default_session(             netsnmp_iquery_user_session(secName));    return SNMPERR_SUCCESS;}void init_iquery(void){    char *type = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,                                        NETSNMP_DS_LIB_APPTYPE);    netsnmp_ds_register_premib(ASN_OCTET_STR, type, "agentSecName",                               NETSNMP_DS_APPLICATION_ID,                               NETSNMP_DS_AGENT_INTERNAL_SECNAME);    netsnmp_ds_register_premib(ASN_OCTET_STR, type, "iquerySecName",                               NETSNMP_DS_APPLICATION_ID,                               NETSNMP_DS_AGENT_INTERNAL_SECNAME);    snmpd_register_config_handler("iqueryVersion",                                   netsnmp_parse_iqueryVersion, NULL,                                   "1 | 2c | 3");    snmpd_register_config_handler("iquerySecLevel",                                   netsnmp_parse_iquerySecLevel, NULL,                                   "noAuthNoPriv | authNoPriv | authPriv");    /*     * Set defaults     */    netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,                       NETSNMP_DS_AGENT_INTERNAL_VERSION, SNMP_VERSION_3);    netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,                       NETSNMP_DS_AGENT_INTERNAL_SECLEVEL, SNMP_SEC_LEVEL_AUTHNOPRIV);    snmp_register_callback(SNMP_CALLBACK_LIBRARY,                            SNMP_CALLBACK_POST_PREMIB_READ_CONFIG,                           _init_default_iquery_session, NULL);}    /**************************     *     *  APIs to construct an "internal query" session     *     **************************/netsnmp_session *netsnmp_iquery_pdu_session(netsnmp_pdu* pdu) {    if (!pdu)       return NULL;    if (pdu->version == SNMP_VERSION_3)        return netsnmp_iquery_session( pdu->securityName,                            pdu->version,                           pdu->securityModel,                           pdu->securityLevel,                           pdu->securityEngineID,                           pdu->securityEngineIDLen);    else        return netsnmp_iquery_session( pdu->community,                            pdu->version,                           pdu->version+1,                           SNMP_SEC_LEVEL_NOAUTH,                           pdu->securityEngineID,                           pdu->securityEngineIDLen);}netsnmp_session *netsnmp_iquery_user_session(char* secName){    u_char eID[SNMP_MAXBUF_SMALL];    size_t elen = snmpv3_get_engineID(eID, sizeof(eID));    return netsnmp_iquery_session( secName,                            SNMP_VERSION_3,                           SNMP_SEC_MODEL_USM,                           SNMP_SEC_LEVEL_AUTHNOPRIV, eID, elen);}netsnmp_session *netsnmp_iquery_community_session( char* community, int version ) {     u_char eID[SNMP_MAXBUF_SMALL];    size_t elen = snmpv3_get_engineID(eID, sizeof(eID));    return netsnmp_iquery_session( community, version, version+1,                           SNMP_SEC_LEVEL_NOAUTH, eID, elen);}netsnmp_session *netsnmp_iquery_session(char* secName,   int   version,                                        int   secModel,  int   secLevel,                                       u_char* engineID, size_t engIDLen) {    /*     * This routine creates a completely new session every time.     * It might be worth keeping track of which 'secNames' already     * have iquery sessions created, and re-using the appropriate one.       */    extern int callback_master_num;    netsnmp_session *ss = NULL;#ifdef NETSNMP_TRANSPORT_CALLBACK_DOMAIN    ss = netsnmp_callback_open( callback_master_num, NULL, NULL, NULL);    if (ss) {        ss->version       = version;        ss->securityModel = secModel;        ss->securityLevel = secLevel;        memdup( &(ss->securityEngineID), engineID, engIDLen );        ss->securityEngineIDLen = engIDLen;        if ( version == SNMP_VERSION_3 ) {            memdup(&(ss->securityName), secName, strlen(secName));            ss->securityNameLen = strlen(secName);        } else {            memdup( &(ss->community), secName, strlen(secName));            ss->community_len = strlen(secName);        }    }#endif    return ss;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -