📄 snmp_api.c
字号:
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 + -