1 #include <net-snmp/net-snmp-config.h>
12 #include <net-snmp/net-snmp-includes.h>
13 #include <net-snmp/agent/net-snmp-agent-includes.h>
15 #include "snmpTargetAddrEntry.h"
16 #include "snmpTargetParamsEntry.h"
22 get_target_sessions(char *taglist, TargetFilterFunction * filterfunct,
25 netsnmp_session *ret = NULL, thissess;
26 struct targetAddrTable_struct *targaddrs;
27 char buf[SPRINT_MAX_LEN];
28 char tags[MAX_TAGS][SPRINT_MAX_LEN], *cp;
30 static struct targetParamTable_struct *param;
32 DEBUGMSGTL(("target_sessions", "looking for: %s\n", taglist));
33 for (cp = taglist; cp && numtags < MAX_TAGS;) {
34 cp = copy_nword(cp, tags[numtags], sizeof(tags[numtags]));
35 DEBUGMSGTL(("target_sessions", " for: %d=%s\n", numtags,
40 for (targaddrs = get_addrTable(); targaddrs;
41 targaddrs = targaddrs->next) {
46 if (targaddrs->tDomain == NULL ||
47 targaddrs->tAddress == NULL ||
48 targaddrs->rowStatus != SNMP_ROW_ACTIVE) {
49 DEBUGMSGTL(("target_sessions", " which is not ready yet\n"));
53 if (netsnmp_tdomain_support
54 (targaddrs->tDomain, targaddrs->tDomainLen, NULL, NULL) == 0) {
56 "unsupported domain for target address table entry %s\n",
61 * check tag list to see if we match
63 if (targaddrs->tagList) {
65 * loop through tag list looking for requested tags
67 for (cp = targaddrs->tagList; cp;) {
68 cp = copy_nword(cp, buf, sizeof(buf));
69 for (i = 0; i < numtags; i++) {
70 if (strcmp(buf, tags[i]) == 0) {
72 * found a valid target table entry
74 DEBUGMSGTL(("target_sessions", "found one: %s\n",
77 if (targaddrs->params) {
78 param = get_paramEntry(targaddrs->params);
80 || param->rowStatus != SNMP_ROW_ACTIVE) {
82 * parameter entry must exist and be active
88 * parameter entry must be specified
94 * last chance for caller to opt-out. Call
98 (*(filterfunct)) (targaddrs, param,
103 if (targaddrs->storageType != ST_READONLY &&
106 targaddrs->sessionCreationTime) {
108 * parameters have changed, nuke the old session
110 snmp_close(targaddrs->sess);
111 targaddrs->sess = NULL;
115 * target session already exists?
117 if (targaddrs->sess == NULL) {
119 * create an appropriate snmp session and add
120 * it to our return list
122 netsnmp_transport *t = NULL;
124 t = netsnmp_tdomain_transport_oid(targaddrs->
134 DEBUGMSGTL(("target_sessions",
136 DEBUGMSGOID(("target_sessions",
138 targaddrs->tDomainLen));
139 DEBUGMSG(("target_sessions", "\", \""));
140 DEBUGMSGHEX(("target_sessions",
142 targaddrs->tAddressLen));
143 DEBUGMSG(("target_sessions", "\n"));
147 t->f_fmtaddr(t, NULL, 0);
148 if (dst_str != NULL) {
149 DEBUGMSGTL(("target_sessions",
150 " to: %s\n", dst_str));
154 memset(&thissess, 0, sizeof(thissess));
155 thissess.timeout = (targaddrs->timeout) * 1000;
156 thissess.retries = targaddrs->retryCount;
157 DEBUGMSGTL(("target_sessions",
158 "timeout: %d -> %d\n",
162 if (param->mpModel == SNMP_VERSION_3 &&
163 param->secModel != 3) {
165 "unsupported model/secmodel combo for target %s\n",
170 netsnmp_transport_free(t);
173 thissess.version = param->mpModel;
174 if (param->mpModel == SNMP_VERSION_3) {
175 thissess.securityName = param->secName;
176 thissess.securityNameLen =
177 strlen(thissess.securityName);
178 thissess.securityLevel = param->secLevel;
181 (u_char *) strdup(param->secName);
182 thissess.community_len =
183 strlen((char *) thissess.community);
186 targaddrs->sess = snmp_add(&thissess, t,
188 targaddrs->sessionCreationTime = time(NULL);
190 if (targaddrs->sess) {
192 targaddrs->sess->next = ret;
194 ret = targaddrs->sess;
196 snmp_sess_perror("target session", &thissess);