From: Benjamin Drung Date: Tue, 27 Oct 2015 09:23:46 +0000 (+0100) Subject: Add utils_ignorelist back to daemon (#1323) X-Git-Tag: collectd-5.5.1~49 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=817e080279469498c446bff54dbc7e0633cb238c;p=collectd.git Add utils_ignorelist back to daemon (#1323) commit 216c6246b73645ac093de15b87aedc9abc6ebc80 moves the collectd daemon files into the src/daemon/ directory, but also silently drops utils_ignorelist. Dropping utils_ignorelist from the daemon has the drawback that it cannot be used by plugins any more and that 16 plugins need to bundle ignorelist. Thus add utils_ignorelist back to the collectd daemon. --- diff --git a/src/Makefile.am b/src/Makefile.am index 07ffdda9..effa3f8c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -190,8 +190,7 @@ endif if BUILD_PLUGIN_CGROUPS pkglib_LTLIBRARIES += cgroups.la -cgroups_la_SOURCES = cgroups.c \ - utils_ignorelist.c utils_ignorelist.h +cgroups_la_SOURCES = cgroups.c cgroups_la_LDFLAGS = $(PLUGIN_LDFLAGS) cgroups_la_LIBADD = libmount.la endif @@ -290,16 +289,14 @@ endif if BUILD_PLUGIN_DF pkglib_LTLIBRARIES += df.la -df_la_SOURCES = df.c \ - utils_ignorelist.c utils_ignorelist.h +df_la_SOURCES = df.c df_la_LDFLAGS = $(PLUGIN_LDFLAGS) df_la_LIBADD = libmount.la endif if BUILD_PLUGIN_DISK pkglib_LTLIBRARIES += disk.la -disk_la_SOURCES = disk.c \ - utils_ignorelist.c utils_ignorelist.h +disk_la_SOURCES = disk.c disk_la_CFLAGS = $(AM_CFLAGS) disk_la_LDFLAGS = $(PLUGIN_LDFLAGS) disk_la_LIBADD = @@ -399,8 +396,7 @@ endif if BUILD_PLUGIN_INTERFACE pkglib_LTLIBRARIES += interface.la -interface_la_SOURCES = interface.c \ - utils_ignorelist.c utils_ignorelist.h +interface_la_SOURCES = interface.c interface_la_CFLAGS = $(AM_CFLAGS) interface_la_LDFLAGS = $(PLUGIN_LDFLAGS) interface_la_LIBADD = @@ -437,8 +433,7 @@ endif if BUILD_PLUGIN_IPMI pkglib_LTLIBRARIES += ipmi.la -ipmi_la_SOURCES = ipmi.c \ - utils_ignorelist.c utils_ignorelist.h +ipmi_la_SOURCES = ipmi.c ipmi_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_OPENIPMI_CFLAGS) ipmi_la_LDFLAGS = $(PLUGIN_LDFLAGS) ipmi_la_LIBADD = $(BUILD_WITH_OPENIPMI_LIBS) @@ -455,8 +450,7 @@ endif if BUILD_PLUGIN_IRQ pkglib_LTLIBRARIES += irq.la -irq_la_SOURCES = irq.c \ - utils_ignorelist.c utils_ignorelist.h +irq_la_SOURCES = irq.c irq_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif @@ -515,8 +509,7 @@ endif if BUILD_PLUGIN_MADWIFI pkglib_LTLIBRARIES += madwifi.la -madwifi_la_SOURCES = madwifi.c madwifi.h \ - utils_ignorelist.c utils_ignorelist.h +madwifi_la_SOURCES = madwifi.c madwifi.h madwifi_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif @@ -562,8 +555,7 @@ endif if BUILD_PLUGIN_MD pkglib_LTLIBRARIES += md.la -md_la_SOURCES = md.c \ - utils_ignorelist.c utils_ignorelist.h +md_la_SOURCES = md.c md_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif @@ -608,8 +600,7 @@ endif if BUILD_PLUGIN_MIC pkglib_LTLIBRARIES += mic.la -mic_la_SOURCES = mic.c \ - utils_ignorelist.c utils_ignorelist.h +mic_la_SOURCES = mic.c mic_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_MIC_LIBPATH) mic_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_MIC_CPPFLAGS) mic_la_LIBADD = $(BUILD_WITH_MIC_LDADD) @@ -643,8 +634,7 @@ endif if BUILD_PLUGIN_NETAPP pkglib_LTLIBRARIES += netapp.la -netapp_la_SOURCES = netapp.c \ - utils_ignorelist.c utils_ignorelist.h +netapp_la_SOURCES = netapp.c netapp_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBNETAPP_CPPFLAGS) netapp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBNETAPP_LDFLAGS) netapp_la_LIBADD = $(LIBNETAPP_LIBS) @@ -750,8 +740,7 @@ endif if BUILD_PLUGIN_ONEWIRE pkglib_LTLIBRARIES += onewire.la -onewire_la_SOURCES = onewire.c \ - utils_ignorelist.c utils_ignorelist.h +onewire_la_SOURCES = onewire.c onewire_la_CFLAGS = $(AM_CFLAGS) onewire_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBOWCAPI_CPPFLAGS) onewire_la_LIBADD = $(BUILD_WITH_LIBOWCAPI_LIBS) @@ -864,8 +853,7 @@ endif if BUILD_PLUGIN_PROTOCOLS pkglib_LTLIBRARIES += protocols.la -protocols_la_SOURCES = protocols.c \ - utils_ignorelist.c utils_ignorelist.h +protocols_la_SOURCES = protocols.c protocols_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif @@ -903,8 +891,7 @@ endif if BUILD_PLUGIN_SENSORS pkglib_LTLIBRARIES += sensors.la -sensors_la_SOURCES = sensors.c \ - utils_ignorelist.c utils_ignorelist.h +sensors_la_SOURCES = sensors.c sensors_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBSENSORS_CFLAGS) sensors_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBSENSORS_LDFLAGS) sensors_la_LIBADD = -lsensors @@ -927,8 +914,7 @@ endif if BUILD_PLUGIN_SMART if BUILD_WITH_LIBUDEV pkglib_LTLIBRARIES += smart.la -smart_la_SOURCES = smart.c \ - utils_ignorelist.c utils_ignorelist.h +smart_la_SOURCES = smart.c smart_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBATASMART_CPPFLAGS) smart_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBATASMART_LDFLAGS) smart_la_LIBADD = $(BUILD_WITH_LIBATASMART_LIBS) -ludev @@ -1068,8 +1054,7 @@ endif if BUILD_PLUGIN_THERMAL pkglib_LTLIBRARIES += thermal.la -thermal_la_SOURCES = thermal.c \ - utils_ignorelist.c utils_ignorelist.h +thermal_la_SOURCES = thermal.c thermal_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif @@ -1154,8 +1139,7 @@ endif if BUILD_PLUGIN_VIRT pkglib_LTLIBRARIES += virt.la -virt_la_SOURCES = virt.c \ - utils_ignorelist.c utils_ignorelist.h +virt_la_SOURCES = virt.c virt_la_CFLAGS = $(AM_CFLAGS) \ $(BUILD_WITH_LIBVIRT_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS) virt_la_LIBADD = $(BUILD_WITH_LIBVIRT_LIBS) $(BUILD_WITH_LIBXML2_LIBS) diff --git a/src/daemon/Makefile.am b/src/daemon/Makefile.am index 99dc1584..95fb947a 100644 --- a/src/daemon/Makefile.am +++ b/src/daemon/Makefile.am @@ -58,6 +58,7 @@ collectd_SOURCES = collectd.c collectd.h \ plugin.c plugin.h \ utils_cache.c utils_cache.h \ utils_complain.c utils_complain.h \ + utils_ignorelist.c utils_ignorelist.h \ utils_llist.c utils_llist.h \ utils_random.c utils_random.h \ utils_tail_match.c utils_tail_match.h \ diff --git a/src/daemon/utils_ignorelist.c b/src/daemon/utils_ignorelist.c new file mode 100644 index 00000000..7b1c7d25 --- /dev/null +++ b/src/daemon/utils_ignorelist.c @@ -0,0 +1,367 @@ +/** + * collectd - src/utils_ignorelist.c + * Copyright (C) 2006 Lubos Stanek + * Copyright (C) 2008 Florian Forster + * + * This program is free software; you can redistribute it and/ + * or modify it under the terms of the GNU General Public Li- + * cence as published by the Free Software Foundation; either + * version 2 of the Licence, or any later version. + * + * This program is distributed in the hope that it will be use- + * ful, but WITHOUT ANY WARRANTY; without even the implied war- + * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public Licence for more details. + * + * You should have received a copy of the GNU General Public + * Licence along with this program; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, + * USA. + * + * Authors: + * Lubos Stanek + * Florian Forster + **/ +/** + * ignorelist handles plugin's list of configured collectable + * entries with global ignore action + **/ +/** + * Usage: + * + * Define plugin's global pointer variable of type ignorelist_t: + * ignorelist_t *myconfig_ignore; + * If you know the state of the global ignore (IgnoreSelected), + * allocate the variable with: + * myconfig_ignore = ignorelist_create (YourKnownIgnore); + * If you do not know the state of the global ignore, + * initialize the global variable and set the ignore flag later: + * myconfig_ignore = ignorelist_init (); + * Append single entries in your cf_register'ed callback function: + * ignorelist_add (myconfig_ignore, newentry); + * When you hit the IgnoreSelected config option, + * offer it to the list: + * ignorelist_ignore (myconfig_ignore, instantly_got_value_of_ignore); + * That is all for the ignorelist initialization. + * Later during read and write (plugin's registered functions) get + * the information whether this entry would be collected or not: + * if (ignorelist_match (myconfig_ignore, thisentry)) + * return; + **/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "common.h" +#include "plugin.h" +#include "utils_ignorelist.h" + +/* + * private prototypes + */ +struct ignorelist_item_s +{ +#if HAVE_REGEX_H + regex_t *rmatch; /* regular expression entry identification */ +#endif + char *smatch; /* string entry identification */ + struct ignorelist_item_s *next; +}; +typedef struct ignorelist_item_s ignorelist_item_t; + +struct ignorelist_s +{ + int ignore; /* ignore entries */ + ignorelist_item_t *head; /* pointer to the first entry */ +}; + +/* *** *** *** ********************************************* *** *** *** */ +/* *** *** *** *** *** *** private functions *** *** *** *** *** *** */ +/* *** *** *** ********************************************* *** *** *** */ + +static inline void ignorelist_append (ignorelist_t *il, ignorelist_item_t *item) +{ + assert ((il != NULL) && (item != NULL)); + + item->next = il->head; + il->head = item; +} + +#if HAVE_REGEX_H +static int ignorelist_append_regex(ignorelist_t *il, const char *entry) +{ + int rcompile; + regex_t *regtemp; + int errsize; + char *regerr = NULL; + ignorelist_item_t *new; + + /* create buffer */ + if ((regtemp = malloc(sizeof(regex_t))) == NULL) + { + ERROR ("cannot allocate new config entry"); + return (1); + } + memset (regtemp, '\0', sizeof(regex_t)); + + /* compile regex */ + if ((rcompile = regcomp (regtemp, entry, REG_EXTENDED)) != 0) + { + /* prepare message buffer */ + errsize = regerror(rcompile, regtemp, NULL, 0); + if (errsize) + regerr = smalloc(errsize); + /* get error message */ + if (regerror (rcompile, regtemp, regerr, errsize)) + { + fprintf (stderr, "Cannot compile regex %s: %i/%s", + entry, rcompile, regerr); + ERROR ("Cannot compile regex %s: %i/%s", + entry, rcompile, regerr); + } + else + { + fprintf (stderr, "Cannot compile regex %s: %i", + entry, rcompile); + ERROR ("Cannot compile regex %s: %i", + entry, rcompile); + } + + if (errsize) + sfree (regerr); + regfree (regtemp); + sfree (regtemp); + return (1); + } + DEBUG("regex compiled: %s - %i", entry, rcompile); + + /* create new entry */ + if ((new = malloc(sizeof(ignorelist_item_t))) == NULL) + { + ERROR ("cannot allocate new config entry"); + regfree (regtemp); + sfree (regtemp); + return (1); + } + memset (new, '\0', sizeof(ignorelist_item_t)); + new->rmatch = regtemp; + + /* append new entry */ + ignorelist_append (il, new); + + return (0); +} /* int ignorelist_append_regex(ignorelist_t *il, const char *entry) */ +#endif + +static int ignorelist_append_string(ignorelist_t *il, const char *entry) +{ + ignorelist_item_t *new; + + /* create new entry */ + if ((new = malloc(sizeof(ignorelist_item_t))) == NULL ) + { + ERROR ("cannot allocate new entry"); + return (1); + } + memset (new, '\0', sizeof(ignorelist_item_t)); + new->smatch = sstrdup(entry); + + /* append new entry */ + ignorelist_append (il, new); + + return (0); +} /* int ignorelist_append_string(ignorelist_t *il, const char *entry) */ + +#if HAVE_REGEX_H +/* + * check list for entry regex match + * return 1 if found + */ +static int ignorelist_match_regex (ignorelist_item_t *item, const char *entry) +{ + assert ((item != NULL) && (item->rmatch != NULL) + && (entry != NULL) && (strlen (entry) > 0)); + + /* match regex */ + if (regexec (item->rmatch, entry, 0, NULL, 0) == 0) + return (1); + + return (0); +} /* int ignorelist_match_regex (ignorelist_item_t *item, const char *entry) */ +#endif + +/* + * check list for entry string match + * return 1 if found + */ +static int ignorelist_match_string (ignorelist_item_t *item, const char *entry) +{ + assert ((item != NULL) && (item->smatch != NULL) + && (entry != NULL) && (strlen (entry) > 0)); + + if (strcmp (entry, item->smatch) == 0) + return (1); + + return (0); +} /* int ignorelist_match_string (ignorelist_item_t *item, const char *entry) */ + + +/* *** *** *** ******************************************** *** *** *** */ +/* *** *** *** *** *** *** public functions *** *** *** *** *** *** */ +/* *** *** *** ******************************************** *** *** *** */ + +/* + * create the ignorelist_t with known ignore state + * return pointer to ignorelist_t + */ +ignorelist_t *ignorelist_create (int invert) +{ + ignorelist_t *il; + + /* smalloc exits if it failes */ + il = (ignorelist_t *) smalloc (sizeof (ignorelist_t)); + memset (il, '\0', sizeof (ignorelist_t)); + + /* + * ->ignore == 0 => collect + * ->ignore == 1 => ignore + */ + il->ignore = invert ? 0 : 1; + + return (il); +} /* ignorelist_t *ignorelist_create (int ignore) */ + +/* + * free memory used by ignorelist_t + */ +void ignorelist_free (ignorelist_t *il) +{ + ignorelist_item_t *this; + ignorelist_item_t *next; + + if (il == NULL) + return; + + for (this = il->head; this != NULL; this = next) + { + next = this->next; +#if HAVE_REGEX_H + if (this->rmatch != NULL) + { + regfree (this->rmatch); + sfree (this->rmatch); + this->rmatch = NULL; + } +#endif + if (this->smatch != NULL) + { + sfree (this->smatch); + this->smatch = NULL; + } + sfree (this); + } + + sfree (il); + il = NULL; +} /* void ignorelist_destroy (ignorelist_t *il) */ + +/* + * set ignore state of the ignorelist_t + */ +void ignorelist_set_invert (ignorelist_t *il, int invert) +{ + if (il == NULL) + { + DEBUG("ignore call with ignorelist_t == NULL"); + return; + } + + il->ignore = invert ? 0 : 1; +} /* void ignorelist_set_invert (ignorelist_t *il, int ignore) */ + +/* + * append entry into ignorelist_t + * return 1 for success + */ +int ignorelist_add (ignorelist_t *il, const char *entry) +{ + int ret; + size_t entry_len; + + if (il == NULL) + { + DEBUG ("add called with ignorelist_t == NULL"); + return (1); + } + + entry_len = strlen (entry); + + /* append nothing */ + if (entry_len == 0) + { + DEBUG("not appending: empty entry"); + return (1); + } + +#if HAVE_REGEX_H + /* regex string is enclosed in "/.../" */ + if ((entry_len > 2) && (entry[0] == '/') && entry[entry_len - 1] == '/') + { + char *entry_copy; + size_t entry_copy_size; + + /* We need to copy `entry' since it's const */ + entry_copy_size = entry_len - 1; + entry_copy = smalloc (entry_copy_size); + sstrncpy (entry_copy, entry + 1, entry_copy_size); + + DEBUG("I'm about to add regex entry: %s", entry_copy); + ret = ignorelist_append_regex(il, entry_copy); + sfree (entry_copy); + } + else +#endif + { + DEBUG("to add entry: %s", entry); + ret = ignorelist_append_string(il, entry); + } + + return (ret); +} /* int ignorelist_add (ignorelist_t *il, const char *entry) */ + +/* + * check list for entry + * return 1 for ignored entry + */ +int ignorelist_match (ignorelist_t *il, const char *entry) +{ + ignorelist_item_t *traverse; + + /* if no entries, collect all */ + if ((il == NULL) || (il->head == NULL)) + return (0); + + if ((entry == NULL) || (strlen (entry) == 0)) + return (0); + + /* traverse list and check entries */ + for (traverse = il->head; traverse != NULL; traverse = traverse->next) + { +#if HAVE_REGEX_H + if (traverse->rmatch != NULL) + { + if (ignorelist_match_regex (traverse, entry)) + return (il->ignore); + } + else +#endif + { + if (ignorelist_match_string (traverse, entry)) + return (il->ignore); + } + } /* for traverse */ + + return (1 - il->ignore); +} /* int ignorelist_match (ignorelist_t *il, const char *entry) */ + diff --git a/src/daemon/utils_ignorelist.h b/src/daemon/utils_ignorelist.h new file mode 100644 index 00000000..b47b55ad --- /dev/null +++ b/src/daemon/utils_ignorelist.h @@ -0,0 +1,70 @@ +/** + * collectd - src/utils_ignorelist.h + * Copyright (C) 2006 Lubos Stanek + * + * This program is free software; you can redistribute it and/ + * or modify it under the terms of the GNU General Public Li- + * cence as published by the Free Software Foundation; either + * version 2 of the Licence, or any later version. + * + * This program is distributed in the hope that it will be use- + * ful, but WITHOUT ANY WARRANTY; without even the implied war- + * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public Licence for more details. + * + * You should have received a copy of the GNU General Public + * Licence along with this program; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, + * USA. + * + * Authors: + * Lubos Stanek + **/ +/** + * ignorelist handles plugin's list of configured collectable + * entries with global ignore action + **/ + +#ifndef UTILS_IGNORELIST_H +#define UTILS_IGNORELIST_H 1 + +#include "collectd.h" + +#if HAVE_REGEX_H +# include +#endif + +/* public prototypes */ + +struct ignorelist_s; +typedef struct ignorelist_s ignorelist_t; + +/* + * create the ignorelist_t with known ignore state + * return pointer to ignorelist_t + */ +ignorelist_t *ignorelist_create (int invert); + +/* + * free memory used by ignorelist_t + */ +void ignorelist_free (ignorelist_t *il); + +/* + * set ignore state of the ignorelist_t + */ +void ignorelist_set_invert (ignorelist_t *il, int invert); + +/* + * append entry to ignorelist_t + * returns zero on success, non-zero upon failure. + */ +int ignorelist_add (ignorelist_t *il, const char *entry); + +/* + * check list for entry + * return 1 for ignored entry + */ +int ignorelist_match (ignorelist_t *il, const char *entry); + +#endif /* UTILS_IGNORELIST_H */ diff --git a/src/utils_ignorelist.c b/src/utils_ignorelist.c deleted file mode 100644 index 7b1c7d25..00000000 --- a/src/utils_ignorelist.c +++ /dev/null @@ -1,367 +0,0 @@ -/** - * collectd - src/utils_ignorelist.c - * Copyright (C) 2006 Lubos Stanek - * Copyright (C) 2008 Florian Forster - * - * This program is free software; you can redistribute it and/ - * or modify it under the terms of the GNU General Public Li- - * cence as published by the Free Software Foundation; either - * version 2 of the Licence, or any later version. - * - * This program is distributed in the hope that it will be use- - * ful, but WITHOUT ANY WARRANTY; without even the implied war- - * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public Licence for more details. - * - * You should have received a copy of the GNU General Public - * Licence along with this program; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, - * USA. - * - * Authors: - * Lubos Stanek - * Florian Forster - **/ -/** - * ignorelist handles plugin's list of configured collectable - * entries with global ignore action - **/ -/** - * Usage: - * - * Define plugin's global pointer variable of type ignorelist_t: - * ignorelist_t *myconfig_ignore; - * If you know the state of the global ignore (IgnoreSelected), - * allocate the variable with: - * myconfig_ignore = ignorelist_create (YourKnownIgnore); - * If you do not know the state of the global ignore, - * initialize the global variable and set the ignore flag later: - * myconfig_ignore = ignorelist_init (); - * Append single entries in your cf_register'ed callback function: - * ignorelist_add (myconfig_ignore, newentry); - * When you hit the IgnoreSelected config option, - * offer it to the list: - * ignorelist_ignore (myconfig_ignore, instantly_got_value_of_ignore); - * That is all for the ignorelist initialization. - * Later during read and write (plugin's registered functions) get - * the information whether this entry would be collected or not: - * if (ignorelist_match (myconfig_ignore, thisentry)) - * return; - **/ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include "common.h" -#include "plugin.h" -#include "utils_ignorelist.h" - -/* - * private prototypes - */ -struct ignorelist_item_s -{ -#if HAVE_REGEX_H - regex_t *rmatch; /* regular expression entry identification */ -#endif - char *smatch; /* string entry identification */ - struct ignorelist_item_s *next; -}; -typedef struct ignorelist_item_s ignorelist_item_t; - -struct ignorelist_s -{ - int ignore; /* ignore entries */ - ignorelist_item_t *head; /* pointer to the first entry */ -}; - -/* *** *** *** ********************************************* *** *** *** */ -/* *** *** *** *** *** *** private functions *** *** *** *** *** *** */ -/* *** *** *** ********************************************* *** *** *** */ - -static inline void ignorelist_append (ignorelist_t *il, ignorelist_item_t *item) -{ - assert ((il != NULL) && (item != NULL)); - - item->next = il->head; - il->head = item; -} - -#if HAVE_REGEX_H -static int ignorelist_append_regex(ignorelist_t *il, const char *entry) -{ - int rcompile; - regex_t *regtemp; - int errsize; - char *regerr = NULL; - ignorelist_item_t *new; - - /* create buffer */ - if ((regtemp = malloc(sizeof(regex_t))) == NULL) - { - ERROR ("cannot allocate new config entry"); - return (1); - } - memset (regtemp, '\0', sizeof(regex_t)); - - /* compile regex */ - if ((rcompile = regcomp (regtemp, entry, REG_EXTENDED)) != 0) - { - /* prepare message buffer */ - errsize = regerror(rcompile, regtemp, NULL, 0); - if (errsize) - regerr = smalloc(errsize); - /* get error message */ - if (regerror (rcompile, regtemp, regerr, errsize)) - { - fprintf (stderr, "Cannot compile regex %s: %i/%s", - entry, rcompile, regerr); - ERROR ("Cannot compile regex %s: %i/%s", - entry, rcompile, regerr); - } - else - { - fprintf (stderr, "Cannot compile regex %s: %i", - entry, rcompile); - ERROR ("Cannot compile regex %s: %i", - entry, rcompile); - } - - if (errsize) - sfree (regerr); - regfree (regtemp); - sfree (regtemp); - return (1); - } - DEBUG("regex compiled: %s - %i", entry, rcompile); - - /* create new entry */ - if ((new = malloc(sizeof(ignorelist_item_t))) == NULL) - { - ERROR ("cannot allocate new config entry"); - regfree (regtemp); - sfree (regtemp); - return (1); - } - memset (new, '\0', sizeof(ignorelist_item_t)); - new->rmatch = regtemp; - - /* append new entry */ - ignorelist_append (il, new); - - return (0); -} /* int ignorelist_append_regex(ignorelist_t *il, const char *entry) */ -#endif - -static int ignorelist_append_string(ignorelist_t *il, const char *entry) -{ - ignorelist_item_t *new; - - /* create new entry */ - if ((new = malloc(sizeof(ignorelist_item_t))) == NULL ) - { - ERROR ("cannot allocate new entry"); - return (1); - } - memset (new, '\0', sizeof(ignorelist_item_t)); - new->smatch = sstrdup(entry); - - /* append new entry */ - ignorelist_append (il, new); - - return (0); -} /* int ignorelist_append_string(ignorelist_t *il, const char *entry) */ - -#if HAVE_REGEX_H -/* - * check list for entry regex match - * return 1 if found - */ -static int ignorelist_match_regex (ignorelist_item_t *item, const char *entry) -{ - assert ((item != NULL) && (item->rmatch != NULL) - && (entry != NULL) && (strlen (entry) > 0)); - - /* match regex */ - if (regexec (item->rmatch, entry, 0, NULL, 0) == 0) - return (1); - - return (0); -} /* int ignorelist_match_regex (ignorelist_item_t *item, const char *entry) */ -#endif - -/* - * check list for entry string match - * return 1 if found - */ -static int ignorelist_match_string (ignorelist_item_t *item, const char *entry) -{ - assert ((item != NULL) && (item->smatch != NULL) - && (entry != NULL) && (strlen (entry) > 0)); - - if (strcmp (entry, item->smatch) == 0) - return (1); - - return (0); -} /* int ignorelist_match_string (ignorelist_item_t *item, const char *entry) */ - - -/* *** *** *** ******************************************** *** *** *** */ -/* *** *** *** *** *** *** public functions *** *** *** *** *** *** */ -/* *** *** *** ******************************************** *** *** *** */ - -/* - * create the ignorelist_t with known ignore state - * return pointer to ignorelist_t - */ -ignorelist_t *ignorelist_create (int invert) -{ - ignorelist_t *il; - - /* smalloc exits if it failes */ - il = (ignorelist_t *) smalloc (sizeof (ignorelist_t)); - memset (il, '\0', sizeof (ignorelist_t)); - - /* - * ->ignore == 0 => collect - * ->ignore == 1 => ignore - */ - il->ignore = invert ? 0 : 1; - - return (il); -} /* ignorelist_t *ignorelist_create (int ignore) */ - -/* - * free memory used by ignorelist_t - */ -void ignorelist_free (ignorelist_t *il) -{ - ignorelist_item_t *this; - ignorelist_item_t *next; - - if (il == NULL) - return; - - for (this = il->head; this != NULL; this = next) - { - next = this->next; -#if HAVE_REGEX_H - if (this->rmatch != NULL) - { - regfree (this->rmatch); - sfree (this->rmatch); - this->rmatch = NULL; - } -#endif - if (this->smatch != NULL) - { - sfree (this->smatch); - this->smatch = NULL; - } - sfree (this); - } - - sfree (il); - il = NULL; -} /* void ignorelist_destroy (ignorelist_t *il) */ - -/* - * set ignore state of the ignorelist_t - */ -void ignorelist_set_invert (ignorelist_t *il, int invert) -{ - if (il == NULL) - { - DEBUG("ignore call with ignorelist_t == NULL"); - return; - } - - il->ignore = invert ? 0 : 1; -} /* void ignorelist_set_invert (ignorelist_t *il, int ignore) */ - -/* - * append entry into ignorelist_t - * return 1 for success - */ -int ignorelist_add (ignorelist_t *il, const char *entry) -{ - int ret; - size_t entry_len; - - if (il == NULL) - { - DEBUG ("add called with ignorelist_t == NULL"); - return (1); - } - - entry_len = strlen (entry); - - /* append nothing */ - if (entry_len == 0) - { - DEBUG("not appending: empty entry"); - return (1); - } - -#if HAVE_REGEX_H - /* regex string is enclosed in "/.../" */ - if ((entry_len > 2) && (entry[0] == '/') && entry[entry_len - 1] == '/') - { - char *entry_copy; - size_t entry_copy_size; - - /* We need to copy `entry' since it's const */ - entry_copy_size = entry_len - 1; - entry_copy = smalloc (entry_copy_size); - sstrncpy (entry_copy, entry + 1, entry_copy_size); - - DEBUG("I'm about to add regex entry: %s", entry_copy); - ret = ignorelist_append_regex(il, entry_copy); - sfree (entry_copy); - } - else -#endif - { - DEBUG("to add entry: %s", entry); - ret = ignorelist_append_string(il, entry); - } - - return (ret); -} /* int ignorelist_add (ignorelist_t *il, const char *entry) */ - -/* - * check list for entry - * return 1 for ignored entry - */ -int ignorelist_match (ignorelist_t *il, const char *entry) -{ - ignorelist_item_t *traverse; - - /* if no entries, collect all */ - if ((il == NULL) || (il->head == NULL)) - return (0); - - if ((entry == NULL) || (strlen (entry) == 0)) - return (0); - - /* traverse list and check entries */ - for (traverse = il->head; traverse != NULL; traverse = traverse->next) - { -#if HAVE_REGEX_H - if (traverse->rmatch != NULL) - { - if (ignorelist_match_regex (traverse, entry)) - return (il->ignore); - } - else -#endif - { - if (ignorelist_match_string (traverse, entry)) - return (il->ignore); - } - } /* for traverse */ - - return (1 - il->ignore); -} /* int ignorelist_match (ignorelist_t *il, const char *entry) */ - diff --git a/src/utils_ignorelist.h b/src/utils_ignorelist.h deleted file mode 100644 index b47b55ad..00000000 --- a/src/utils_ignorelist.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * collectd - src/utils_ignorelist.h - * Copyright (C) 2006 Lubos Stanek - * - * This program is free software; you can redistribute it and/ - * or modify it under the terms of the GNU General Public Li- - * cence as published by the Free Software Foundation; either - * version 2 of the Licence, or any later version. - * - * This program is distributed in the hope that it will be use- - * ful, but WITHOUT ANY WARRANTY; without even the implied war- - * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public Licence for more details. - * - * You should have received a copy of the GNU General Public - * Licence along with this program; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, - * USA. - * - * Authors: - * Lubos Stanek - **/ -/** - * ignorelist handles plugin's list of configured collectable - * entries with global ignore action - **/ - -#ifndef UTILS_IGNORELIST_H -#define UTILS_IGNORELIST_H 1 - -#include "collectd.h" - -#if HAVE_REGEX_H -# include -#endif - -/* public prototypes */ - -struct ignorelist_s; -typedef struct ignorelist_s ignorelist_t; - -/* - * create the ignorelist_t with known ignore state - * return pointer to ignorelist_t - */ -ignorelist_t *ignorelist_create (int invert); - -/* - * free memory used by ignorelist_t - */ -void ignorelist_free (ignorelist_t *il); - -/* - * set ignore state of the ignorelist_t - */ -void ignorelist_set_invert (ignorelist_t *il, int invert); - -/* - * append entry to ignorelist_t - * returns zero on success, non-zero upon failure. - */ -int ignorelist_add (ignorelist_t *il, const char *entry); - -/* - * check list for entry - * return 1 for ignored entry - */ -int ignorelist_match (ignorelist_t *il, const char *entry); - -#endif /* UTILS_IGNORELIST_H */