snmp_vars.c
来自「eCos操作系统源码」· C语言 代码 · 共 566 行 · 第 1/2 页
C
566 行
* int action; IN - RESERVE1, RESERVE2, COMMIT, or FREE * u_char *var_val; IN - input or output buffer space * u_char var_val_type; IN - type of input buffer * int var_val_len; IN - input and output buffer len * u_char *statP; IN - pointer to local statistic * oid *name IN - pointer to name requested * int name_len IN - number of sub-ids in the name */long long_return;#ifndef ibm032u_char return_buf[258]; #elseu_char return_buf[256]; /* nee 64 */#endifstruct timeval starttime;voidinit_agent (const char *app){ /* get current time (ie, the time the agent started) */ gettimeofday(&starttime, NULL); starttime.tv_sec--; starttime.tv_usec += 1000000L; /* we handle alarm signals ourselves in the select loop */ ds_set_boolean(DS_LIBRARY_ID, DS_LIB_ALARM_DONT_USE_SIG, 1);#ifdef CYGPKG_SNMPAGENT_V3_SUPPORT usm_set_reportErrorOnUnknownID(1);#endif#ifdef CAN_USE_NLIST init_kmem("/dev/kmem");#endif setup_tree(); init_agent_read_config(app);#ifdef TESTING auto_nlist_print_tree(-2, 0);#endif /* initialize agentx subagent if necessary. */#ifdef USING_AGENTX_SUBAGENT_MODULE if(ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_ROLE) == SUB_AGENT) subagent_pre_init();#endif} /* end init_agent() */oid nullOid[] = {0,0};int nullOidLen = sizeof(nullOid)/sizeof(oid);/* * getStatPtr - return a pointer to the named variable, as well as it's * type, length, and access control list. * Now uses 'search_subtree' (recursively) and 'search_subtree_vars' * to do most of the work * * If an exact match for the variable name exists, it is returned. If not, * and exact is false, the next variable lexicographically after the * requested one is returned. * * If no appropriate variable can be found, NULL is returned. */static int found;static u_char *search_subtree_vars(struct subtree *tp, oid *name, /* IN - name of var, OUT - name matched */ size_t *namelen, /* IN -number of sub-ids in name, OUT - subid-is in matched name */ u_char *type, /* OUT - type of matched variable */ size_t *len, /* OUT - length of matched variable */ u_short *acl, /* OUT - access control list */ int exact, /* IN - TRUE if exact match wanted */ WriteMethod **write_method, struct snmp_pdu *pdu, /* IN - relevant auth info re PDU */ int *noSuchObject){ register struct variable *vp; struct variable compat_var, *cvp = &compat_var; register int x; u_char *access = NULL; int result; oid *suffix; size_t suffixlen;#if MIB_CLIENTS_ARE_EVIL oid save[MAX_OID_LEN]; size_t savelen = 0;#endif if ( tp->variables == NULL ) return NULL; result = compare_tree(name, *namelen, tp->name, tp->namelen); suffixlen = *namelen - tp->namelen; suffix = name + tp->namelen; /* the following is part of the setup for the compatability structure below that has been moved out of the main loop. */ memcpy(cvp->name, tp->name, tp->namelen * sizeof(oid)); *noSuchObject = TRUE; /* In case of null variables_len */ for(x = 0, vp = tp->variables; x < tp->variables_len; vp =(struct variable *)((char *)vp +tp->variables_width), x++){ /* if exact and ALWAYS if next and result >= 0 */ /* and if vp->namelen != 0 -- Wes */ if (vp->namelen && (exact || result >= 0)){ result = compare_tree(suffix, suffixlen, vp->name, vp->namelen); } /* if exact and result == 0 if next and result <= 0 */ /* or if vp->namelen == 0 -- Wes */ if ((!exact && (result <= 0)) || (exact && (result == 0)) || vp->namelen == 0) { /* builds an old (long) style variable structure to retain compatability with var_* functions written previously. */ if (vp->namelen) memcpy((cvp->name + tp->namelen), vp->name, vp->namelen * sizeof(oid)); cvp->namelen = tp->namelen + vp->namelen; cvp->type = vp->type; cvp->magic = vp->magic; cvp->acl = vp->acl; cvp->findVar = vp->findVar; *write_method = NULL;#if MIB_CLIENTS_ARE_EVIL memcpy(save, name, *namelen*sizeof(oid)); savelen = *namelen;#endif DEBUGMSGTL(("snmp_vars", "Trying variable: ")); DEBUGMSGOID(("snmp_vars", cvp->name, cvp->namelen)); DEBUGMSG(("snmp_vars"," ...\n")); gaga: access = (*(vp->findVar))(cvp, name, namelen, exact, len, write_method); DEBUGMSGTL(("snmp_vars", "Returned %s\n", (access==NULL) ? "(null)" : "something" )); /* * Check that the answer is acceptable. * i.e. lies within the current subtree chunk * * It might be worth saving this answer just in * case it turns out to be valid, but for now * we'll simply discard it. */ if ( access && snmp_oid_compare(name, *namelen, tp->end, tp->end_len) > 0) { memcpy(name, tp->end, tp->end_len); access = 0; }#if MIB_CLIENTS_ARE_EVIL if (access == NULL) { if (snmp_oid_compare(name, *namelen, save, savelen) != 0) { DEBUGMSGTL(("snmp_vars", "evil_client: ")); DEBUGMSGOID(("snmp_vars", save, savelen)); DEBUGMSG(("snmp_vars"," =>")); DEBUGMSGOID(("snmp_vars", name, *namelen)); DEBUGMSG(("snmp_vars","\n")); memcpy(name, save, savelen*sizeof(oid)); *namelen = savelen; } }#endif if (*write_method) *acl = cvp->acl; /* check for permission to view this part of the OID tree */ if ((access != NULL || (*write_method != NULL && exact)) && in_a_view(name, namelen, pdu, cvp->type)) { if ( access && !exact ) { /* * We've got an answer, but shouldn't use it. * But we *might* be able to use a later * instance of the same object, so we can't * legitimately move on to the next variable * in the variable structure just yet. * Let's try re-calling the findVar routine * with the returned name, and see whether * the next answer is acceptable */ *write_method = NULL; goto gaga; } access = NULL; *write_method = NULL; } else if (exact){ found = TRUE; } if (access != NULL || (*write_method != NULL && exact)) break; } /* if exact and result <= 0 */ if (exact && (result <= 0)){ *type = cvp->type; *acl = cvp->acl; if (found) *noSuchObject = FALSE; else *noSuchObject = TRUE; return NULL; } } if (access != NULL || (exact && *write_method != NULL)) { *type = cvp->type; *acl = cvp->acl; return access; } return NULL;}u_char *getStatPtr( oid *name, /* IN - name of var, OUT - name matched */ size_t *namelen, /* IN -number of sub-ids in name, OUT - subid-is in matched name */ u_char *type, /* OUT - type of matched variable */ size_t *len, /* OUT - length of matched variable */ u_short *acl, /* OUT - access control list */ int exact, /* IN - TRUE if exact match wanted */ WriteMethod **write_method, struct snmp_pdu *pdu, /* IN - relevant auth info re PDU */ int *noSuchObject){ struct subtree *tp; oid save[MAX_OID_LEN]; size_t savelen = 0; u_char result_type; u_short result_acl; u_char *search_return=NULL; found = FALSE; if (!exact){ memcpy(save, name, *namelen * sizeof(oid)); savelen = *namelen; } *write_method = NULL; DEBUGMSGTL(("snmp_vars", "Looking for: ")); DEBUGMSGOID(("snmp_vars", name, *namelen)); DEBUGMSG(("snmp_vars"," ...\n")); tp = find_subtree(name, *namelen, NULL); while ( search_return == NULL && tp != NULL ) { DEBUGMSGTL(("snmp_vars", "Trying tree: ")); DEBUGMSGOID(("snmp_vars", tp->name, tp->namelen)); DEBUGMSG(("snmp_vars"," ...\n")); search_return = search_subtree_vars( tp, name, namelen, &result_type, len, &result_acl, exact, write_method, pdu, noSuchObject); if ( search_return != NULL || exact ) break; tp = tp->next; } if ( tp == NULL ) { if (!search_return && !exact){ memcpy(name, save, savelen * sizeof(oid)); *namelen = savelen; } if (found) *noSuchObject = FALSE; else *noSuchObject = TRUE; return NULL; } *type = result_type; *acl = result_acl; return search_return;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?