| #include <config.h> |
| |
| #if HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| #if HAVE_UNISTD_H |
| #include <unistd.h> |
| #endif |
| #if HAVE_FCNTL_H |
| #include <fcntl.h> |
| #endif |
| #include <signal.h> |
| #if TIME_WITH_SYS_TIME |
| # include <sys/time.h> |
| # include <time.h> |
| #else |
| # if HAVE_SYS_TIME_H |
| # include <sys/time.h> |
| # else |
| # include <time.h> |
| # endif |
| #endif |
| #if HAVE_MACHINE_PARAM_H |
| #include <machine/param.h> |
| #endif |
| #if HAVE_SYS_PARAM_H |
| #include <sys/param.h> |
| #endif |
| #if HAVE_SYS_VMMETER_H |
| #if !(defined(bsdi2) || defined(netbsd1)) |
| #include <sys/vmmeter.h> |
| #endif |
| #endif |
| #if HAVE_SYS_CONF_H |
| #include <sys/conf.h> |
| #endif |
| #if HAVE_ASM_PAGE_H |
| #include <asm/page.h> |
| #endif |
| #if HAVE_SYS_SWAP_H |
| #include <sys/swap.h> |
| #endif |
| #if HAVE_SYS_FS_H |
| #include <sys/fs.h> |
| #else |
| #if HAVE_UFS_FS_H |
| #include <ufs/fs.h> |
| #else |
| #ifdef HAVE_SYS_STAT_H |
| #include <sys/stat.h> |
| #endif |
| #ifdef HAVE_SYS_VNODE_H |
| #include <sys/vnode.h> |
| #endif |
| #ifdef HAVE_UFS_UFS_QUOTA_H |
| #include <ufs/ufs/quota.h> |
| #endif |
| #ifdef HAVE_UFS_UFS_INODE_H |
| #include <ufs/ufs/inode.h> |
| #endif |
| #if HAVE_UFS_FFS_FS_H |
| #include <ufs/ffs/fs.h> |
| #endif |
| #endif |
| #endif |
| #if HAVE_MTAB_H |
| #include <mtab.h> |
| #endif |
| #include <sys/stat.h> |
| #include <errno.h> |
| #if HAVE_FSTAB_H |
| #include <fstab.h> |
| #endif |
| #if HAVE_SYS_STATFS_H |
| #include <sys/statfs.h> |
| #endif |
| #if HAVE_SYS_STATVFS_H |
| #include <sys/statvfs.h> |
| #endif |
| #if HAVE_SYS_VFS_H |
| #include <sys/vfs.h> |
| #endif |
| #if (!defined(HAVE_STATVFS)) && defined(HAVE_STATFS) |
| #if HAVE_SYS_PARAM_H |
| #include <sys/param.h> |
| #endif |
| #if HAVE_SYS_MOUNT_H |
| #include <sys/mount.h> |
| #endif |
| #if HAVE_SYS_SYSCTL_H |
| #include <sys/sysctl.h> |
| #endif |
| #define statvfs statfs |
| #endif |
| #if HAVE_VM_VM_H |
| #include <vm/vm.h> |
| #endif |
| #if HAVE_VM_SWAP_PAGER_H |
| #include <vm/swap_pager.h> |
| #endif |
| #if HAVE_SYS_FIXPOINT_H |
| #include <sys/fixpoint.h> |
| #endif |
| #if HAVE_MALLOC_H |
| #include <malloc.h> |
| #endif |
| #if HAVE_STRING_H |
| #include <string.h> |
| #endif |
| |
| #if HAVE_DMALLOC_H |
| #include <dmalloc.h> |
| #endif |
| |
| #include "mibincl.h" |
| #include "struct.h" |
| #include "errormib.h" |
| #include "util_funcs.h" |
| #include "auto_nlist.h" |
| |
| static time_t errorstatustime=0; |
| static int errorstatusprior=0; |
| static char errorstring[STRMAX]; |
| |
| void |
| setPerrorstatus(const char *to) |
| { |
| char buf[STRMAX]; |
| |
| sprintf(buf,"%s: %s",to,strerror(errno)); |
| snmp_log_perror(to); |
| seterrorstatus(buf,5); |
| } |
| |
| void |
| seterrorstatus(const char *to, int prior) |
| { |
| if (errorstatusprior <= prior || |
| (ERRORTIMELENGTH < (time(NULL) - errorstatustime))) { |
| strcpy(errorstring,to); |
| errorstatusprior = prior; |
| errorstatustime = time(NULL); |
| } |
| } |
| |
| void init_errormib(void) |
| { |
| |
| /* define the structure we're going to ask the agent to register our |
| information at */ |
| struct variable2 extensible_error_variables[] = { |
| {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_errors, 1, {MIBINDEX}}, |
| {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_errors, 1, {ERRORNAME}}, |
| {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_errors, 1, {ERRORFLAG}}, |
| {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_errors, 1, {ERRORMSG}} |
| }; |
| |
| /* Define the OID pointer to the top of the mib tree that we're |
| registering underneath */ |
| oid extensible_error_variables_oid[] = { EXTENSIBLEMIB,ERRORMIBNUM }; |
| |
| /* register ourselves with the agent to handle our mib tree */ |
| REGISTER_MIB("ucd-snmp/errormib", extensible_error_variables, \ |
| variable2, extensible_error_variables_oid); |
| } |
| |
| /* |
| var_extensible_errors(... |
| 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 |
| |
| */ |
| u_char *var_extensible_errors(struct variable *vp, |
| oid *name, |
| size_t *length, |
| int exact, |
| size_t *var_len, |
| WriteMethod **write_method) |
| { |
| |
| static long long_ret; |
| static char errmsg[300]; |
| |
| |
| if (header_generic(vp,name,length,exact,var_len,write_method)) |
| return(NULL); |
| |
| errmsg[0] = 0; |
| |
| switch (vp->magic) { |
| case MIBINDEX: |
| long_ret = name[*length - 1]; |
| return((u_char *) (&long_ret)); |
| case ERRORNAME: |
| strcpy(errmsg,"snmp"); |
| *var_len = strlen(errmsg); |
| return((u_char *) errmsg); |
| case ERRORFLAG: |
| long_ret = (ERRORTIMELENGTH >= time(NULL)-errorstatustime) ? 1 : 0; |
| return((u_char *) (&long_ret)); |
| case ERRORMSG: |
| if ((ERRORTIMELENGTH >= time(NULL)-errorstatustime) ? 1 : 0) |
| strcpy(errmsg,errorstring); |
| else |
| errmsg[0] = 0; |
| *var_len = strlen(errmsg); |
| return((u_char *) errmsg); |
| } |
| return NULL; |
| } |
| |