#include "plugin.h"
#include "configfile.h"
-#define MODULE_NAME "irq"
-
#if KERNEL_LINUX
# define IRQ_HAVE_READ 1
#else
/*
* (Module-)Global variables
*/
-static char *irq_file = "irq-%s.rrd";
-
-static char *config_keys[] =
+#if IRQ_HAVE_READ
+static const char *config_keys[] =
{
"Irq",
- "IgnoreSelected",
- NULL
-};
-static int config_keys_num = 2;
-
-static char *ds_def[] =
-{
- "DS:irq:COUNTER:"COLLECTD_HEARTBEAT":0:U",
- NULL
+ "IgnoreSelected"
};
-static int ds_num = 1;
+static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
static unsigned int *irq_list;
static unsigned int irq_list_num;
-static int base = 10;
-
/*
* irq_list_action:
* 0 => default is to collect selected irqs
*/
static int irq_list_action;
-static int irq_config (char *key, char *value)
+static int irq_config (const char *key, const char *value)
{
- unsigned int *temp;
- unsigned int irq;
- char *endptr;
-
if (strcasecmp (key, "Irq") == 0)
{
+ unsigned int *temp;
+ unsigned int irq;
+ char *endptr;
+
temp = (unsigned int *) realloc (irq_list, (irq_list_num + 1) * sizeof (unsigned int *));
if (temp == NULL)
{
- syslog (LOG_EMERG, "Cannot allocate more memory.");
+ fprintf (stderr, "irq plugin: Cannot allocate more memory.\n");
+ ERROR ("irq plugin: Cannot allocate more memory.");
return (1);
}
irq_list = temp;
- irq = strtol(value, &endptr, base);
+ /* Clear errno, because we need it to see if an error occured. */
+ errno = 0;
- if (endptr == value ||
- (errno == ERANGE && (irq == LONG_MAX || irq == LONG_MIN)) ||
- (errno != 0 && irq == 0))
+ irq = strtol(value, &endptr, 10);
+ if ((endptr == value) || (errno != 0))
{
- syslog (LOG_EMERG, "Irq value is not a number.");
+ fprintf (stderr, "irq plugin: Irq value is not a "
+ "number: `%s'\n", value);
+ ERROR ("irq plugin: Irq value is not a "
+ "number: `%s'", value);
return (1);
}
irq_list[irq_list_num] = irq;
return (1 - irq_list_action);
}
-static void irq_write (char *host, char *inst, char *value)
+static void irq_submit (unsigned int irq, counter_t value)
{
- char file[BUFSIZE];
+ value_t values[1];
+ value_list_t vl = VALUE_LIST_INIT;
int status;
- if (check_ignore_irq (atoi(inst)))
- return;
-
- status = snprintf (file, BUFSIZE, irq_file, inst);
- if (status < 1)
- return;
- else if (status >= BUFSIZE)
- return;
-
- rrd_update_file (host, file, value, ds_def, ds_num);
-}
-
-#if IRQ_HAVE_READ
-static void irq_submit (unsigned int irq, unsigned int value, char *devices)
-{
- char buf[BUFSIZE];
- char desc[BUFSIZE];
- int status;
-
if (check_ignore_irq (irq))
return;
- status = snprintf (buf, BUFSIZE, "%u:%u",
- (unsigned int) curtime, value);
-
- if ((status >= BUFSIZE) || (status < 1))
- return;
+ values[0].counter = value;
- status = snprintf (desc, BUFSIZE, "%d-%s", irq, devices);
+ vl.values = values;
+ vl.values_len = 1;
+ vl.time = time (NULL);
+ strcpy (vl.host, hostname_g);
+ strcpy (vl.plugin, "irq");
- if ((status >= BUFSIZE) || (status < 1))
+ status = snprintf (vl.type_instance, sizeof (vl.type_instance),
+ "%u", irq);
+ if ((status < 1) || (status >= sizeof (vl.type_instance)))
return;
- plugin_submit (MODULE_NAME, desc, buf);
-}
+ plugin_dispatch_values ("irq", &vl);
+} /* void irq_submit */
-static void irq_read (void)
+static int irq_read (void)
{
#if KERNEL_LINUX
unsigned int irq;
unsigned int irq_value;
long value;
- char *ptr, *endptr;
+ char *endptr;
+ int i;
+
+ char *fields[64];
+ int fields_num;
if ((fh = fopen ("/proc/interrupts", "r")) == NULL)
{
- syslog (LOG_WARNING, "irq: fopen: %s", strerror (errno));
- return;
+ char errbuf[1024];
+ WARNING ("irq plugin: fopen (/proc/interrupts): %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ return (-1);
}
while (fgets (buffer, BUFSIZE, fh) != NULL)
{
- errno = 0; /* To distinguish success/failure after call */
- irq = strtol(buffer, &endptr, base);
-
- if (endptr == buffer ||
- (errno == ERANGE && (irq == LONG_MAX || irq == LONG_MIN)) ||
- (errno != 0 && irq == 0)) continue;
+ fields_num = strsplit (buffer, fields, 64);
+ if (fields_num < 2)
+ continue;
- if (*endptr != ':') continue;
+ errno = 0; /* To distinguish success/failure after call */
+ irq = strtol (fields[0], &endptr, 10);
- ptr = ++endptr;
+ if ((endptr == fields[0]) || (errno != 0) || (*endptr != ':'))
+ continue;
irq_value = 0;
- /* sum irq's for all CPUs */
- while (1)
+ for (i = 1; i < fields_num; i++)
{
errno = 0;
- value = strtol(ptr, &endptr, base);
+ value = strtol (fields[i], &endptr, 10);
- if (endptr == ptr ||
- (errno == ERANGE &&
- (value == LONG_MAX || value == LONG_MIN)) ||
- (errno != 0 && value == 0)) break;
+ if ((*endptr != '\0') || (errno != 0))
+ break;
irq_value += value;
- ptr = endptr;
- }
- while (*ptr == ' ') ptr++;
- while (*ptr && *ptr != ' ') ptr++;
- while (*ptr == ' ') ptr++;
-
- if (!*ptr) continue;
+ } /* for (i) */
- endptr = ptr;
-
- while (*(++endptr))
- if (!isalnum(*endptr)) *endptr='_';
-
- ptr[strlen(ptr)-1] = '\0';
-
- irq_submit (irq, irq_value, ptr);
+ irq_submit (irq, irq_value);
}
fclose (fh);
#endif /* KERNEL_LINUX */
-}
-#else
-#define irq_read NULL
+
+ return (0);
+} /* int irq_read */
#endif /* IRQ_HAVE_READ */
void module_register (void)
{
- plugin_register (MODULE_NAME, NULL, irq_read, irq_write);
- cf_register (MODULE_NAME, irq_config, config_keys, config_keys_num);
-}
+#if IRQ_HAVE_READ
+ plugin_register_config ("irq", irq_config,
+ config_keys, config_keys_num);
+ plugin_register_read ("irq", irq_read);
+#endif /* IRQ_HAVE_READ */
+} /* void module_register */
#undef BUFSIZE
-#undef MODULE_NAME