📄 snmp_vars.c
字号:
* 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 ibm032
u_char return_buf[258];
#else
u_char return_buf[256]; /* nee 64 */
#endif
struct timeval starttime;
void
init_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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -