⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hr_device.c

📁 ucd-snmp源代码
💻 C
字号:
/* *  Host Resources MIB - Device group implementation - hr_device.c * */#include <config.h>#if HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#ifdef dynix#if HAVE_SYS_SELECT_H#include <sys/select.h>#endif#endif#include "host_res.h"#include "hr_device.h"	/*********************	 *	 *  Kernel & interface information,	 *   and internal forward declarations	 *	 *********************/int Get_Next_Device (void);PFV init_device[ HRDEV_TYPE_MAX ];PFIV next_device[ HRDEV_TYPE_MAX ];PFV save_device[ HRDEV_TYPE_MAX ];int dev_idx_inc[ HRDEV_TYPE_MAX ];PFS device_descr[ HRDEV_TYPE_MAX ];PFO device_prodid[ HRDEV_TYPE_MAX ];PFI device_status[ HRDEV_TYPE_MAX ];PFI device_errors[ HRDEV_TYPE_MAX ];int current_type;void Init_Device (void);int header_hrdevice (struct variable *,oid *, size_t *, int, size_t *, WriteMethod **);	/*********************	 *	 *  Initialisation & common implementation functions	 *	 *********************/#define	HRDEV_INDEX		1#define	HRDEV_TYPE		2#define	HRDEV_DESCR		3#define	HRDEV_ID		4#define	HRDEV_STATUS		5#define	HRDEV_ERRORS		6struct variable4 hrdevice_variables[] = {    { HRDEV_INDEX,     ASN_INTEGER, RONLY, var_hrdevice, 2, {1,1}},    { HRDEV_TYPE,    ASN_OBJECT_ID, RONLY, var_hrdevice, 2, {1,2}},    { HRDEV_DESCR,   ASN_OCTET_STR, RONLY, var_hrdevice, 2, {1,3}},    { HRDEV_ID,      ASN_OBJECT_ID, RONLY, var_hrdevice, 2, {1,4}},    { HRDEV_STATUS,    ASN_INTEGER, RONLY, var_hrdevice, 2, {1,5}},    { HRDEV_ERRORS,    ASN_COUNTER, RONLY, var_hrdevice, 2, {1,6}}};oid hrdevice_variables_oid[] = { 1,3,6,1,2,1,25,3,2 };void init_hr_device(void){    int i;		/*		 * Initially assume no devices		 *    Insert pointers to initialisation/get_next routines		 *    for particular device types as they are implemented		 *	(set up in the appropriate 'init_*()' routine )		 */    for ( i=0 ; i<HRDEV_TYPE_MAX ; ++i ) {	init_device[i]=NULL;	next_device[i]=NULL;	save_device[i]=NULL;	dev_idx_inc[i]=0;	/* Assume random indices */	device_descr[i]=NULL;	device_prodid[i]=NULL;	device_status[i]=NULL;	device_errors[i]=NULL;    }    REGISTER_MIB("host/hr_device", hrdevice_variables, variable4, hrdevice_variables_oid);}/*  header_hrdevice(...  Arguments:  vp	  IN      - pointer to variable entry that points here  name    IN/OUT  - IN/name requested, OUT/name found  length  IN/OUT  - length of IN/OUT oid's   exact   IN      - TRUE if an exact match was requested  var_len OUT     - length of variable or 0 if function returned  write_method  */intheader_hrdevice(struct variable *vp,		oid *name,		size_t *length,		int exact,		size_t *var_len,		WriteMethod **write_method){#define HRDEV_ENTRY_NAME_LENGTH	11    oid newname[MAX_OID_LEN];    int dev_idx, LowIndex=-1, LowType=-1;    int result;    DEBUGMSGTL(("host/hr_device","var_hrdevice: "));    DEBUGMSGOID(("host/hr_device", name, *length));    DEBUGMSG(("host/hr_device"," %d\n", exact));    memcpy( (char *)newname,(char *)vp->name, (int)vp->namelen * sizeof(oid));			/*	 	 *  Find the "next" device entry.		 *  If we're in the middle of the table, then there's		 *     no point in examining earlier types of devices,		 *     so set the starting type to that of the variable		 *     being queried.		 *  If we've moved from one column of the table to another,		 *     then we need to start at the beginning again.		 *     (i.e. the 'compare' fails to match)		 *  Similarly if we're at the start of the table		 *     (i.e. *length is too short to be a full instance)		 */    if (( snmp_oid_compare( vp->name, vp->namelen, name, vp->namelen ) == 0 ) &&	( *length > HRDEV_ENTRY_NAME_LENGTH ))        current_type = (name[HRDEV_ENTRY_NAME_LENGTH]>>HRDEV_TYPE_SHIFT);    else        current_type = 0;    Init_Device();    for ( ;; ) {        dev_idx = Get_Next_Device();        DEBUGMSG(("host/hr_device", "(index %d ....", dev_idx));        if ( dev_idx == -1 )	    break;	if ( LowType != -1 && LowType < (dev_idx>>HRDEV_TYPE_SHIFT))	    break;	newname[HRDEV_ENTRY_NAME_LENGTH] = dev_idx;    DEBUGMSGOID(("host/hr_device", newname, *length));    DEBUGMSG(("host/hr_device","\n"));        result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);        if (exact && (result == 0)) {	    if ( save_device[current_type] != NULL )		(*save_device[current_type])();	    LowIndex = dev_idx;            break;	}        if ((!exact && (result < 0)) &&		(LowIndex == -1 || dev_idx < LowIndex )) {	    if ( save_device[current_type] != NULL )		(*save_device[current_type])();	    LowIndex = dev_idx;	    LowType = (dev_idx>>HRDEV_TYPE_SHIFT);	    if (dev_idx_inc[ LowType ])		/* Increasing indices => now done */		break;        }            }    if ( LowIndex == -1 ) {        DEBUGMSGTL(("host/hr_device", "... index out of range\n"));        return(MATCH_FAILED);    }    newname[HRDEV_ENTRY_NAME_LENGTH] = LowIndex;    memcpy( (char *)name,(char *)newname, ((int)vp->namelen + 1) * sizeof(oid));    *length = vp->namelen + 1;    *write_method = 0;    *var_len = sizeof(long);	/* default to 'long' results */    DEBUGMSGTL(("host/hr_device", "... get device stats "));    DEBUGMSGOID(("host/hr_device", name, *length));    DEBUGMSG(("host/hr_device","\n"));    return LowIndex;}oid device_type_id[] = { 1,3,6,1,2,1, 25, 3, 1, 99 };		/* hrDeviceType99 */int device_type_len = sizeof(device_type_id)/sizeof(device_type_id[0]);	/*********************	 *	 *  System specific implementation functions	 *	 *********************/u_char *var_hrdevice(struct variable *vp,	     oid *name,	     size_t *length,	     int exact,	     size_t *var_len,	     WriteMethod **write_method){    int dev_idx, type;    oid *oid_p;    static char string[100];    dev_idx = header_hrdevice(vp, name, length, exact, var_len, write_method);    if ( dev_idx == MATCH_FAILED )	    return NULL;            type = (dev_idx>>HRDEV_TYPE_SHIFT);    switch (vp->magic){	case HRDEV_INDEX:	    long_return = dev_idx;	    return (u_char *)&long_return;	case HRDEV_TYPE:	    device_type_id[device_type_len-1] = type;            *var_len = sizeof(device_type_id);	    return (u_char *)device_type_id;	case HRDEV_DESCR:	    if ( device_descr[ type ] != NULL )        	strcpy(string, ((*device_descr[type])(dev_idx)) );	    else#if NO_DUMMY_VALUES		return NULL;#else	        sprintf(string, "a black box of some sort");#endif	    *var_len = strlen(string);	    return (u_char *) string;	case HRDEV_ID:	    if ( device_prodid[ type ] != NULL )        	oid_p = ((*device_prodid[type])(dev_idx, var_len));	    else {	        oid_p = nullOid;                *var_len = nullOidLen;	    }	    return (u_char *) oid_p;	case HRDEV_STATUS:	    if ( device_status[ type ] != NULL )        	long_return = ((*device_status[type])(dev_idx));	    else#if NO_DUMMY_VALUES		return NULL;#else	        long_return = 2;	/* Assume running */#endif	    return (u_char *)&long_return;	case HRDEV_ERRORS:	    if ( device_errors[ type ] != NULL )        	long_return = (*device_errors[type])(dev_idx);	    else#if NO_DUMMY_VALUES		return NULL;#else	        long_return = 0;	/* Assume OK */#endif	    return (u_char *)&long_return;	default:	    DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrdevice\n", vp->magic));    }    return NULL;}	/*********************	 *	 *  Internal implementation functions	 *	 *********************/voidInit_Device (void){		/*		 *  Find the first non-NULL initialisation function		 *    and call it		 */    while ( current_type < HRDEV_TYPE_MAX &&            init_device[ current_type ] == NULL )	if ( ++current_type >= HRDEV_TYPE_MAX)	    return;    (*init_device[current_type]) ();}intGet_Next_Device (void){    int result = -1;		/*		 *  Call the 'next device' function for the current		 *    type of device		 *		 *  TODO:  save the necessary information about that device		 */    if ( current_type < HRDEV_TYPE_MAX && next_device[ current_type ] != NULL )        result = (*next_device[current_type]) ();		/*		 *  No more devices of the current type.		 *  Try the next type (if any)		 */    if ( result == -1 ) {	if (++current_type >= HRDEV_TYPE_MAX ) {	    current_type=0;	    return -1 ;	}	Init_Device();	return Get_Next_Device();    }        return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -