blob: 8c162e6dbd78888c0ae21175d2ef8cea58d15e4b [file] [log] [blame]
#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;
}