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 + -
显示快捷键?