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

📄 hr_system.c

📁 ucd-snmp源代码
💻 C
字号:
/* *  Host Resources MIB - system group implementation - hr_system.c * */#include <config.h>#if HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#include "mibincl.h"#include "host.h"#include "host_res.h"#include "hr_system.h"#include "hr_utils.h"#include "auto_nlist.h"#include "../../../snmplib/system.h"#ifdef HAVE_SYS_PROC_H#include <sys/param.h>#include "sys/proc.h"#endif#if HAVE_UTMPX_H#include <utmpx.h>#else#include <utmp.h>#endif#ifdef linux#ifdef HAVE_LINUX_TASKS_H#include <linux/tasks.h>#else/*  If this file doesn't exist, then there is no hard limit on the number    of processes, so return 0 for hrSystemMaxProcesses.  */#define NR_TASKS	0#endif#endif#ifdef solaris2#include <sys/var.h>#endif#if defined(hpux10) || defined(hpux11)#include <sys/pstat.h>#endif#ifdef HAVE_SYS_SYSCTL_H#include <sys/sysctl.h>#endif#if !defined(UTMP_FILE) && defined(_PATH_UTMP)#define UTMP_FILE _PATH_UTMP#endif#if defined(UTMP_FILE) && !HAVE_UTMPX_Hvoid setutent (void);void endutent (void);struct utmp *getutent (void);#endif /* UTMP_FILE */	/*********************	 *	 *  Kernel & interface information,	 *   and internal forward declarations	 *	 *********************/static int get_load_dev (void);static int count_users (void);extern int count_processes (void);	/*********************	 *	 *  Initialisation & common implementation functions	 *	 *********************/#define	HRSYS_UPTIME		1#define	HRSYS_DATE		2#define	HRSYS_LOAD_DEV		3#define	HRSYS_LOAD_PARAM	4#define	HRSYS_USERS		5#define	HRSYS_PROCS		6#define	HRSYS_MAXPROCS		7struct variable2 hrsystem_variables[] = {    { HRSYS_UPTIME,     ASN_TIMETICKS, RONLY, var_hrsys, 1, {1}},    { HRSYS_DATE,       ASN_OCTET_STR, RONLY, var_hrsys, 1, {2}},    { HRSYS_LOAD_DEV,     ASN_INTEGER, RONLY, var_hrsys, 1, {3}},    { HRSYS_LOAD_PARAM, ASN_OCTET_STR, RONLY, var_hrsys, 1, {4}},    { HRSYS_USERS,          ASN_GAUGE, RONLY, var_hrsys, 1, {5}},    { HRSYS_PROCS,          ASN_GAUGE, RONLY, var_hrsys, 1, {6}},    { HRSYS_MAXPROCS,     ASN_INTEGER, RONLY, var_hrsys, 1, {7}}};oid hrsystem_variables_oid[] = { 1,3,6,1,2,1,25,1 };void init_hr_system(void){#ifdef NPROC_SYMBOL  auto_nlist(NPROC_SYMBOL,0,0);#endif    REGISTER_MIB("host/hr_system", hrsystem_variables, variable2, hrsystem_variables_oid);}/*  header_hrsys(...  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_hrsys(struct variable *vp,	     oid *name,	     size_t *length,	     int exact,	     size_t *var_len,	     WriteMethod **write_method){#define HRSYS_NAME_LENGTH	9    oid newname[MAX_OID_LEN];    int result;    DEBUGMSGTL(("host/hr_system", "var_hrsys: "));    DEBUGMSGOID(("host/hr_system", name, *length));    DEBUGMSG(("host/hr_system"," %d\n", exact));    memcpy( (char *)newname,(char *)vp->name, vp->namelen * sizeof(oid));    newname[HRSYS_NAME_LENGTH] = 0;    result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);    if ((exact && (result != 0)) || (!exact && (result >= 0)))        return(MATCH_FAILED);    memcpy( (char *)name,(char *)newname, (vp->namelen + 1) * sizeof(oid));    *length = vp->namelen + 1;    *write_method = 0;    *var_len = sizeof(long);	/* default to 'long' results */    return(MATCH_SUCCEEDED);}	/*********************	 *	 *  System specific implementation functions	 *	 *********************/u_char *var_hrsys(struct variable *vp,	  oid *name,	  size_t *length,	  int exact,	  size_t *var_len,	  WriteMethod **write_method){    static char string[100];    time_t	now;#if !defined(NR_TASKS) && !defined(solaris2) && !defined(hpux10) && !defined(hpux11)    int		nproc = 0;#endif#ifdef linux    FILE       *fp;#endif#if CAN_USE_SYSCTL && defined(CTL_KERN) && defined(KERN_MAXPROC)    static int maxproc_mib[] = { CTL_KERN, KERN_MAXPROC };    int buf_size;#endif#ifdef solaris2    struct var v;#endif#if defined(hpux10) || defined(hpux11)    struct pst_static pst_buf;#endif    if (header_hrsys(vp, name, length, exact, var_len, write_method) == MATCH_FAILED )	return NULL;    switch (vp->magic){	case HRSYS_UPTIME:	    long_return = get_uptime();	    return (u_char *)&long_return;	case HRSYS_DATE:	    (void*) time( &now );	    return (u_char *) date_n_time( &now, var_len );	case HRSYS_LOAD_DEV:	    long_return = get_load_dev();	    return (u_char *)&long_return;	case HRSYS_LOAD_PARAM:#ifdef linux	    fp = fopen("/proc/cmdline", "r");	    fgets( string, sizeof(string), fp);	    fclose(fp);#else#if NO_DUMMY_VALUES	    return NULL;#endif	    sprintf(string, "ask Dave");	/* XXX */#endif	    *var_len = strlen(string);	    return (u_char *) string;	case HRSYS_USERS:	    long_return = count_users();	    return (u_char *)&long_return;	case HRSYS_PROCS:#if USING_HOST_HR_SWRUN_MODULE	    long_return = count_processes();#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = 0;#endif	    return (u_char *)&long_return;	case HRSYS_MAXPROCS:#if defined(NR_TASKS)	    long_return = NR_TASKS;	/* <linux/tasks.h> */#elif CAN_USE_SYSCTL && defined(CTL_KERN) && defined(KERN_MAXPROC)	    buf_size = sizeof(nproc);	    if (sysctl(maxproc_mib, 2, &nproc, &buf_size, NULL, 0) < 0)		    return NULL;	    long_return = nproc;#elif defined(hpux10) || defined(hpux11)	    pstat_getstatic(&pst_buf, sizeof(struct pst_static), 1, 0);	    long_return = pst_buf.max_proc;#elif defined(NPROC_SYMBOL)	    auto_nlist(NPROC_SYMBOL, (char *)&nproc, sizeof (int));	    long_return = nproc;#elif defined(solaris2)	    getKstatRaw("unix", "var", sizeof v, &v);	    long_return = v.v_proc;#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = 0;#endif	    return (u_char *)&long_return;	default:	    DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrsys\n", vp->magic));    }    return NULL;}	/*********************	 *	 *  Internal implementation functions	 *	 *********************/		/*		 *  Return the DeviceIndex corresponding		 *   to the boot device		 */static int get_load_dev(void){     return (HRDEV_DISK<<HRDEV_TYPE_SHIFT);	/* XXX */}static int count_users(void){     int total=0;#if HAVE_UTMPX_H#define setutent setutxent#define getutent getutxent#define entutent entutxent     struct utmpx *utmp_p;#else     struct utmp *utmp_p;#endif     setutent();     while ( (utmp_p = getutent()) != NULL ) {#ifndef UTMP_HAS_NO_TYPE	if ( utmp_p->ut_type == USER_PROCESS )#endif	    ++total;     }     endutent();     return total;}#if defined(UTMP_FILE) && !HAVE_UTMPX_Hstatic FILE *utmp_file;static struct utmp utmp_rec;void setutent (void){	if (utmp_file) fclose(utmp_file);	utmp_file = fopen(UTMP_FILE, "r");}void endutent (void){	if (utmp_file) {		fclose(utmp_file);		utmp_file = NULL;	}}struct utmp *getutent (void){	if ( !utmp_file )	    return NULL;	while (fread(&utmp_rec, sizeof(utmp_rec), 1, utmp_file) == 1)	    if (*utmp_rec.ut_name && *utmp_rec.ut_line)		return &utmp_rec;	return NULL;}#endif /* UTMP_FILE */

⌨️ 快捷键说明

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