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

📄 snmp_api.c

📁 snmp up 2
💻 C
📖 第 1 页 / 共 5 页
字号:
    snmp_res_lock(MT_LIBRARY_ID, MT_LIB_SESSION);    slp->next = Sessions;    Sessions = slp;    snmp_res_unlock(MT_LIBRARY_ID, MT_LIB_SESSION);    return (slp->session);}/* * extended open  */netsnmp_session *snmp_open_ex(netsnmp_session *session,             int (*fpre_parse)	(netsnmp_session *, netsnmp_transport *,                                void *, int),             int (*fparse)	(netsnmp_session *, netsnmp_pdu *, u_char *,				 size_t),	     int (*fpost_parse)	(netsnmp_session *, netsnmp_pdu *, int),             int (*fbuild)	(netsnmp_session *, netsnmp_pdu *, u_char *,				 size_t *),	     int (*frbuild)	(netsnmp_session *, netsnmp_pdu *,				 u_char **, size_t *, size_t *),             int (*fcheck)	(u_char *, size_t)	     ){    struct session_list *slp;    slp = (struct session_list *) snmp_sess_open(session);    if (!slp) {        return NULL;    }    slp->internal->hook_pre = fpre_parse;    slp->internal->hook_parse = fparse;    slp->internal->hook_post = fpost_parse;    slp->internal->hook_build = fbuild;    slp->internal->hook_realloc_build = frbuild;    slp->internal->check_packet = fcheck;    snmp_res_lock(MT_LIBRARY_ID, MT_LIB_SESSION);    slp->next = Sessions;    Sessions = slp;    snmp_res_unlock(MT_LIBRARY_ID, MT_LIB_SESSION);    return (slp->session);}static struct session_list *_sess_copy(netsnmp_session * in_session){    struct session_list *slp;    struct snmp_internal_session *isp;    netsnmp_session *session;    struct snmp_secmod_def *sptr;    char           *cp;    u_char         *ucp;    size_t          i;    in_session->s_snmp_errno = 0;    in_session->s_errno = 0;    /*     * Copy session structure and link into list      */    slp = (struct session_list *) calloc(1, sizeof(struct session_list));    if (slp == NULL) {        in_session->s_snmp_errno = SNMPERR_MALLOC;        return (NULL);    }    slp->transport = NULL;    isp = (struct snmp_internal_session *)calloc(1, sizeof(struct snmp_internal_session));    if (isp == NULL) {        snmp_sess_close(slp);        in_session->s_snmp_errno = SNMPERR_MALLOC;        return (NULL);    }    slp->internal = isp;    slp->session = (netsnmp_session *)malloc(sizeof(netsnmp_session));    if (slp->session == NULL) {        snmp_sess_close(slp);        in_session->s_snmp_errno = SNMPERR_MALLOC;        return (NULL);    }    memmove(slp->session, in_session, sizeof(netsnmp_session));    session = slp->session;    /*     * zero out pointers so if we have to free the session we wont free mem     * owned by in_session      */    session->peername = NULL;    session->community = NULL;    session->contextEngineID = NULL;    session->contextName = NULL;    session->securityEngineID = NULL;    session->securityName = NULL;    session->securityAuthProto = NULL;    session->securityPrivProto = NULL;    /*     * session now points to the new structure that still contains pointers to     * data allocated elsewhere.  Some of this data is copied to space malloc'd     * here, and the pointer replaced with the new one.     */    if (in_session->peername != NULL) {        session->peername = (char *)malloc(strlen(in_session->peername) + 1);        if (session->peername == NULL) {            snmp_sess_close(slp);            in_session->s_snmp_errno = SNMPERR_MALLOC;            return (NULL);        }        strcpy(session->peername, in_session->peername);    }    /*     * Fill in defaults if necessary      */    if (in_session->community_len != SNMP_DEFAULT_COMMUNITY_LEN) {        ucp = (u_char *) malloc(in_session->community_len);        if (ucp != NULL)            memmove(ucp, in_session->community, in_session->community_len);    } else {        if ((cp = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 					NETSNMP_DS_LIB_COMMUNITY)) != NULL) {            session->community_len = strlen(cp);            ucp = (u_char *) malloc(session->community_len);            if (ucp)                memmove(ucp, cp, session->community_len);        } else {#ifdef NO_ZEROLENGTH_COMMUNITY            session->community_len = strlen(DEFAULT_COMMUNITY);            ucp = (u_char *) malloc(session->community_len);            if (ucp)                memmove(ucp, DEFAULT_COMMUNITY, session->community_len);#else            ucp = (u_char *) strdup("");#endif        }    }    if (ucp == NULL) {        snmp_sess_close(slp);        in_session->s_snmp_errno = SNMPERR_MALLOC;        return (NULL);    }    session->community = ucp;   /* replace pointer with pointer to new data */    if (session->securityLevel <= 0) {        session->securityLevel =            netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_SECLEVEL);    }    if (session->securityLevel == 0)        session->securityLevel = SNMP_SEC_LEVEL_NOAUTH;    if (in_session->securityAuthProtoLen > 0) {        session->securityAuthProto =            snmp_duplicate_objid(in_session->securityAuthProto,                                 in_session->securityAuthProtoLen);        if (session->securityAuthProto == NULL) {            snmp_sess_close(slp);            in_session->s_snmp_errno = SNMPERR_MALLOC;            return (NULL);        }    } else if (get_default_authtype(&i) != NULL) {        session->securityAuthProto =            snmp_duplicate_objid(get_default_authtype(NULL), i);        session->securityAuthProtoLen = i;    }    if (in_session->securityPrivProtoLen > 0) {        session->securityPrivProto =            snmp_duplicate_objid(in_session->securityPrivProto,                                 in_session->securityPrivProtoLen);        if (session->securityPrivProto == NULL) {            snmp_sess_close(slp);            in_session->s_snmp_errno = SNMPERR_MALLOC;            return (NULL);        }    } else if (get_default_privtype(&i) != NULL) {        session->securityPrivProto =            snmp_duplicate_objid(get_default_privtype(NULL), i);        session->securityPrivProtoLen = i;    }    if (in_session->securityEngineIDLen > 0) {        ucp = (u_char *) malloc(in_session->securityEngineIDLen);        if (ucp == NULL) {            snmp_sess_close(slp);            in_session->s_snmp_errno = SNMPERR_MALLOC;            return (NULL);        }        memmove(ucp, in_session->securityEngineID,                in_session->securityEngineIDLen);        session->securityEngineID = ucp;    }    if (in_session->contextEngineIDLen > 0) {        ucp = (u_char *) malloc(in_session->contextEngineIDLen);        if (ucp == NULL) {            snmp_sess_close(slp);            in_session->s_snmp_errno = SNMPERR_MALLOC;            return (NULL);        }        memmove(ucp, in_session->contextEngineID,                in_session->contextEngineIDLen);        session->contextEngineID = ucp;    } else if (in_session->securityEngineIDLen > 0) {        /*         * default contextEngineID to securityEngineIDLen if defined          */        ucp = (u_char *) malloc(in_session->securityEngineIDLen);        if (ucp == NULL) {            snmp_sess_close(slp);            in_session->s_snmp_errno = SNMPERR_MALLOC;            return (NULL);        }        memmove(ucp, in_session->securityEngineID,                in_session->securityEngineIDLen);        session->contextEngineID = ucp;        session->contextEngineIDLen = in_session->securityEngineIDLen;    }    if (in_session->contextName) {        session->contextName = strdup(in_session->contextName);        if (session->contextName == NULL) {            snmp_sess_close(slp);            return (NULL);        }    } else if ((cp = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 					   NETSNMP_DS_LIB_CONTEXT)) != NULL) {        cp = strdup(cp);        if (cp == NULL) {            snmp_sess_close(slp);            return (NULL);        }        session->contextName = cp;        session->contextNameLen = strlen(cp);    } else {        cp = strdup(SNMP_DEFAULT_CONTEXT);        session->contextName = cp;        session->contextNameLen = strlen(cp);    }    if (in_session->securityName) {        session->securityName = strdup(in_session->securityName);        if (session->securityName == NULL) {            snmp_sess_close(slp);            return (NULL);        }    } else if ((cp = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 					   NETSNMP_DS_LIB_SECNAME)) != NULL) {        cp = strdup(cp);        if (cp == NULL) {            snmp_sess_close(slp);            return (NULL);        }        session->securityName = cp;        session->securityNameLen = strlen(cp);    }    if ((in_session->securityAuthKeyLen <= 0) &&        ((cp = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 				     NETSNMP_DS_LIB_AUTHPASSPHRASE)) ||         (cp = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 				     NETSNMP_DS_LIB_PASSPHRASE)))) {        session->securityAuthKeyLen = USM_AUTH_KU_LEN;        if (generate_Ku(session->securityAuthProto,                        session->securityAuthProtoLen,                        (u_char *) cp, strlen(cp),                        session->securityAuthKey,                        &session->securityAuthKeyLen) != SNMPERR_SUCCESS) {            snmp_set_detail                ("Error generating a key (Ku) from the supplied authentication pass phrase.");            snmp_sess_close(slp);            return NULL;        }    }    if ((in_session->securityPrivKeyLen <= 0) &&        ((cp = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 				     NETSNMP_DS_LIB_PRIVPASSPHRASE)) ||         (cp = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 				     NETSNMP_DS_LIB_PASSPHRASE)))) {        session->securityPrivKeyLen = USM_PRIV_KU_LEN;        if (generate_Ku(session->securityAuthProto,                        session->securityAuthProtoLen,                        (u_char *) cp, strlen(cp),                        session->securityPrivKey,                        &session->securityPrivKeyLen) != SNMPERR_SUCCESS) {            snmp_set_detail                ("Error generating a key (Ku) from the supplied privacy pass phrase.");            snmp_sess_close(slp);            return NULL;        }    }    if (session->retries == SNMP_DEFAULT_RETRIES)        session->retries = DEFAULT_RETRIES;    if (session->timeout == SNMP_DEFAULT_TIMEOUT)        session->timeout = DEFAULT_TIMEOUT;    session->sessid = snmp_get_next_sessid();    snmp_call_callbacks(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_SESSION_INIT,                        session);    if ((sptr = find_sec_mod(session->securityModel)) != NULL &&        sptr->session_open != NULL) {        /*         * security module specific inialization          */        (*sptr->session_open) (session);    }    return (slp);}static struct session_list *snmp_sess_copy(netsnmp_session * pss){    struct session_list *psl;    psl = _sess_copy(pss);    if (!psl) {        if (!pss->s_snmp_errno) {            pss->s_snmp_errno = SNMPERR_GENERR;        }        SET_SNMP_ERROR(pss->s_snmp_errno);    }    return psl;}intsnmpv3_engineID_probe(struct session_list *slp,                      netsnmp_session * in_session){    netsnmp_pdu    *pdu = NULL, *response = NULL;    netsnmp_session *session;    unsigned int    i;    int             status;    if (slp == NULL || slp->session == NULL) {        return 0;    }    session = slp->session;    /*     * If we are opening a V3 session and we don't know engineID we must probe     * it -- this must be done after the session is created and inserted in the     * list so that the response can handled correctly.      */    if ((session->flags & SNMP_FLAGS_DONT_PROBE) == SNMP_FLAGS_DONT_PROBE)        return 1;    if (session->version == SNMP_VERSION_3) {        if (session->securityEngineIDLen == 0) {            if (snmpv3_build_probe_pdu(&pdu) != 0) {                DEBUGMSGTL(("snmp_api", "unable to create probe PDU\n"));                return 0;            }            DEBUGMSGTL(("snmp_api", "probing for engineID...\n"));            status = snmp_sess_synch_response(slp, pdu, &response);            if ((response == NULL) && (status == STAT_SUCCESS)) {                status = STAT_ERROR;            }            switch (status) {            case STAT_SUCCESS:                in_session->s_snmp_errno = SNMPERR_INVALID_MSG; /* XX?? */                DEBUGMSGTL(("snmp_sess_open",                            "error: expected Report as response to probe: %s (%d)\n",                            snmp_errstring(response->errstat),                            response->errstat));                break;            case STAT_ERROR:   /* this is what we expected -> Report == STAT_ERROR */                in_session->s_snmp_errno = SNMPERR_UNKNOWN_ENG_ID;                break;            case STAT_TIMEOUT:                in_session->s_snmp_errno = SNMPERR_TIMEOUT;            default:                DEBUGMSGTL(("snmp_sess_open",                            "unable to connect with remote engine: %s (%d)\n",                            snmp_api_errstring(session->s_snmp_errno),                            session->s_snmp_errno));                break;            }            if (slp->session->securityEngineIDLen == 0) {                DEBUGMSGTL(("snmp_api",                            "unable to determine remote engine ID\n"));                return 0;            }            in_session->s_snmp_errno = SNMPERR_SUCCESS;            if (snmp_get_do_debugging()) {                DEBUGMSGTL(("snmp_sess_open",                            "  probe found engineID:  "));                for (i = 0; i < slp->session->securityEngineIDLen; i++)                    DEBUGMSG(("snmp_sess_open", "%02x",                              slp->session->securityEngineID[i]));                DEBUGMSG(("snmp_sess_open", "\n"));            }        }        /*         * if boot/time supplied set it for this engineID          */

⌨️ 快捷键说明

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