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

📄 vm_grp.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic  char    *sccsid = "@(#)vm_grp.c	4.1  (ULTRIX)        7/17/90";#endif lint/* *  This file contains specific utilities encompassing *  lookup of MIB variables found in the our "special" group. *  The example illustrates a managed object that has no *  instances (i.e. instance always 0).  Our special group is *  chosen to be sort of something from the vm. */#include "defs.h"#include <errno.h>#include <sys/vmmeter.h>#include <nlist.h>#include <syslog.h>#include "vmdef.h"#define	VMDESCR	"ULTRIX Virtual Memory"extern	int trace;extern	int debug;extern	struct nlist nl[];extern	char *community;extern	struct snmpareg construct_oid();/* * My special MIB:  (these info can also be obtained using vmstat utility) * iso org(3) dod(6) internet(1) private(4) enterprise (1) YOU(15) me(1) .. * *			vm(1) .. *	INT		vmTotalVM(1)		1.3.6.1.4.1.15.1.1.1 *	STR		vmDescr(2)		1.3.6.1.4.1.15.1.1.2 *	OBJ		vmMyObjectID(3)			" *	IPADDR		vmMyIPAddr(5) *	CNTR		vmAddrXLateFault(6) *	GAUGE		vmFreeMemPages(7) *	TIME		vmCurrentTime(8) */unsigned long Vm_Var[] = {		/* vm */	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01};unsigned long Vm_TotalVM[] = {	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01, 0x01};unsigned long Vm_Descr[] = {	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01, 0x02};unsigned long Vm_MyObjectID[] = {	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01, 0x03};unsigned long Vm_MyIPAddr[] = {	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01, 0x05};unsigned long Vm_AddrXLateFault[] = {	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01, 0x06};unsigned long Vm_FreeMemPages[] = {	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01, 0x07};unsigned long Vm_CurrentTime[] = {	0x01, 0x03, 0x06, 0x01, 0x04, 0x01, 0x0f, 0x01, 0x01, 0x08};/* * This routine returns a vm mib variable to snmpd. */ret_vm(reqoid)objident	*reqoid;{	struct	snmparspdat rsp;	objident oid;	int	attrtag, error;	u_long	*p;	u_long	reqmet;			/* request met */	char	reqmetstr[SNMPSTRLEN];	/* request met */	p = reqoid->cmp;	p += VM_VAR_SIZE;		/* Point to attr. tag */	attrtag = *p++;	bzero(reqmetstr, sizeof(reqmetstr));	switch (attrtag) {	case VM_TOTALVM:		if (get_vmstat(attrtag, &reqmet) != 0) {			error = BADVAL;			break;		}		if (trace|debug) printf("MIB: vm_TotalVM: %lu\n", reqmet);		rsp.type = INT;		rsp.octets = sizeof(reqmet);		rsp.rspdat = (char *)malloc(sizeof(reqmet));		*(u_long *)rsp.rspdat = reqmet;		if (snmpextrespond(reqoid, NULL, &rsp) != GENSUC) {			syslog(LOG_ERR,"vm_grp: respond failed");			if (debug) printf("vm_grp: respond failed\n");			error = GENERRS;			break;		}		free(rsp.rspdat);		return(0);	case VM_DESCR:		if (get_vmstat(attrtag, reqmetstr) != 0) {			error = BADVAL;			break;		}		if (trace|debug) printf("MIB: vm_Descr: %s\n", reqmetstr);		rsp.type = STR;		rsp.octets = strlen(reqmetstr);		rsp.rspdat = (char *)malloc(strlen(reqmetstr));		bcopy(reqmetstr, rsp.rspdat, strlen(reqmetstr)+1);   /* '\0' */		if (snmpextrespond(reqoid, NULL, &rsp) != GENSUC) {			syslog(LOG_ERR,"vm_grp: respond failed");			if (debug) printf("vm_grp: respond failed\n");			error = BADVAL;			break;		}		free(rsp.rspdat);		return(0);	case VM_MYOBJECTID:		if (get_vmstat(attrtag, &oid) != 0) {			error = BADVAL;			break;		}		if (trace|debug) {			printf("MIB: vm_MyObjectID: ");			proid(&oid);		}		rsp.type = OBJ;		rsp.octets = oid.ncmp*sizeof(u_long);		rsp.rspdat = (char *)malloc(strlen(reqmetstr));		bcopy(&oid, rsp.rspdat, oid.ncmp*sizeof(u_long));		if (snmpextrespond(reqoid, NULL, &rsp) != GENSUC) {			syslog(LOG_ERR,"vm_grp: respond failed");			if (debug) printf("vm_grp: respond failed\n");			error = GENERRS;			break;		}		free(rsp.rspdat);		return(0);	case VM_MYIPADDR:		if (get_vmstat(attrtag, &reqmet) != 0) {			error = BADVAL;			break;		}		if (trace|debug) printf("MIB: vm_MyIPAddr: %s\n",					 inet_ntoa(reqmet));		rsp.type = IPADD;		rsp.octets = sizeof(struct in_addr);		rsp.rspdat = (char *)malloc(sizeof(struct in_addr));		bcopy(&reqmet, rsp.rspdat, sizeof(struct in_addr));		if (snmpextrespond(reqoid, NULL, &rsp) != GENSUC) {			syslog(LOG_ERR,"vm_grp: respond failed");			if (debug) printf("vm_grp: respond failed\n");			error = GENERRS;			break;		}		free(rsp.rspdat);		return(0);	case VM_ADDRXLATEFAULT:		if (get_vmstat(attrtag, &reqmet) != 0) {			error = BADVAL;			break;		}		if (trace|debug) printf("MIB: vm_AddrXLateFault: %lu\n",					 reqmet);		rsp.type = CNTR;		rsp.octets = sizeof(int);		rsp.rspdat = (char *)malloc(sizeof(reqmet));		*(u_long *)rsp.rspdat = reqmet;		if (snmpextrespond(reqoid, NULL, &rsp) != GENSUC) {			syslog(LOG_ERR,"vm_grp: respond failed");			if (debug) printf("vm_grp: respond failed\n");			error = GENERRS;		}		free(rsp.rspdat);		return(0);	case VM_FREEMEMPAGES:		if (get_vmstat(attrtag, &reqmet) != 0) {			error = BADVAL;			break;		}		if (trace|debug) printf("MIB: vm_FreeMemPages: %lu\n", reqmet);		rsp.type = GAUGE;		rsp.octets = sizeof(int);		rsp.rspdat = (char *)malloc(sizeof(reqmet));		*(u_long *)rsp.rspdat = reqmet;		if (snmpextrespond(reqoid, NULL, &rsp) != GENSUC) {			syslog(LOG_ERR,"vm_grp: respond failed");			if (debug) printf("vm_grp: respond failed\n");			error = GENERRS;			break;		}		free(rsp.rspdat);		return(0);	case VM_CURRENTTIME:		if (get_vmstat(attrtag, &reqmet) != 0) {			error = BADVAL;			break;		}		if (trace|debug) printf("MIB: vm_FreeMemPages: %lu\n", reqmet);		rsp.type = TIME;		rsp.octets = sizeof(int);		rsp.rspdat = (char *)malloc(sizeof(reqmet));		*(u_long *)rsp.rspdat = reqmet;		if (snmpextrespond(reqoid, NULL, &rsp) != GENSUC) {			syslog(LOG_ERR,"vm_grp: respond failed");			if (debug) printf("vm_grp: respond failed\n");			error = GENERRS;			break;		}		free(rsp.rspdat);		return(0);	default:		/*		 * Log the error and respond to snmpd with an error.		 */		syslog(LOG_ERR, "vm_grp: invalid MIB reqest attribute");		if (debug) printf("vm_grp: invalid MIB req attr (tag=%d)\n",				   attrtag);		(void) snmpexterror(NOSUCH);		return(-1);	} /* switch */	/*	 * Got here if failure encountered during the case processing.	 */	(void) snmpexterror(error);	free(rsp.rspdat);	return(-1);}/* * Return the requested variable. */get_vmstat(attr, var)int attr;char *var;{	struct	vmmeter sum;	struct	vmtotal total;	struct	hostent *hp;	int	mf;	time_t	t;	char	hostname[80];	mf = open("/dev/kmem", 0);	if (mf < 0) {		syslog(LOG_ERR, "get_vmstat: can't open /dev/kmem");		if (debug) printf("get_vmstat: can't open /dev/kmem\n");		return(-1);	}	if (lseek(mf, (long)nl[X_SUM].n_value, 0) == -1) {		syslog(LOG_ERR, "get_vmstat: lseek: %m");		if (debug) perror("get_vmstat: lseek");		return(-1);	}	if (read(mf, &sum, sizeof(sum)) <= 0) {		syslog(LOG_ERR, "get_vmstat: read: %m");		if (debug) perror("get_vmstat: read");		return(-1);	}	if (lseek(mf, (long)nl[X_TOTAL].n_value, 0) == -1) {		syslog(LOG_ERR, "get_vmstat: lseek: %m");		if (debug) perror("get_vmstat: lseek");		return(-1);	}	if (read(mf, &total, sizeof(total)) <= 0) {		syslog(LOG_ERR, "get_vmstat: read: %m");		if (debug) perror("get_vmstat: read");		return(-1);	}	(void) close(mf);	switch (attr) {	case VM_TOTALVM:		bcopy(&total.t_vm, var, sizeof(int));		break;	case VM_DESCR:		bcopy(VMDESCR, var, strlen(VMDESCR));		break;	case VM_MYOBJECTID:		*(u_long *)var = VM_SIZE;		bcopy(Vm_MyObjectID, var+4, VM_SIZE*sizeof(u_long));		break;	case VM_MYIPADDR:		(void)gethostname(hostname, 80);		if ((hp = gethostbyname(hostname)) == NULL) {			if (debug) printf("get_vmstat: can't get host\n");			return(-1);		}		bcopy(hp->h_addr, var, hp->h_length);		break;	case VM_ADDRXLATEFAULT:		bcopy(&sum.v_faults, var, sizeof(long)); 		break;	case VM_FREEMEMPAGES:		bcopy(&total.t_free, var, sizeof(long));		break;	case VM_CURRENTTIME:		if ((t = time(0)) < 0) {			if (debug) printf("get_vmstat: can't get time\n");			return(-1);		}		bcopy(&t, var, sizeof(int));		break;	}	return(0);}/* * This routine registers the vm group to the snmpd. */register_vm(){	register int	e = -1;	if (reg_oid(Vm_TotalVM, VM_SIZE, OIDTYP_NULLINST) == e) return(e);	if (reg_oid(Vm_Descr, VM_SIZE, OIDTYP_NULLINST) == e) return(e);	if (reg_oid(Vm_MyObjectID, VM_SIZE, OIDTYP_NULLINST) == e) return(e);	if (reg_oid(Vm_MyIPAddr, VM_SIZE, OIDTYP_NULLINST) == e) return(e);	if (reg_oid(Vm_AddrXLateFault,VM_SIZE,OIDTYP_NULLINST) == e) return(e);	if (reg_oid(Vm_FreeMemPages, VM_SIZE, OIDTYP_NULLINST) == e) return(e);	if (reg_oid(Vm_CurrentTime, VM_SIZE, OIDTYP_NULLINST) == e) return(e);	return(0);}

⌨️ 快捷键说明

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