blob: 12c61a70992289ac51aaabac6352a292523d168c [file] [log] [blame]
/* $Header: /cvsroot/watchdog/watchdog/src/load.c,v 1.2 2006/07/31 09:39:23 meskes Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "extern.h"
#include "watch_err.h"
#if USE_SYSLOG
#include <syslog.h>
#endif
int check_load(void)
{
int avg1, avg5, avg15;
char buf[40], *ptr;
/* is the load average file open? */
if (load == -1 || maxload1 == 0 || maxload5 == 0 || maxload15 == 0)
return (ENOERR);
/* position pointer at start of file */
if (lseek(load, 0, SEEK_SET) < 0) {
int err = errno;
#if USE_SYSLOG
syslog(LOG_ERR, "lseek /proc/loadavg gave errno = %d = '%m'", err);
#else /* USE_SYSLOG */
perror(progname);
#endif /* USE_SYSLOG */
if (softboot)
return (err);
return (ENOERR);
}
/* read the line (there is only one) */
if (read(load, buf, sizeof(buf)) < 0) {
int err = errno;
#if USE_SYSLOG
syslog(LOG_ERR, "read /proc/loadavg gave errno = %d = '%m'", err);
#else /* USE_SYSLOG */
perror(progname);
#endif /* USE_SYSLOG */
if (softboot)
return (err);
return (ENOERR);
}
/* we only care about integer values */
avg1 = atoi(buf);
/* if we have incorrect data we might not be able to find */
/* the blanks we're looking for */
ptr = strchr(buf, ' ');
if (ptr != NULL) {
avg5 = atoi(ptr);
ptr = strchr(ptr + 1, ' ');
}
if (ptr != NULL)
avg15 = atoi(ptr);
else {
#if USE_SYSLOG
syslog(LOG_ERR, "/proc/loadavg does not contain any data (read = %s)", buf);
#else /* USE_SYSLOG */
perror(progname);
#endif /* USE_SYSLOG */
if (softboot)
return (ENOLOAD);
return (ENOERR);
}
#if USE_SYSLOG
if (verbose && logtick && ticker == 1)
syslog(LOG_INFO, "current load is %d %d %d", avg1, avg5, avg15);
#endif /* USE_SYSLOG */
if (avg1 > maxload1 || avg5 > maxload5 || avg15 > maxload15) {
#if USE_SYSLOG
syslog(LOG_ERR, "loadavg %d %d %d is higher than the given threshold %d %d %d!", avg1, avg5, avg15,
maxload1, maxload5, maxload15);
#endif /* USE_SYSLOG */
return (EMAXLOAD);
}
return (ENOERR);
}